Как я могу поддерживать автономную работу пассажира даже после перезагрузки?

У меня есть несколько приложений, работающих на rails 3 на ruby ​​1.9.2 и развернутых на машине Ubuntu 10.04 LTS с использованием nginx + passenger. Теперь мне нужно добавить новое приложение, которое работает на ruby ​​1.8.7 (REE) и Rails 2. Я сделал это с помощью RVM, Passenger Standalone и обратного прокси-сервера.

Проблема в том, что каждый раз, когда мне приходится перезагружать сервер (например, для установки обновлений безопасности), мне приходится вручную запускать автономный пассажир.

Есть ли способ запустить его автоматически? Мне сказали использовать Monit или God, но я не смог написать правильный рецепт, который работает с Passenger Standalone. У меня также было несколько проблем с Богом и RVM, так что если у вас есть решение, которое не использует Бога, или если вы знаете, как правильно настроить God/Rvm, это еще лучше.

4 ответа

Решение

Вот что у меня получилось. Использование Upstart (Ubuntu 10.04) для запуска демона пассажира

Моя среда использует rvm с ruby ​​1.9.2 и apache, и мое приложение rails развертывается через 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

и конфиг apache:

<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 не устанавливает ENV['HOME'], на которого полагается пассажир, поэтому мы должны передать это при выполнении команды пассажира. В остальном это довольно просто.

Примечание для отладки: https://serverfault.com/questions/114052/logging-a-daemons-output-with-upstart (добавить что-то вроде >> /tmp/upstart.log 2>&1 до второй строки в блоке скрипта)

Надеюсь это поможет.

Я бы предложил написать сценарий оболочки, который может успешно запустить его, а затем использовать его в рецепте Monit или God, если вы все еще хотите их использовать, или в сценарии инициализации, если нет.

Вы не упоминаете, на какой ОС работает ваш сервер, но если это последняя версия Ubuntu, вы можете довольно легко написать скрипт Upstart. Он встроен и имеет важную особенность Monit/God - поддержание работы вашего демона даже при перезапуске.

Я использую Gem Eye - https://github.com/kostya/eye

BUNDLE = 'bundle'
RAILS_ENV = 'production'
ROOT = File.expand_path(File.dirname(__FILE__))

Eye.config do
  logger "#{ROOT}/log/eye.log"
end

Eye.application :app do
  env 'RAILS_ENV' => RAILS_ENV
  working_dir ROOT
  trigger :flapping, :times => 10, :within => 1.minute

  process :passenger do
    daemonize true
    pid_file "tmp/pids/passenger.pid"

    start_command "#{BUNDLE} exec passenger start --port 3000 --environment #{RAILS_ENV}"
    stop_signals [:TERM, 5.seconds, :KILL]
    restart_command "kill -USR2 {PID}"

    restart_grace 10.seconds 

    check :cpu, :every => 30, :below => 80, :times => 3
    check :memory, :every => 30, :below => 70.megabytes, :times => [3,5]
  end

  process :delayed_job do
    pid_file "tmp/pids/delayed_job.pid"
    stdall "log/delayed_job.log"
    daemonize true
    stop_signals [:INT, 30.seconds, :TERM, 10.seconds, :KILL]
    restart_grace 10.seconds

    start_command "#{BUNDLE} exec rake jobs:work"
  end
end

В зависимости от вашей платформы у вас наверняка будет доступен вариант init. На Debian это init.d. В Ubuntu, init.d или upstart. на RHEL-подобном сервисе. Это позволит вам управлять услугами при запуске. Я предлагаю прочитать соответствующую справочную страницу для вашей платформы.

Другие вопросы по тегам