我有一个在Passenger 3.0.9下使用Rails 3.1运行nginx 1.0.5的临时服务器。 问题是,在发生应用程序错误的地方发送一个请求后,返回502 Bad Gateway 。 为了testing它,我设置了一个简单的控制器,其中一个动作就是引发一个虚拟的exception。 一个请求将显示Rails错误消息,下一个将显示nginx 502 Bad Gateway错误,然后返回到Rails应用程序错误等。
在调查这个问题时,我发现负载testing应用程序(增加了应用程序的数量)使得这个问题消失了。 这是直到额外的进程closures,然后重新出现。 我已经尝试设置passenger_min_instances选项,但这样做不会改变任何东西,并在这种情况下,每次发生应用程序错误时,一个实例被终止,而负载testing后,所有实例保持活着。
PS:我的团队中的一些人告诉我,他们已经看到了502错误,即使没有应用程序错误,但我还没有能够重现这一点。
更新 :刚刚发现如何显示使用ab的响应状态代码,其中大部分是502!
我终于明白了真正的问题。 首先,在调查此问题的同时,我了解到Passanger在nginx内部错误日志中logging错误消息,而不是/var/log的错误消息,它位于/usr/local/nginx/logs/error.log 。 所以我得到的实际错误信息是:
Exception ThreadError in application (deadlock; recursive locking) (process 6407, thread #<Thread:0x89e5ef0>): from /var/www/fantasy-sports/shared/bundle/ruby/1.9.1/gems/rack-1.3.2/lib/rack/lock.rb:14:in `lock' ...
有关于这个问题的更多信息: https : //github.com/rtomayko/rack-cache/issues/23
最后我通过取消注释config.threadsafe!解决它config.threadsafe! 选项在environments/*.rb文件中。