
かなり大きくて遅い (複雑なデータ、複雑なフロントエンド) 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"
異なるユーザーや異なるユーザー操作に対してページが同じままである可能性は非常に低く、応答をディスクにバッファリングすることが必要/有用であるとは思わないため、私はむしろ興味があります。
0 に設定することは知っていますproxy_max_temp_file_size
が、少し扱いにくいように思えます (プロキシはバッファリングを試みますが、バッファリングするファイルがありません...どうすればもっと速くできるでしょうか)。
私の質問は次のとおりです:
[warn] を削除して応答のバッファリングを回避するにはどうすればよいでしょうか? オフにするか、 0 に
proxy_buffering
設定する方がよいでしょうか? なぜでしょうか?proxy_max_temp_file_size
応答をバッファリングする場合
nginx
: バッファリングされた応答はいつ、誰に、なぜ提供されるのでしょうか?なぜデフォルトでオンに
nginx
なっていてproxy_buffering
、実際に応答をバッファリングすると [警告] が表示されるのでしょうか?応答によってそのオプションがトリガーされるのはいつですか? 応答の提供に数秒 (何秒?) かかるのはいつですか? これは構成可能ですか?
TIA、ngw。
答え1
- [warn] を削除して応答のバッファリングを回避するにはどうすればよいでしょうか? proxy_buffering をオフにするか、proxy_max_temp_file_size を 0 に設定する方がよいでしょうか? なぜでしょうか?
proxy_max_temp_file_size
削除するには0に設定する必要があります。このproxy_buffering
ディレクティブは警告とは直接関係ありません。バッファリングを完全に停止するにはオフにすることができますが、一般的には推奨されません(必要な場合を除く)。彗星)。
- nginx が応答をバッファリングする場合、バッファリングされた応答はいつ、誰に、なぜ提供されるのでしょうか?
応答はすぐに提供されますが、クライアントの接続速度は通常はるかに遅いため、アプリケーションによって生成される応答データをすぐに消費することはできません。Nginx は、アプリケーションをできるだけ早く解放するために、応答全体をバッファリングしようとします。
参照:http://aosabook.org/en/nginx.html
- nginx がデフォルトで proxy_buffering をオンにして、実際に応答をバッファリングすると [警告] を表示するのはなぜですか?
すでに述べたように、はproxy_buffering
警告とは直接関係ありません。これは通常、最適化されたプロキシ操作に必要であり、これをオフにするとパフォーマンスとスループットが低下します。
Nginx は、応答が設定されたメモリ バッファに収まらない場合にのみ警告します。問題がなければ、警告を無視できます。
- 応答によってそのオプションがトリガーされるのはいつですか? 応答の提供に数秒 (何秒?) 以上かかる場合ですか? これは構成可能ですか?
メモリ バッファがいっぱいになるとトリガーされます。ドキュメントを参照してください。メカニズム全体が説明されています。http://nginx.org/r/proxy_max_temp_file_size
メモリ バッファを増やす必要がある場合があります。
答え2
次の構成は私のサーバーでは正常に動作します。
proxy_buffers 16 16k;
proxy_buffer_size 16k;
答え3
静的コンテンツの場合、nginx sendfileコマンドが役に立つかもしれません。
https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/
sendfile を有効にする:
デフォルトでは、NGINX はファイル送信を自ら処理し、送信前にファイルをバッファにコピーします。sendfile ディレクティブを有効にすると、データをバッファにコピーする手順がなくなり、あるファイル記述子から別のファイル記述子にデータを直接コピーできるようになります。1 つの高速接続がワーカー プロセスを完全に占有するのを防ぐには、sendfile_max_chunk ディレクティブを使用して、1 回の sendfile() 呼び出しで転送されるデータの量を制限します (この例では 1 MB)。
location /mp3 {
sendfile on;
sendfile_max_chunk 1m;
#...
}
答え4
これらをnginx.confまたは仮想ホスト設定ファイルのコンテキストに追加します(http、サーバ、位置):
proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;
状況に応じて値を設定できますが、値は互いにバランスが取れている必要があります (バッファ ディレクティブに異なる数値を使用しないでください)。
私も同じ問題を抱えており、IO、SQL、PHP プロセスが重く長時間かかるスクリプトでこれらの構成をテストしたところ、問題なく動作しました。