最近、Passenger からアプリケーション サーバーに送信された一部の XHR リクエストが正しく実行されないという奇妙な問題に直面しています。
次の一連のイベントを見てください。
- LB Passenger はアプリケーション サーバーにリクエストを送信します。
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 Passenger バージョン 3.0.5
- nginx バージョン: n
これは、Passenger が要求データ全体を Rails に送信できず、その結果、Rails が有効なコントローラー アクションを決定できなかったために発生したと考えられます。