Как я могу поддерживать автономную работу пассажира даже после перезагрузки?
У меня есть несколько приложений, работающих на 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-подобном сервисе. Это позволит вам управлять услугами при запуске. Я предлагаю прочитать соответствующую справочную страницу для вашей платформы.