【问题标题】:Restarting Unicorn with USR2 doesn't seem to reload production.rb settings使用 USR2 重启 Unicorn 似乎不会重新加载 production.rb 设置
【发布时间】:2012-03-12 09:13:05
【问题描述】:

我正在运行独角兽并试图让零停机时间重新启动工作。

到目前为止,一切都很棒,主进程分叉并启动了 4 个新工作人员,然后杀死了旧工作人员,每个人都很高兴。

我们的脚本发送以下命令来重启独角兽:

kill -s USR2 `cat /www/app/shared/pids/unicorn.pid`

表面上看起来一切都很好,但事实证明 unicorn 并没有重新加载 production.rb。 (每次部署时,我们都会将 config.action_controller.asset_host 值更改为新的 CDN 容器端点,其中包含我们的预编译资产)。

以这种方式重新启动独角兽后,资产主机仍指向旧版本。进行真正的重启(即:停止主进程,然后从头开始重新启动 unicorn)获取新的配置更改。

preload_app 在我们的独角兽配置文件​​中设置为true

有什么想法吗?

【问题讨论】:

  • 你的 unicorn.rb 配置是否试图杀死 .oldbin 上的进程?查看解决方案:jessewolgamott.com/blog/2012/01/02/…
  • 它肯定会杀死老主进程——一旦重启完成并且工作人员准备就绪,ps -ef | grep unicorn 只显示主进程和 4 个工作进程。 master 的 pid 与发出 USR2 之前的旧 master 的 pid 不同。

标签: ruby-on-rails ruby ruby-on-rails-3 deployment unicorn


【解决方案1】:

我的猜测是你的独角兽正在旧的生产目录而不是新的生产目录中重新启动——换句话说,如果你在 unicorn.rb 中的工作目录是<capistrano_directory>/current,你需要确保符号链接发生在您尝试重新启动独角兽之前。

这可以解释为什么手动停止和启动它们是有效的:您可能正在执行后期部署,这可能会导致它们在正确的目录中启动。

在您的部署过程中,您何时重新启动独角兽?您应该确保在新的发布目录被符号链接为当前目录之后发送 USR2 信号。

如果这没有帮助,请提供您的 unicorn.rb 和 deploy.rb;它将使调试此问题变得容易得多。

【讨论】:

  • 间接回答了这个问题 - 谢谢!符号链接完成后正在重新启动,但你让我找对了地方。独角兽配置将工作目录设置为 File.expand 语句,该语句解析为符号链接的目标,而不是符号链接本身。我把它改成了符号链接的绝对路径,效果很好。
  • (PS - 明天时间到了我会奖励赏金)。
  • 我也遇到了这个问题,原来我在重启独角兽时正在做cd #{release_path} &&而不是cd #{current_path} &&。感谢您帮助我意识到这一点。
  • 您好:如果我从 shell 手动发送 USR2 信号但新配置没有被拾取,可能是什么原因?
  • @MichaelShimmins 你能发布实际的变化吗?我在这里有点困惑。我已经尝试了大约一天,但仍然无法完成这项工作。
【解决方案2】:

请记住: 您在 unicorn.rb 中的工作目录应该是: /你的/cap/目录/当前

是: File.expand_path("../..", FILE)

因为unicorn和linux软链接分叉错误:软链接不能正常工作。

例如:

cd current #current 是指向另一个目录的软链接

... ...

当我们得到我们的工作目录时,我们得到的是绝对路径而不是“当前”中的路径

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多