ruby-on-railsnginxpassengermonitgod

How can I keep a Passenger Standalone up even after a restart?


I have a few apps running rails 3 on ruby 1.9.2 and deployed on a Ubuntu 10.04 LTS machine using nginx + passenger. Now, I need to add a new app that runs on ruby 1.8.7 (REE) and Rails 2. I accomplished to do that with RVM, Passenger Standalone and a reverse proxy.

The problem is that, every time I have to restart the server (to install security updates for example), I have to start Passenger Standalone manually.

Is there a way to start it automatically? I was told to use Monit or God, but I couldn't be able to write a proper recipe that works with Passenger Standalone. I also had a few problems with God and RVM, so if you have a solution that doesn't use God, or if you know how to configure God/Rvm properly, it's even better.


Solution

  • Here is what I got working. Using Upstart (Ubuntu 10.04) to start the passenger daemon

    My environment uses rvm with ruby 1.9.2 and apache and my rails app is deployed via capistrano

    # Upstart: /etc/init/service_name.conf
    description "start passenger stand-alone"
    author "Me <me@myself.am>"
    
    # Stanzas
    #
    # Stanzas control when and how a process is started and stopped
    # See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
    
    # When to start the service
    start on started mysql
    
    # When to stop the service
    stop on runlevel [016]
    
    # Automatically restart process if crashed
    respawn
    
    # Essentially lets upstart know the process will detach itself to the background
    expect fork
    
    # Run before process
    pre-start script
    end script
    
    # Start the process
    script
            cd /var/path/to/app/staging/current
            sh HOME=/home/deploy /usr/local/rvm/gems/ruby-1.9.2-p136@appname/gems/passenger-3.0.7/bin/passenger start --user 'deploy' -p '5000' -a '127.0.0.1' -e 'production'
    end script
    

    and the apache config:

    <VirtualHost *:80>
        ServerName myapp.com
    
        PassengerEnabled off
    
                    <Proxy *>
                            Order deny,allow
                            Allow from all
                    </Proxy>
    
        ProxyPass / http://127.0.0.1:5000/
        ProxyPassReverse / http://127.0.0.1:5000/
    
    </VirtualHost>
    

    Upstart doesn't set ENV['HOME'] which passenger relies on, so we have to pass that when executing the passenger command. Other than that its pretty straight forward.

    A note for debugging: https://serverfault.com/questions/114052/logging-a-daemons-output-with-upstart (append something like >> /tmp/upstart.log 2>&1 to the second line in the script block)

    Hope this helps.