So you’ve got a fresh new Rails app to deploy and you’re wondering which Ruby app server to use.
The old school way : a bunch of single process workers monitored (by Monit or God) and reverse proxied by (usually) Nginx. A little old-fashioned because it needs a serious monitoring configuration in order to deal with memory bloats, long actions, deployments, load balancing…
The simple way : Phusion Passenger (aka mod_rails). If you’re sticked with PHP apps on your server, or basically if you prefer Apache, this is the best solution : like adding “PassengerEnabled On” into your virtual host declaration. It works out of the box without having to deal with worker pools.
My personal preference goes to the Nginx version of Passenger. Nginx is a memory-saving, stable and fast web server. The install is dead simple if you let Passenger compile itself a fresh new Nginx instance. You got the best of both worlds : performance (Nginx) and simplicity (Passenger).
I’m looking forward to Passenger 3, teased by some of Ninh Bui’s tweets : awesomeness and performances… Can’t wait!
An alternative, fresh but unproven server : WebROaR is an all-in-one web+app server introduced as the most performant solution by the authors (“5 to 55% faster than other deployment stacks“). I feel a mistrust from the Rails community, maybe because it was released in the middle nowhere, but you should have a look at it.
Unicorn is a fast server for Rack-based applications, based on Mongrel and strongly inspired by the Unix philosophy : do one thing but do it well. It needs to rely on a buffered reverse proxy (Nginx) to deal with slow requests. Used by the Github folks as described here.
JRuby highlights enterprise perspectives : you can now deploy your Rails app on JEE app servers such as Glassfish.
In short, for general purposes my preference goes to Passenger for Nginx. Easy install, small footprint, fair performance : don’t need more. I would consider using Unicorn for high performance context.