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 100 16k;
proxy_busy_buffers_size 16k;
軽いファイルしかないサイトの場合は次のような設定しています。
proxy_buffer_size 8k;
proxy_buffers 32 8k;
proxy_busy_buffers_size 16k;
できるだけピッタリな数字にするほうがメモリ使用量が少なく済む。
5KBのファイルに32KBもバッファを使うのは無駄です。
--
各項目の説明を。
proxy_buffer_size
最初に使うバッファサイズです。
記事やCSSなどは6KB程度のサイズなので、「8K」としておいた。
これで画像以外はほぼこのバッファ一つで対応できる。
(gzipでサイズは軽くなる)
なんとなく、一つで終わらせる方が速そうなので、ピッタリにしたい
なお、海外の専門家?の人が言うには「128kも絶対に必要ない」とのこと。
確かにそう思う。
proxy_buffers
上記のバッファで納まらなかった場合に使うバッファです。
「100 16K」は「16Kのバッファを最大100個使う(最大1600K)」という意味。
200KBの画像であれば、12個使う計算です。
これにて1600KBまでは対応できる。
もし3MBの画像を貼付しているのであれば、「200 16k」とします。
こうするとエラーログは確実に出ない。
大きい画像しかないのであれば「25 128k」として、
使うバッファの個数を減らすのが良いと思います。
proxy_busy_buffers_size
…すまない。よくわからない。
ただ、「proxy_buffer_size」の1倍~2倍と書いてあったので、2倍にした。
今のところ、特に問題はない。
対策まとめ
chromeのデベロッパーツールなどで、自分のサイトの各ファイルのサイズを確認。
そのサイズに合わせてプロキシのバッファを調整する。
そのため、人によって設定する値が違ってきます。
ここの部分があるので、どの解説サイトも違った数値です。
できるだけ無駄遣いしない設定にすることが大事。
CSS一つに128KBもバッファ(メモリ)を使ってはいけない。
2MBを超えるような画像を貼ってはいけない。
そんなところでproxy_buffer_sizeを調整していこう。
いつしかサイトの内容も変わると思うので、
やはりaccess.logとerror.logは毎日監視して適宜対応したいところです。