我有一个运行 nginx 1.0.5 的临时服务器,使用 Passenger 3.0.9 下的 Rails 3.1。问题是,在出现应用程序错误的请求之后发送的请求会返回502 Bad Gateway
。为了测试它,我设置了一个简单的控制器,该控制器的操作只会引发一个虚拟异常。一个请求将显示 Rails 错误消息,下一个请求将显示 nginx502 Bad Gateway
错误,然后它返回到 Rails 应用程序错误,等等。
在调查此问题时,我发现对应用程序进行负载测试(这会增加应用程序进程的数量)会使该问题消失。直到关闭额外的进程后,该问题才会再次出现。我尝试设置该passenger_min_instances
选项,但这样做不会改变任何东西,在这种情况下,每次发生应用程序错误时,都会终止一个实例,而在负载测试之后,所有实例都会保持活动状态。
附言:我团队中的一些人告诉我,即使没有应用程序错误,他们也看到了 502 错误,但我无法重现该错误。
更新:刚刚发现如何使用显示响应状态代码ab
,其中大多数是 502!
答案1
我终于知道了真实的问题。首先,在调查此问题时,我了解到 Passanger 将其错误消息记录在 nginx 内部错误日志中,而不是 中的错误日志中/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!
中的选项解决了这个问题environments/*.rb
。