【问题标题】:How do I reload Unicorn without killing the master process?如何在不杀死主进程的情况下重新加载 Unicorn?
【发布时间】:2012-02-11 10:40:40
【问题描述】:

我有一个 RubyOnRails 项目,并在 Ubuntu 服务器上的 nginx 上使用 Unicorn 部署它。

如果我更改了其中一个配置文件,我需要重新启动 Unicorn,但是当我杀死 Unicorn 的主进程并使用 bundle exec 重新启动它时,它会使我的站点关闭。

有没有什么方法可以让 Unicorn 处理新文件而不会终止进程并停止运行?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 nginx unicorn


    【解决方案1】:

    在我的 capistrano deploy.rb 我有:

    desc "Zero-downtime restart of Unicorn"
    task :restart, :except => { :no_release => true } do
      run "kill -s USR2 unicorn_pid"
    end
    

    这在“Lighting fast, zero-downtime deployments with git, capistrano, nginx and Unicorn”中有详细记录。

    【讨论】:

    • 我在您的建议下取得了一些进展,谢谢,但现在我遇到了新的错误。当我输入“cap restart”并输入我的密码时,我得到以下信息:** [out :: app_name] $rvm_path (/root/.rvm/) does not exist. *** [err :: app_name] /usr/local/rvm/bin/rvm-shell: line 57: rvm: command not found *** [err :: app_name] Error: RVM was unable to use 'ruby-1.9.2-p290' 如果我能理解 google 的结果,我需要将我的 rvm_path var 更改为“/usr/local/rvm/bin”(它是确实存在的目录),但我无法在任何地方找到它。
    • 是重新启动您编写的脚本吗?如果是这种情况,您可以在脚本中添加rvm use 1.9.2,以使其了解您需要使用的 rvm 版本。否则,请将答案标记为正确并为 rvm 问题打开一个新答案。我很乐意提供帮助。
    • 好的,我已经修复了我的 rvm(没有必要的 gem),现在看来 capistrano 确实执行了我的命令,但 unicorn 无论如何都不会考虑我对配置文件的更改。 (例如,工作进程的数量或数据库设置)
    • 根据文档,发送USR2 会留下一个旧的独角兽主进程。
    【解决方案2】:

    两个答案,包括被接受的答案,都不好。

    http://unicorn.bogomips.org/SIGNALS.html 表示向主进程发送HUP

    desc "Zero-downtime restart of Unicorn"
    task :restart, :except => { :no_release => true } do
      run "kill -s HUP `cat tmp/pids/unicorn.pid`"
    end
    

    【讨论】:

    • 问题不是问如何重新加载(即 HUP),而是如何优雅地重新启动,这已经是 USR2
    • 我认为 OP 不在乎重新加载或重新启动,只想使用新配置进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2018-05-05
    相关资源
    最近更新 更多