かなり大きくて遅い(複雑なデータ、複雑なフロントエンド)WebアプリケーションがRoR
に組み込まれていて、リバースプロキシとしてPuma
を使用してnginx
によって提供されています。 nginx
エラーログを見ると、次のようなエントリがかなりあります。
2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file
/var/lib/nginx/proxy/8/47/0000038478 while reading upstream,
client: 5.144.169.242, server: engagement-console.foo.it,
request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0",
upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2",
Host: "ec.reputationmonitor.it",
referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"
異なるユーザーや異なるユーザーインタラクションでページが同じままである可能性は非常に低く、ディスクでの応答のバッファリングが必要/有用であるとは思わないので、私はどちらかと言えば興味があります。
私はproxy_max_temp_file_size
について知っており、0に設定していますが、少しぎこちないようです(プロキシはバッファリングを試みますが、バッファリング先のファイルがありません...どうすれば高速にできますか?)。
私の質問は:
[警告]を削除して応答のバッファリングを回避するにはどうすればよいですか? proxy_buffering
をオフにするか、proxy_max_temp_file_size
を0に設定する方が良いですか?どうして?
nginx
が応答をバッファリングする場合:バッファリングされた応答はいつ、誰に、そしてなぜ提供されますか?
なぜnginx
がデフォルトでproxy_buffering
をオンにして、実際に応答をバッファリングするかを[警告]するのですか?
応答はいつそのオプションをトリガーしますか?応答を提供するのに数秒(何秒)以上かかる場合?これは構成可能ですか?
TIA、ngw。
1)[警告]を削除して、応答のバッファリングを回避するにはどうすればよいですか? proxy_bufferingをオフにするか、proxy_max_temp_file_sizeを0に設定する方が良いですか?どうして?
削除するには、proxy_max_temp_file_size
を0に設定する必要があります。 proxy_buffering
ディレクティブは警告に直接関係していません。これをオフにして、バッファリングをまったく停止することもできますが、これは一般的にはお勧めできません( Comet で必要でない限り)。
2)nginxが応答をバッファリングする場合、バッファリングされた応答をいつ、誰に、なぜ提供するのですか?
サーバーはすぐにサーバーに接続しますが、クライアントは通常、接続速度がはるかに遅く、アプリケーションが生成するほど高速に応答データを消費することはできません。 Nginxは、アプリケーションをできるだけ早く解放するために、応答全体をバッファリングしようとします。
参照: http://aosabook.org/en/nginx.html
3)nginxがデフォルトでproxy_bufferingをオンにし、それが実際に応答をバッファリングする場合は[警告]するのはなぜですか?
すでに述べたように、proxy_buffering
は警告に直接関係していません。これは通常、最適化されたプロキシ操作に必要であり、オフにするとパフォーマンスとスループットが低下します。
Nginxは、構成されたメモリバッファーに応答が収まらない場合にのみ警告します。よろしければ警告を無視してかまいません。
4)応答はいつそのオプションをトリガーしますか?応答を提供するのに数秒(何秒)以上かかる場合?これは構成可能ですか?
メモリバッファがいっぱいになるとトリガーされます。ドキュメントを見てください、メカニズム全体が説明されています: http://nginx.org/r/proxy_max_temp_file_size
メモリバッファを増やすことができます。
次の構成は私のサーバーで正常に動作します。
proxy_buffers 16 16k;
proxy_buffer_size 16k;