web-dev-qa-db-ja.com

上流の応答は一時ファイルにバッファリングされます

かなり大きくて遅い(複雑なデータ、複雑なフロントエンド)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に設定していますが、少しぎこちないようです(プロキシはバッファリングを試みますが、バッファリング先のファイルがありません...どうすれば高速にできますか?)。

私の質問は:

  1. [警告]を削除して応答のバッファリングを回避するにはどうすればよいですか? proxy_bufferingをオフにするか、proxy_max_temp_file_sizeを0に設定する方が良いですか?どうして?

  2. nginxが応答をバッファリングする場合:バッファリングされた応答はいつ、誰に、そしてなぜ提供されますか?

  3. なぜnginxがデフォルトでproxy_bufferingをオンにして、実際に応答をバッファリングするかを[警告]するのですか?

  4. 応答はいつそのオプションをトリガーしますか?応答を提供するのに数秒(何秒)以上かかる場合?これは構成可能ですか?

TIA、ngw。

71
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

メモリバッファを増やすことができます。

88
VBart

次の構成は私のサーバーで正常に動作します。

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
16
Haluk