Unicorn完全忽略了USR2信号

Ehu*_*hud 15 ruby-on-rails unicorn rvm

我在生产服务器上遇到了一个相当奇怪的独角兽问题.虽然配置文件声明preload_app为true,但是将USR2发送到主进程不会产生任何响应,并且似乎独角兽完全忽略了该信号.在另一台发送USR2的服务器上,将主进程更改为和(旧)状态,并成功启动新的主进程.有问题的服务器正在使用RVM和捆绑器,所以我假设它以某种方式相关(另一个是vanilla ruby​​).发送USR2以外的信号(QUIT,HUP)工作正常.有没有办法追踪幕后发生的事情?Unicorn的日志文件完全为空.

iHi*_*HiD 10

我怀疑你的问题可能是你的Gemfile已经改变了,但你没有以允许USR2使用新Gemfile的方式启动你的独角兽.因此,当您尝试重新启动应用程序时会崩溃.

检查您/log/unicorn.log可能失败的详细信息.

如果您使用的是Capistrano,请将BUNDLE_GEMFILE指定为符号链接,例如:

run "cd #{current_path} && BUNDLE_GEMFILE=#{current_path}/Gemfile bundle exec unicorn -c #{config_path} -E #{unicorn_env} -D"
Run Code Online (Sandbox Code Playgroud)

这是一个展示这一点的公关.


jus*_*see 5

我遇到了类似的问题,但是我的日志清楚地确定了问题:发送USR2最初会用于部署,但随着部署得到清理,Unicorn主机最初启动的版本将被删除,因此尝试发送USR2信号似乎什么都不做/失败,错误日志说明:

派生的子重新执行... 53 /var/www/application/releases/153565b36021c0b8c9cbab1cc373a9c5199073db/vendor/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:439:in` EXEC:没有这样的文件或目录 - /var/www/application/releases/153565b36021c0b8c9cbab1cc373a9c5199073db/vendor/bundle/ruby/1.9.1/bin/unicorn(错误:: ENOENT)

独角兽文件提到这个潜在的问题http://unicorn.bogomips.org/Sandbox.html:"清理旧版本会导致麒麟的特定修订的安装到失踪和升级失败",这在我的情况下,意味着USR2似乎"无所事事".

我正在使用Chef的应用程序配方来部署应用程序,这会创建一个符号链接的vendor_bundle目录,该目录在部署中共享,但调用bundle exec unicorn仍然导致原始的Unicorn主控器包含一个包含特定版本目录的路径引用.

为了修复它,我不得不打电话bundle exec /var/www/application/shared/vendor_bundle/ruby/1.9.1/bin/unicorn来确保Unicorn主机有一个二进制路径,从一个部署到下一个部署是有效的.一旦完成,我可以向我部署内容,并kill -USR2 PID按照广告宣传.

Unicorn文档提到你可以通过在Unicorn配置文件中设置以下内容来手动更改二进制路径引用,并在发送USR2以分叉新主服务器之前发送HUP重新加载Unicorn: Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"

也许这对于类似情况下的某些人来说很有用,但我没有实现它,因为它似乎指定了共享的独角兽二进制文件的绝对路径就足够了.


whi*_*ark 0

我的 VDS 也遇到过类似的问题。Strace'ing 揭示了原因:

write(2, "E, [2011-07-23T04:40:27.240227 #19450] ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM) <...>
Run Code Online (Sandbox Code Playgroud)

尝试增加内存大小、XEN 内存按需限制(在我的情况下它们太难了),或者打开overcommit,通过后者可能会产生一些严重的副作用,因此请小心操作。