Rob*_*ron 22 ruby ruby-on-rails unicorn
所以将USR2发送到Unicorn是非常棒的 - 它会启动一个带有新代码副本的新主服务器并自动获取任何更改.甜.我的问题是:我如何阻止老主人?显而易见的方式是在before_fork中:
before_fork do |server,worker|
old_pid = '/var/www/current/tmp/pids/unicorn.pid.oldbin'
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
Run Code Online (Sandbox Code Playgroud)
这个问题是,一旦新的主人(和新工人)被催生,他们就会杀死旧的主人.因此,对网站的任何请求都只是坐在那里等待新工作人员启动,通常在整个Rails堆栈加载时持续几秒钟.
如果我删除了我的before_fork一切正常,我希望(从客户端的角度来看):我可以整天重新加载我的浏览器,并且每个请求都快速填写,没有任何迹象表明新主人何时接管(除了看到我的代码)现在出现变化).但是,老主人现在一直挂着,直到我手动发送一个退出.
据我所知,一旦工人完成装载并准备为客户服务,就没有回调.这真的是我正在寻找的回调.我总是可以在Rails中创建一个初始化程序,它可以找到一个老主人并杀死它,但这只会让我心疼.
一定有办法!
Rob*_*ron 16
我部分地解决了这个问题:我所看到的行为是由于没有使用而造成的preload_app true.如果你有这个设置,那么整个应用程序由主人加载,工人很快就会产生.因此,如果第一个工人此时杀死了老主人,那没关系,因为所说的工人可以立即开始提供请求!
如果你不能使用preload_app true那么你最好的选择可能是将旧的pid-quit行为转移到Rails初始化程序中,以便第一个启动你的应用程序的worker可以在Rails启动并准备好服务后杀死旧的master要求.
看来,如果preload_app是的话,向Unicorn主机发送HUP信号是更好的选择false.
来自http://unicorn.bogomips.org/SIGNALS.html:
HUP - 重新加载配置文件并优雅地重新启动所有工作程序.如果"preload_app"指令为false(默认值),则工作人员还会在重新启动时获取任何应用程序代码更改.