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

我已成功使用capistrano将我的rails应用程序部署到Ubuntu EC2。 一切都在部署上很有效。 Rails应用程序名称是deseov12我的问题是Puma没有启动,这将是必要的,因为生产EC2实例将按需实例化。 Puma将在通过Capistrano部署时启动,它也将在运行时启动

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丛林工具的指示,使用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会在它消失之前显示一个美洲狮过程几秒钟。

 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] 

经过大量研究后,这终于得到了解决。 事实certificate这个问题有三个:

1)运行upstart脚本时没有设置正确的环境2)使用capistrano时的实际生产puma.rb配置文件可以在home / deploy / deseov12 / shared目录中找到,而不是在/ current /目录中3)正确地妖魔化美洲狮服务器

要解决这些问题:

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服务器在重新启动或新实例生成时正常启动。 希望这有助于有人避免数小时的故障排除