私の Rails アプリケーションは、次のように動的に ~10MB の応答を生成します。
self.status_code = 200
self.response-body = Enumerator.new { |y| ... }
unicorn_rails
I 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-Buffering
HTTP 応答ヘッダーは役に立ちませんでした。また、Ubuntu 10.04 の nginx 0.7 を半公式の ppa から 1.2 に上げました。