Nginxの「proxy_buffer_size」のエラーログ対策・設定方法まとめ(upstream response is buffered to a temporary file)
Nginxをリバースプロキシで使う場合、
「proxy_buffer」系の設定で悩む人が多いだろう。
結論的にはサイトによって設定する必要がある。
そんなところの話。
このエラーログを対策する
2018/09/30 03:31:06 [warn] 32180#32180: *121312015 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/7/44/0000083447 while reading upstream, client: xxx.xxx.xx.xxx, server: , request: "GET /wp-content/uploads/2018/09/aaa.png HTTP/1.1", upstream: "http://192.168.0.1:80/wp-content/uploads/2018/09/aaa.png", host: "parudou3.com", referrer: "http://parudou3.com/archives/10"
初期設定で使うと必ず出るエラーログです。
記事表示の度に何個も出るので、さすがに無くさないといけない。
どうなったらエラーが出るか
バッファサイズよりも受信したファイルの容量の方が大きい場合、エラーが出る。
例えば、1MBの画像を表示する場合、バッファは約1MB必要です。
これは検証結果からこの結論になりました。
アップロードの場合のバッファもほぼ同じなので、多分合っている。
では、どのように設定するのが良いか?
重たいファイルが多いサイトは次のように設定しました。
proxy_buffer_size 8k;
proxy_buffers 96 16k;
proxy_busy_buffers_size 16k;
軽いファイルしかないサイトの場合は次のような設定しています。
proxy_buffer_size 8k;
proxy_buffers 32 8k;
proxy_busy_buffers_size 16k;
できるだけピッタリな数字にするほうがメモリ使用量が少なく済む。
5KBのファイルに32KBもバッファを使うのは無駄です。
--
各項目の説明を。
proxy_buffer_size
基本はヘスポンスヘッダーに使うバッファサイズです。
ただし「sendfile on; tcp_nopush on;」を設定するとレスポンスボディも入る?と記述を見た。
このあたりよくわからない。
ヘッダーだけと考えると理論上最大?である「8K」で問題無い。
もしボディも含まれているとしても、記事やCSSなどは6KB程度のサイズなので足りる。
これで画像以外はほぼこのバッファ一つで対応できる。
(gzipでサイズは軽くなる)
なんとなく、一つで終わらせる方が速そうなので、ピッタリにしたい
ここは8K固定で良いと思います。
proxy_buffers
レスポンスボディに使うバッファです。
もしくは上記のバッファで納まらなかった場合に使うバッファです。
「96 16K」は「16Kのバッファを最大96個使う(最大1536KB)」という意味。
200KBの画像であれば、13個使う計算です。
使わなかった残り83個は他のリクエスト用に待機します。
自分のサイトで一番重たい画像のサイズで設定すれば良い。
フルHDの写真であれば、ほぼ1.5MB以下なので「96 16K」でいける。
もし3MBの画像を貼付しているのであれば、「192 16k」とします。
こうするとエラーログは確実に出ない。
もしくは「/img/」フォルダは個別に「32 128k」と設定してもいい。
ただそうするとそれぞれメモリを確保するので消費が多くなる(多分)。
「192 8K」とバッファの数を増やしてもいいですが、
あまり増やし過ぎるとバッファ処理でのCPU負荷が増加します。
ただ、細かいファイルが多い場合は同時アクセスには強くなる。
という感じで、ここの設定の最適解は難しい。
サイトに合わせて設定下さい。
proxy_busy_buffers_size
クライアントに送るバッファの処理待ちの場所的な存在。
(理解が難しく説明できない)
「proxy_buffers」の一つのバッファサイズの2倍に設定するのが基本らしい。
今のところ、特に問題はない。
対策まとめ
chromeのデベロッパーツールなどで、自分のサイトの各ファイルのサイズを確認。
そのサイズに合わせてプロキシのバッファを調整する。
そのため、人によって設定する値が違ってきます。
ここの部分があるので、どの解説サイトも違った数値です。
できるだけ無駄遣いしない設定にすることが大事。
CSS一つに128KBもバッファ(メモリ)を使ってはいけない。
2MBを超えるような画像を貼ってはいけない。
そんなところでproxy_buffer_sizeを調整していこう。
いつしかサイトの内容も変わると思うので、
やはりaccess.logとerror.logは毎日監視して適宜対応したいところです。