I had heard of mod_rails awhile back but never had the time to take a closer look at it. While setting up a new rails app, I was getting frustrated with all of the configuration I needed to do to get the mongrel clusters and proxy balancers setup. So I decided to give passenger a chance. I’m a fan now 🙂
The process was dead simple.
- Install the passenger gem
sudo gem install passenger
- Install passenger as an Apache module
passenger-install-apache2-module
- Load the passenger apache module by editing the Apache config
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5
PassengerRuby /usr/bin/ruby1.8
- Restart Apache
If all things went well, you have everything installed you need. If there were some missing dependencies, you should be presented with how to install those dependencies.
In the installation output, it tells you how to mod_railsify your apps by creating a vhost as such:
<VirtualHost *:80>
ServerName www.mywebsite.com
DocumentRoot /home/deploy/mywebsite/public
</VirtualHost>
That’s it! No more of this proxy balancer and mongrel_cluster.yml configuration.
There’s some magic going on in the background. As requests come in, passenger will spin up more application instances. For more tweaking your configuration options check out the user guide.
Go to your website and you should see your rails app up and running.
So now we have your app up and running, how do we update or restart our app? Passenger provides two ways for us to do this.
The first is whenever apache is restarted, your application is restarted.
The second way allows us to restart a specified application without affecting Apache. Whenever passenger detects tmp/restart.txt
, it will restart the application instances for us. We can integrate this into our Capistrano deploy flow by adding the following our config/deploy.rb
namespace :passenger do
desc "Restart Application"
task :restart do
run "touch #{current_path}/tmp/restart.txt"
end
end
after :deploy, "passenger:restart"
This will create that restart.txt after the cap:deploy task gets executed, causing the application to restart.
Finally, passenger comes with some pretty useful utilities.
Check out passenger-status
which produces output showing current passenger server statuses.
Sample output:
----------- General information -----------
max = 6
count = 1
active = 0
inactive = 1
Using global queue: no
Waiting on global queue: 0
----------- Applications -----------
/home/deploy/www.myapp.com/releases/20081206183156:
PID: 30784 Sessions: 0
Another utility passenger-memory-status
gives you insight into how much memory is being used by apache and passenger.
Sample output:
-------------- Apache processes ---------------
PID PPID Threads VMSize Private Name
-----------------------------------------------
12841 1 1 225.9 MB 0.0 MB /usr/sbin/apache2 -k start
28294 12841 1 248.4 MB 21.4 MB /usr/sbin/apache2 -k start
28300 12841 1 243.7 MB 0.5 MB /usr/sbin/apache2 -k start
28306 12841 1 248.4 MB 4.4 MB /usr/sbin/apache2 -k start
28357 12841 1 249.1 MB 19.8 MB /usr/sbin/apache2 -k start
29400 12841 1 249.4 MB 3.7 MB /usr/sbin/apache2 -k start
29788 12841 1 249.3 MB 21.7 MB /usr/sbin/apache2 -k start
29834 12841 1 245.8 MB 18.9 MB /usr/sbin/apache2 -k start
29836 12841 1 245.8 MB 9.3 MB /usr/sbin/apache2 -k start
29868 12841 1 245.8 MB 2.4 MB /usr/sbin/apache2 -k start
29870 12841 1 246.5 MB 5.2 MB /usr/sbin/apache2 -k start
### Processes: 11
### Total private dirty RSS: 107.44 MB
--------- Passenger processes ----------
PID Threads VMSize Private Name
----------------------------------------
28031 10 15.3 MB 0.1 MB /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/ext/apache2/ApplicationPoolServerExecutable 0 /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/bin/passenger-spawn-server /usr/bin/ruby1.8 /tmp/passenger_status.12841.fifo
28032 2 48.7 MB 0.6 MB Passenger spawn server
29161 1 114.8 MB 0.7 MB Passenger FrameworkSpawner: 2.1.2
30461 1 122.8 MB 32.3 MB Passenger ApplicationSpawner: /home/deploy/www.myapp.com/releases/20081206183156
30784 1 129.3 MB 33.4 MB Rails: /home/deploy/www.myapp.com/releases/20081206183156
### Processes: 5
### Total private dirty RSS: 67.08 MB
Pretty sweet.