About Passenger¶
Passenger, aka mod_rails, is the easiest and fastest way to run rails applications. In most cases, it requires zero configuration: if passenger detects that a docroot is the public folder of a rails application, it will try to spawn the rails application as the user who owns environment.rb.
Passenger then keeps a pool of processes for the rails application, creating new one when needed and removing ones that have not been used in a while. The default timeout is 300 seconds, which is pretty short for a site that gets very little traffic. It means that there will be a slow response to view the website for the first time if all the processes have been shut down.
You can increase the timeout with PassengerPoolIdleTime
Prepare the system¶
On a Debian system, the package libapache2-mod-passenger provides mod_rails and is available in Squeeze. You can also install it on a Lenny (stable) system by using Backports.org. If you install libapache2-mod-passenger via apt/aptitude, you do not need to do the below gem/build process, you can also skip the next section “Install passenger” and go right to “Deploying to a virtual host’s root”.
# apt-get install rubygems mysql-server ruby libmysql-ruby rdoc1.8 ri1.8 apache2-mpm-prefork ruby1.8-dev build-essential apache2-prefork-dev libopenssl-ruby1.8
# gem install rails --no-ri --no-rdoc
# gem install passenger --no-ri --no-rdoc
mod_rails may work with apache2-mpm-worker, but is only currently tested to work with apache2-mpm-prefork.
Passenger gem includes many executables. On debian, using the default rubygems package, they will be installed in /var/lib/gems/1.8/bin.
One silly way to make them easy to execute:
ln -s /var/lib/gems/1.8/bin/* /usr/local/bin
Although this should not be necessary with newer versions.
Install passenger¶
# /var/lib/gems/1.8/bin/passenger-install-apache2-module
If you get an error message about undefined method `require_gem', then edit passenger-install-apache2-module and replace require_gem with simply gem.
Make apache load passenger_module:
codetitle. /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.1
PassengerRuby /usr/bin/ruby1.8
(or whatever code the passenger-install script tells you you need to added to apache. If you use the debian package for rubygems, the paths will be /var/lib/gems/1.8/… but if you installed rubygems then the path will be /usr/lib/ruby/gems/1.8/…)
enable passenger.load in mods-enabled:
bc. # a2enmod passenger
Deploying to a virtual host’s root¶
(from http://www.modrails.com/documentation/Users%20guide.html#_deploying_a_ruby_on_rails_app
Add a virtual host entry to your Apache configuration file. The virtual host’s document root must point to your Ruby on Rails application’s public folder. For example:
<VirtualHost *:80>
    ServerName myrailsapp.org
    DocumentRoot /usr/apps/myrailsapp/public
</VirtualHost>
Then restart Apache. The application has now been deployed.
NOTE: if you have a public/.htaccess file in your rails application, get rid of it! mod_rails doesn’t work with it, and it is not needed with mod_rails.
Deploying to a sub URI¶
(from http://www.modrails.com/documentation/Users%20guide.html#_deploying_a_ruby_on_rails_app
Suppose that you already have a virtual host:
<VirtualHost *:80>
    ServerName domain.org
    DocumentRoot /var/www
</VirtualHost>
And you want your Ruby on Rails application to be accessible from the URL domain.org/railsapp
To do this, make a symlink from your Ruby on Rails application’s public folder to a directory in the document root. For example:
$ ln -s /usr/app/myrailsapp/public /var/www/railsapp
Next, add a RailsBaseURI option to the virtual host configuration:
<VirtualHost *:80>
    ServerName domain.org
    DocumentRoot /var/www
    RailsBaseURI /railsapp
</VirtualHost>
Then restart Apache. The application has now been deployed. Add additional RailsBaseURI lines for additional rails applications.
Restarting mod_rails processes¶
- To restart a single process, you can just kill it. New ones will spawn.
 - To restart all the mod_rails processes, you can create an empty file 
RAILS_ROOT/tmp/restart.txt. For example:
touch /usr/apps/crabgrass/tmp/restart.txt - You can also just restart apache.
 
Here is code to make capistrano restart after a deploy:
namespace :passenger do
  desc "Restart rails application"
  task :restart do
    run "touch #{current_path}/tmp/restart.txt"
  end
  # requires root
  desc "Check memory stats"
  task :memory do
    sudo "passenger-memory-stats"
  end
  # requires root
  desc "Check status of rails processes"
  task :status do
    sudo "passenger-status"
  end
end
after :deploy, "passenger:restart"
Getting information¶
Passenger comes with some handy commands to query the status of running rails applications:
passenger-status
return general info on how many active processes you have going:
----------- General information -----------
max      = 6
count    = 1
active   = 0
inactive = 1
----------- Applications -----------
/usr/apps/crabgrass/releases/20080603023407: 
  PID: 19487     Sessions: 0
passenger-memory-stats 
-------------- Apache processes --------------
PID    PPID   Threads  VMSize   Private  Name
----------------------------------------------
19458  1      1        12.2 MB  0.4 MB   /usr/sbin/apache2 -k start
19464  19458  1        12.5 MB  0.5 MB   /usr/sbin/apache2 -k start
19465  19458  1        12.4 MB  0.2 MB   /usr/sbin/apache2 -k start
19466  19458  1        12.4 MB  0.2 MB   /usr/sbin/apache2 -k start
19467  19458  1        12.4 MB  0.3 MB   /usr/sbin/apache2 -k start
19468  19458  1        12.4 MB  0.2 MB   /usr/sbin/apache2 -k start
19477  19458  1        12.4 MB  0.2 MB   /usr/sbin/apache2 -k start
### Processes: 7
### Total private dirty RSS: 2.04 MB
--------- Passenger processes ---------
PID    Threads  VMSize   Private  Name
---------------------------------------
19461  9        3.9 MB   0.2 MB   /usr/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/ApplicationPoolServerExecutable 0 /usr/lib/ruby/gems/1.8/gems/passenger-2.0.1/bin/passenger-spawn-server  /usr/bin/ruby1.8  /tmp/passenger_status.19458.fifo
19469  2        16.2 MB  5.4 MB   Passenger spawn server
19480  1        32.1 MB  18.7 MB  Passenger FrameworkSpawner: 2.0.2
19483  1        52.6 MB  27.4 MB  Passenger ApplicationSpawner: /usr/apps/crabgrass/releases/20080603023407
19487  1        57.7 MB  32.5 MB  Rails: /usr/apps/crabgrass/releases/20080603023407
### Processes: 5
### Total private dirty RSS: 84.24 MB