0

私の Rails アプリケーションは、次のように動的に ~10MB の応答を生成します。

self.status_code = 200
self.response-body = Enumerator.new { |y| ... }

unicorn_railsI canを介して開発モードでアプリケーションを起動curl http://127.0.0.1:3000/foo > /dev/nullし、進捗フィードバックを介してクライアントにストリーミングされている応答を確認します。rails server(webrick を開始する)を使用すると、ストリーミングは行われず、進行状況がそのまま表示され、0% から 100% にジャンプします。

しかし、ステージング/本番環境にデプロイする場合、Unicorn は nginx と UNIX ソケットの背後に配置されます。その構成ではcurl http://staging/foo > /dev/null、ストリーミングがなかったかのように、データが生成されると進行状況が 0% になり、転送されると 0% から 100% になります。実際、サーバー ログを脇に置いてみると、curl はリクエストが生成される間ずっと待機していて、リクエストが完了するとすぐに、curl がデータを受信するときに少しずつ増えていることがわかります。

私の推測では、実際にクライアントに送信する前に、何か (nginx など) がリクエスト全体をどこかにバッファリングします。

今のところproxy_buffering off、nginx 構成で遊んでみましたが、X-Accel-BufferingHTTP 応答ヘッダーは役に立ちませんでした。また、Ubuntu 10.04 の nginx 0.7 を半公式の ppa から 1.2 に上げました。

4

1 に答える 1