久しぶりのnginxの備忘録です。
nginxで頭を悩ませたの久しぶりだ・・・
事象
サーバA、Bを用意し、サーバAにnginx、サーバBにApatchを導入。
サーバBは動画ファイル(形式はm4s)を返却するOriginサーバとして動作しています。
このとき、サーバAにキャッシュの設定を入れることでサーバBへのアクセス軽減とレスポンス向上を図りました。
しかし、何故かサーバBを介してGETしたm4sファイルのキャッシュファイルがキャッシュ領域に生成してくれない。
キャッシュ領域のパーミッションやproxy_cache_validの設定などを何度見直しても間違っていない。
そんな状態でした。
環境
OS
CentOS Linux release 7.9.2009 (Core)
NGINXバージョン
nginx version: nginx/1.24.0
結論
結論から言うと、原因は
proxy_buffering off;
という設定にありました。
この設定はバッファリングをするかしないかの設定です。
プロキシサーバーからの応答のバッファリングを有効または無効にする。
バッファリングが有効になっていると、nginx はプロキシされた サーバからの応答をできるだけ早く受け取り、proxy_buffer_size ディレクティブと proxy_buffers ディレクティブで設定されたバッファに保存します。レスポンス全体がメモリに収まらない場合は、その一部をディスク上の一時ファイルに保存することができます。一時ファイルへの書き込みは proxy_max_temp_file_size と proxy_temp_file_write_size ディレクティブで制御される。
バッファリングが無効な場合、レスポンスは同期的にクライアントに渡されます。nginx がサーバから一度に受信できるデータの最大サイズは proxy_buffer_size ディレクティブで設定されます。
X-Accel-Buffering “レスポンスヘッダーフィールドに “yes “または “no “を渡すことで、バッファリングを有効または無効にすることもできます。この機能は proxy_ignore_headers ディレクティブで無効にすることができます。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering(Deepl翻訳)
とのことで、一見するとキャッシュの生成には全く影響しなさそうですが、何故かこの設定を入れるとキャッシュファイルが生成されませんでした。
色々探してみた結果、以下のような情報が。
プロキシバッファリングが無効な場合、NGINXはクライアントへの送信を開始する前に、サーバのレスポンスの最初の部分のみを、デフォルトで1メモリページのサイズ(オペレーティングシステムによって4KBまたは8KB)のバッファにバッファリングします。これは通常、レスポンスヘッダのための十分なスペースです。NGINXはその後、レスポンスを受信すると同期してクライアントに送信し、NGINXが次のレスポンスセグメントを受け付けるまでサーバーはアイドル状態になります。
そのため、proxy_bufferingがオフになっている設定をよく見かけるので驚いています。おそらく、クライアントが経験する待ち時間を減らすことを意図しているのでしょうが、その効果はごくわずかである一方、副作用は数多くあります。プロキシバッファリングが無効になっていると、レート制限やキャッシュが設定されていても機能せず、パフォーマンスが低下するなどです。
https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#proxy_buffering-off (Deepl翻訳)
まじで知らんかった・・・
というかめっちゃ探して情報がこれだけって・・・
それだけproxy_bufferingの設定を無効にする人が少ないってことなんですかね・・・。
コメント