最近,我们遇到了一个奇怪的问题,即从Passenger 发送到我们的应用程序服务器的一些XHR 请求无法正常执行。
请查看以下事件链:
- LB 乘客向应用服务器发送请求。
在尝试确定该请求应该由哪个控制器操作处理时,Rails 返回 NoMethodError 异常。
Rails error log: Started POST "/user/" for 194.29.65.21 at 2013-03-25 13:14:38 +0100 NoMethodError (undefined method `[]' for nil:NilClass):
当 Rails 能够确定一个请求应该被路由到哪个控制器/动作时,这是一个日志:
Started POST "/User/" for 194.29.65.21 at 2013-03-25 13:14:38 +0100 Processing by Web::UserController#index as Parameters: {"c"=>"1", "fref"=>""}
此错误会传播到引发以下错误的应用程序服务器乘客:
[ pid=20071 thr=3074915216 file=ext/nginx/HelperAgent.cpp:577 time=2013-03-24 22:25:58.257 ]: Uncaught exception in PassengerServer client thread: exception: Cannot read response from backend process: Connection reset by peer (104) backtrace: in 'void Client::forwardResponse(Passenger::SessionPtr&, Passenger::FileDescriptor&)' (HelperAgent.cpp:361) in 'void Client::handleRequest(Passenger::FileDescriptor&)' (HelperAgent.cpp:503) in 'void Client::threadMain()' (HelperAgent.cpp:596)
最后 LB Nginx 给出了这个错误:
up stream status = 500 error
.
对于给定的路线,此错误是随机出现的。甚至这个错误的发生频率也是随机变化的。
系统详情:
- 红宝石:1.9.2p180
- 导轨:3.0.5
- Phusion 乘客版本 3.0.5
- nginx版本:n
我们认为这是因为乘客未能将整个请求数据发送到 Rails,导致 Rails 无法确定有效的控制器操作。