我正在运行独角兽,我正试图让零停机重启工作。
到目前为止,这是一个非常棒的酱油,主要的过程分叉并开始4个新工人,然后杀死旧工人,每个人都很高兴。
我们的脚本发送以下命令来重启unicorn:
kill -s USR2 `cat /www/app/shared/pids/unicorn.pid`
从表面上看,一切看起来都很棒,但事实证明,独角兽并没有重新加载生产.rb。 (每次部署时,我们都会将config.action_controller.asset_host
值更改为新的CDN容器端点,并在其中包含预先编译的资产。)
以这种方式重启unicorn之后,资产主机仍然指向旧版本。执行实际重启(即:停止主进程,然后从头开始再次启动独角兽)获取新的配置更改。
在我们的独角兽配置文件中, preload_app
设置为true
。
有什么想法吗?
答案 0 :(得分:24)
我的猜测是你的独角兽正在旧的生产目录而不是新的生产目录中重新启动 - 换句话说,如果unicorn.rb中的工作目录是<capistrano_directory>/current
,你需要确保在尝试重新启动独角兽之前会发生符号链接。
这可以解释为什么手动停止和启动它们的原因:你正在进行后部署,这可能会导致它们在正确的目录中启动。
在部署过程中,您是否正在重新启动独角兽?您应确保在新版本目录符号链接为当前后发送USR2信号。
如果这没有帮助,请点击你的unicorn.rb和deploy.rb;它会使调试这个问题变得容易得多。
答案 1 :(得分:7)
请记住: 你在unicorn.rb的工作目录应该是: /你的/盖/目录/电流
不是: File.expand_path(“../ ..”, FILE )
因为unicorn和linux软链接分叉错误:软链接无法正常工作。例如:
cd current #current是到另一个目录的软链接
......
当我们得到工作目录时,我们得到的绝对路径不是“当前”
中的路径