Как я могу поддерживать автономную работу Пассажира даже после перезагрузки? - PullRequest
9 голосов
/ 30 марта 2011

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

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

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

Ответы [ 4 ]

15 голосов
/ 20 апреля 2011

Вот что у меня получилось.Использование 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 ко второй строке в блоке скрипта)

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

0 голосов
/ 22 апреля 2015

Я использую 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
0 голосов
/ 19 апреля 2011

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

0 голосов
/ 19 апреля 2011

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

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

...