【问题标题】:Capistrano puma:restart not working, but puma:start doesCapistrano puma:restart 不起作用,但 puma:start 可以
【发布时间】:2017-11-29 12:47:51
【问题描述】:

我正在使用 Capistrano 将我的 Rails 5 应用程序部署到 AWS EC2 实例。当我输入时:

cap production deploy

一切顺利,部署成功。但是,重新启动 puma 的过程不起作用。我看到的最后一个任务是:

puma:restart
      01 ~/.rvm/bin/rvm ruby-2.4.0 do bundle exec pumactl -S /home/deploy/myapp/shared/tmp/pids/puma.state -F /home/deploy/myapp/s…
      01 Command restart sent success

但是,当我访问我的网站时,我看到:

502 Bad Gateway
nginx/1.4.6 (Ubuntu)

执行cap production puma:status 警告我Puma 没有运行。有趣的是,cap production puma:start 与以下回声完美配合:

puma:start
      using conf file /home/deploy/myapp/shared/puma.rb
      01 ~/.rvm/bin/rvm ruby-2.4.0 do bundle exec puma -C /home/deploy/myapp/shared/puma.rb --daemon
      01 Puma starting in single mode...
      01
      01 * Version 3.9.1 (ruby 2.4.0-p0), codename: Private Caller
      01
      01 * Min threads: 0, max threads: 8
      01
      01 * Environment: production
      01
      01 * Daemonizing...
      01

我花了几个小时试图找出问题所在。我可以通过在每次部署时启动 Puma 服务器而不是重新启动或阶段性重新启动任务来解决此问题。但可能是什么原因造成的?我在 2 周前部署了一个类似的应用程序(它是一个仅 API 的应用程序),它运行时没有任何问题。

这是我的 deploy.rb:

lock "3.8.2"

set :application, "myapp"
set :repo_url, "git@bitbucket.org:myorg/myapp.git"

# set :branch, :master
set :branch, :release
set :deploy_to, '/home/deploy/myapp'
set :pty, true
set :linked_files, %w{config/database.yml config/application.yml}
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}

set :keep_releases, 5
set :rvm_type, :user
set :rvm_ruby_version, 'ruby-2.4.0'

set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock"
set :puma_conf, "#{shared_path}/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, [0, 8]
set :puma_workers, 0
set :puma_worker_timeout, nil
set :puma_init_active_record, true
set :puma_preload_app, false

我的配置/部署/production.rb:

server 'myapp.com', user: 'deploy', roles: %w{web app db}

我的 puma.rb:

#!/usr/bin/env puma

directory '/home/deploy/myapp/current'
rackup "/home/deploy/myapp/current/config.ru"
environment 'production'
daemonize true

tag ''

pidfile "/home/deploy/myapp/shared/tmp/pids/puma.pid"
state_path "/home/deploy/myapp/shared/tmp/pids/puma.state"
stdout_redirect '/home/deploy/myapp/shared/log/puma_error.log', '/home/deploy/myapp/shared/log/puma_access.log', true

threads 0,8

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

workers 0
prune_bundler

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

我真的被困在这里了。即使经过数小时的研究,我也找不到有效的解决方案!

【问题讨论】:

  • 似乎是 capistrano3-puma gem 中的一个错误:github.com/seuros/capistrano-puma/issues/237
  • 非常感谢您的链接。这让我放心。虽然令人沮丧,但在解决这个问题的过程中,我从对 Capistrano 一无所知到对它有了一个公平的认识。我已经对任务进行了猴子修补,直到问题得到解决。我正在分享我的猴子补丁作为答案 - 如果您认为这很好或者是否有更好的选择,请告诉我。

标签: ruby-on-rails capistrano puma


【解决方案1】:

正如 Matt 在 cmets 中所指出的,这似乎是一个已报告的错误。我已经猴子修补了 puma:restart 任务作为临时解决方案,直到它得到修复。

我已经创建了 /lib/capistrano/tasks/overwrite_restart.rake:

namespace :puma do
  Rake::Task[:restart].clear_actions

  desc "Overwritten puma:restart task"
  task :restart do
    puts "Overwriting puma:restart to ensure that puma is running. Effectively, we are just starting Puma."
    puts "A solution to this should be found."
    invoke 'puma:stop'
    invoke 'puma:start'
  end
end

作为替代方案,我想我们可以覆盖 capistrano-puma gem 中的 :register_hooks 方法,并将 puma:restart 替换为 puma:stoppuma:start

【讨论】:

    【解决方案2】:

    我遇到了 Capistrano Puma 基本任务未显示的问题(重新启动、停止、启动)。发生这种情况是因为在 Capistrano Puma 5.0 中,任务被移至服务管理器模块,

    之后

    require "capistrano/puma"
    install_plugin Capistrano::Puma
    

    请务必添加:

    install_plugin Capistrano::Puma::Daemon
    

    请注意,这与 Puma 5+ 不兼容,因为已删除守护进程支持。

    来源:https://github.com/seuros/capistrano-puma/issues/310

    或者如果你使用 Systemd

    install_plugin Capistrano::Puma::Systemd
    

    那么现在应该显示所有任务,并且 Puma 应该在部署后重新启动。

    【讨论】:

    • 例如,对于 puma 5.2,我们有哪些选择?
    • 使用 systemd 代替妖魔化。我最近使用 systemd 实现了 puma 5.2,它运行良好(ubuntu 20.04)。检查这个github.com/puma/puma/blob/master/docs/systemd.md
    • 这实际上会导致混乱,因为我认为systemd也与Puma 5+不兼容,但实际上不兼容的是妖魔化。我刚刚编辑了我的答案以减少混乱。
    • 感谢您的回复,我实际上还使用 systemd 实现了 puma 5.2,它的工作原理非常棒。请注意,使用 Capistrano 为 puma 自动生成的设置将为 ExecStart 路径生成一个带有“~”的服务。这导致 RVM 出现问题。使用绝对路径“/home/ubuntu/... 在我的情况下”解决了问题
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2011-01-16
    • 2012-02-01
    • 2012-11-30
    • 2016-03-06
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多