1

response.headers['Content-Length']Rails 3.2.2 アプリケーションで設定すると、Nginx が「502 Bad Gateway」エラーをスローするという問題に遭遇しました。

send_dataメソッドを使用して、変数内に含まれる生の JPEG データを送信するアクションがコントローラーにあります。以前、一部のブラウザで送信された画像全体がダウンロードされず、Content-Length ヘッダーが送信されていないことが判明したため.bytesize、JPEG データを含む変数のプロパティを Content-Length として使用することにしました。

これは開発では (Unicorn を使用して) 正常に機能し、以前にはなかった Content-Length ヘッダーが存在するようになりましたが、Nginx と Passenger を使用している運用環境では、前述の 502 Bad Gateway が発生します。また、Nginx エラー ログには、次のように表示されます。

[error] 30574#0: *1686 upstream prematurely closed connection while reading response header from upstream

Rails のプロダクション ログに一致するエントリはありません。これは、アプリケーションが正常であることを示しています。

Content-Length ヘッダーを設定した行をコメントアウトしたところ、問題はなくなりました。実際に Content-Length ヘッダーを送信する必要があるかどうかはまだテスト中ですが、それまでの間、好奇心からこれを投稿して、何か考えがあるかどうかを確認したいと思いました。

4

1 に答える 1

1

あはは!.to_sメソッドを追加して、サイズを文字列に変換する必要がありました。だから、私の最終結果は

response.headers['Content-Length'] = photo_data.bytesize.to_s
send_data photo_data, :type => :jpg, :filename => 'file_name.jpg', :disposition => 'attachment'

したがって、Content-LengthNginx/Passenger でヘッダーを送信しても問題ないように見えますが、明示的に文字列でない場合、Passenger はチョークします。

于 2013-02-13T17:10:49.153 に答える