使用EC2 + Rails + Nginx + Capistrano,Puma重启失败

6

我已经成功地使用Capistrano将我的Rails应用部署到Ubuntu EC2上。在部署过程中一切都很顺利。我的Rails应用程序名称是deseov12。 我的问题是,Puma不会在启动时自动启动,这将是必要的,因为生产EC2实例将根据需要实例化。 通过Capistrano部署时,Puma将启动,也会在运行时启动。

cap production puma:start

在本地机器上运行。

如果我运行以下命令,服务器重启后也会启动:

su - deploy
[enter password]
cd /home/deploy/deseov12/current && ( export RACK_ENV="production" ; ~/.rvm/bin/rvm ruby-2.2.4 do bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon )

我遵循了 Puma Jungle 工具的指示,使用 upstart 使 Puma 在启动时自动启动,方法如下:

/etc/puma.conf 文件内容:

/home/deploy/deseov12/current

/etc/init/puma.conf和/home/deploy/puma.conf的内容

# /etc/init/puma.conf - Puma config

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Puma instances with
# Upstart, Ubuntu's native service management tool.
#
# See workers.conf for how to manage all Puma instances at once.
#
# Save this config as /etc/init/puma.conf then manage puma with:
#   sudo start puma app=PATH_TO_APP
#   sudo stop puma app=PATH_TO_APP
#   sudo status puma app=PATH_TO_APP
#
# or use the service command:
#   sudo service puma {start,stop,restart,status}
#

description "Puma Background Worker"

# no "start on", we don't want to automatically start
stop on (stopping puma-manager or runlevel [06])

# change apps to match your deployment user if you want to use this as a less privileged user $
setuid deploy
setgid deploy

respawn
respawn limit 3 30

instance ${app}

script
# this script runs in /bin/sh by default
# respawn as bash so we can source in rbenv/rvm
# quoted heredoc to tell /bin/sh not to interpret
# variables

# source ENV variables manually as Upstart doesn't, eg:
#. /etc/environment

exec /bin/bash <<'EOT'
# set HOME to the setuid user's home, there doesn't seem to be a better, portable way
  export HOME="$(eval echo ~$(id -un))"

  if [ -d "/usr/local/rbenv/bin" ]; then
    export PATH="/usr/local/rbenv/bin:/usr/local/rbenv/shims:$PATH"
  elif [ -d "$HOME/.rbenv/bin" ]; then
    export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"
  elif [ -f  /etc/profile.d/rvm.sh ]; then
    source /etc/profile.d/rvm.sh
  elif [ -f /usr/local/rvm/scripts/rvm ]; then
    source /etc/profile.d/rvm.sh
  elif [ -f "$HOME/.rvm/scripts/rvm" ]; then
    source "$HOME/.rvm/scripts/rvm"
  elif [ -f /usr/local/share/chruby/chruby.sh ]; then
    source /usr/local/share/chruby/chruby.sh
    if [ -f /usr/local/share/chruby/auto.sh ]; then
      source /usr/local/share/chruby/auto.sh
    fi
    # if you aren't using auto, set your version here
    # chruby 2.0.0
  fi

  cd $app
  logger -t puma "Starting server: $app"

  exec bundle exec puma -C current/config/puma.rb
EOT
end script

/etc/init/puma-manager.conf和/home/deploy/puma-manager.conf的内容:

# /etc/init/puma-manager.conf - manage a set of Pumas

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Puma instances with
# Upstart, Ubuntu's native service management tool.
#
# See puma.conf for how to manage a single Puma instance.
#
# Use "stop puma-manager" to stop all Puma instances.
# Use "start puma-manager" to start all instances.
# Use "restart puma-manager" to restart all instances.
# Crazy, right?
#

description "Manages the set of puma processes"

# This starts upon bootup and stops on shutdown
start on runlevel [2345]
stop on runlevel [06]

# Set this to the number of Puma processes you want
# to run on this machine
env PUMA_CONF="/etc/puma.conf"

pre-start script
  for i in `cat $PUMA_CONF`; do
  app=`echo $i | cut -d , -f 1`
  logger -t "puma-manager" "Starting $app"
  start puma app=$app
done
end script

/home/deploy/deseov12/shared/puma.rb的内容如下:

#!/usr/bin/env puma

directory '/home/deploy/deseov12/current'
rackup "/home/deploy/deseov12/current/config.ru"
environment 'production'

pidfile "/home/deploy/deseov12/shared/tmp/pids/puma.pid"
state_path "/home/deploy/deseov12/shared/tmp/pids/puma.state"
stdout_redirect '/home/deploy/deseov12/shared/log/puma_error.log', '/home/deploy/deseov12/shar$


threads 0,8

bind 'unix:///home/deploy/deseov12/shared/tmp/sockets/puma.sock'

workers 0

activate_control_app

prune_bundler


on_restart do
  puts 'Refreshing Gemfile'
  ENV["BUNDLE_GEMFILE"] = "/home/deploy/deseov12/current/Gemfile"
end

然而,我无法使 Puma 在服务器重新启动后自动启动。它就是不会启动。
我非常感谢您的帮助。
编辑:我刚刚注意到了一个可能是线索的东西:
在 deploy 用户下运行以下命令时:
sudo start puma app=/home/deploy/deseov12/current

ps aux命令会显示一个puma进程,但只会持续几秒钟就会消失。

deploy    4312  103  7.7 183396 78488 ?        Rsl  03:42   0:02 puma 2.15.3 (tcp://0.0.0.0:3000) [20160106224332]

这个 Puma 进程和由 Capistrano 启动的工作进程不同:

deploy    5489 10.0 12.4 858088 126716 ?       Sl   03:45   0:02 puma 2.15.3 (unix:///home/deploy/deseov12/shared/tmp/sockets/puma.sock) [20160106224332]
1个回答

6

经过大量研究,这个问题终于解决了。原来问题有三个:

1)运行upstart脚本时没有设置正确的环境 2)使用capistrano时,实际的生产puma.rb配置文件可以在home/deploy/deseov12/shared目录中找到,而不是在/current/目录中找到。 3)没有正确地将Puma服务器变成守护进程。

要解决这些问题:

1)应该在/etc/init/puma.conf和/home/deploy/puma.conf的脚本开头加上以下代码:

env RACK_ENV="production"

2) 和 3) 这行
exec bundle exec puma -C current/config/puma.rb

应该被替换为这个

exec bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon

在完成这些操作后,Puma服务器可以在重启或创建新实例时正确启动。希望这能帮助某些人避免长时间的故障排除。

1
这个教程是一个不错的起点,虽然它缺少了Capistrano部署自动化部分:https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04 - Augusto Samamé Barrientos
1
请不要在这里宣传DO。SO教程完全忽略了Puma Upstart。您的生产服务器将无法在重新启动时启动。而且,主题发起人正在谈论这个特定的问题。 - Bask.ws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接