= Running RubyOnRails apps on uWSGI >=0.9.7-dev (stable from 0.9.9) =
Starting from version 0.9.7-dev a Rack/ruby/rails plugin is officially available.
The official modifier is 7, so remember to set it in your webserver configuration
Ruby 1.8 and ruby 1.9 are supported.
You can build it embedded in the uWSGI core or as a plugin.
== Embedding in the uWSGI core ==
In the buildconf directory there is already a rack.ini config that will build a uWSGI
server with a ruby interpreter embedded.
(obviously you need the ruby headers)
{{{
python uwsgiconfig.py --build rack
}}}
Now your uwsgi binary can run rails app.
=== Typo and nginx ===
Install the typo gem and create a new instance
{{{
sudo gem install typo
typo install /tmp/mytypo
}}}
Now run the uwsgi server with the process manager, 4 workers, memory report and post buffering (this is needed by Rack specification):
{{{
./uwsgi -s :3031 -M -p 4 -m --rails /tmp/mytypo --post-buffering 4096 --env RAILS_ENV=production
}}}
or use an xml file (we will call it typo.xml)
{{{
#!xml
:3031
4
/tmp/mytypo
4096
RAILS_ENV=production
}}}
{{{
./uwsgi -x typo.xml
}}}
or a .ini one ( typo.ini )
{{{
#!ini
[uwsgi]
socket = :3031
master = true
processes = 4
rails = /tmp/mytypo
post-buffering = 4096
env = RAILS_ENV=production
}}}
{{{
./uwsgi --ini typo.ini
}}}
Now configure nginx location
{{{
location / {
root "/tmp/mytypo/public";
include "uwsgi_params";
uwsgi_modifier1 7;
if (!-f $request_filename) {
uwsgi_pass 127.0.0.1:3031;
}
}
}}}
Go to your browser and you should see you new shining typo instance running
=== Radiant and apache2 ===
Install the radiant gem and create a new radiant instance
{{{
sudo gem install radiant
radiant /tmp/myradiant
cd /tmp/myradiant
}}}
edit your config/database.yml then fill it
{{{
rake production db:bootstrap
}}}
now run uwsgi server
{{{
./uwsgi -s :3031 -M -p 2 -m --rails /tmp/myradiant --post-buffering 4096 --env RAILS_ENV=production
}}}
and finally the apache configuration.
This time we will map static file hardcoded in apache configuration (instead of checking for file existance
at every request)
{{{
DocumentRoot /tmp/myradiant/public
Allow from all
uWSGISocket 127.0.0.1:3032
SetHandler uwsgi-handler
uWSGIForceScriptName /
uWSGImodifier1 7
SetHandler default-handler
SetHandler default-handler
SetHandler default-handler
}}}
== !Rack/Rails support as a plugin ==
A rackp.ini file is included in the buildconf directory.
This will build the uWSGI core and the rack plugin as a shared library
{{{
python uwsgiconfig --build rackp
}}}
Now you can follow the same rules of the embedded one, but you must remember to load the plugin.
It is simple as adding the '--plugins rack' as the first option (it is not real necessary, the general rule is that
a plugin must be loaded before specifying a related option)
{{{
./uwsgi --plugins rack -s :3031 -M -p 4 -m --rails /tmp/mytypo --post-buffering 4096 --env RAILS_ENV=production
}}}
or
{{{
#!ini
[uwsgi]
plugins = rack
socket = :3031
master = true
processes = 4
rails = /tmp/mytypo
post-buffering = 4096
env = RAILS_ENV=production
}}}
= Status and notes =
By default the memory management of this plugin is very aggressive (as Ruby is a real memory devourer).
After every request the GC is called. This can hurt a bit if your app create a lot of objects at every request.
You can set the frequency at wich GC run using the --ruby-gc-freq option. There is no a one-fit-for-all value
so experiment a bit.
If your apps leaks memory without control, consider limiting the number of requests a worker can manage before being restarted
(you can use the --max-requests options). Using the --limit-as can be a good choice too.
A bunch of uWSGI standard feature are missing in the plugin:
udp request management
SharedArea (already working on it)
QueueFramework
see [wiki:rubyDSL rubyDSL] for list of currently supported features
= A special note on threading =
Adding threading support in ruby 1.8 is out of discussion. Thread support in this versions
is pratically useless in a server like uWSGI. Ruby 1.9 has a threading mode very similar to the Python one,
so adding it will be very simple (and super fast). Expect an update soon.
= Ruby 1.9 Fiber =
Fibers are a new feature of ruby 1.9. They are an implementation of coroutine/green-thread/stop-resume (or whatever you want to call
those funny technlogies). See [wiki:FiberLoop Fiber]
= SSL =
For nginx you can use the following options to pass along the protocol used:
If serving a rails 2.x application over SSL:
{{{
uwsgi_param HTTPS on;
}}}
Or for a rails 3.x application:
{{{
uwsgi_param UWSGI_SCHEME https;
}}}
= Post scriptum =
You may wish to look at this [wiki:Rack Rack]