Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法


投稿日:2019年4月19日
  • 1
  • 0



管理しているWebサイトで502 Bad Gatewayが発生していました。
Nginxのエラーログを見ると以下のようなログが流れていました。

2019/04/18 20:00:33 [error] 6793#0: *14604 upstream sent too big header while reading response header from upstream, client: 0.0.0.0, server: example.com, request: "GET /hoge HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "example.com"

upstream sent too big header while reading response header from upstream」の意味は「レスポンスヘッダーのサイズが大きすぎる」とのこと。

大抵の場合、大量のCookieをやり取りする際に発生します。そういった場合は設定ファイルでFastCGIレスポンスのためのバッファサイズを大きくすると解決します。

それぞれの意味については以下を参照

コンテキスト(設定が有効なセクション)は「http, server, location」となっています。通常はサーバ全体に反映させるのでhttpセクションだと思います。

# vi /etc/nginx/nginx.conf
    proxy_buffers 8 32K; # default 8 4k|8k
    proxy_buffer_size 32k; # default 4k|8k
    proxy_busy_buffers_size 64k; # default 8k|16k

proxy_busy_buffers_sizeは上記2つの設定で制限されるとあるので、今回のような場合はあえて設定しなくてもいいかもしれません。
設定が完了したら再起動して有効にします。

# /etc/init.d/nginx restart

ちなみにproxy_buffersですが実際にどれだけのサイズを使っているか調べる方法があります。
以下のリンクで算出方法を紹介しています。
Nginx FastCGI response buffer sizes

ページ中程にあるDetermine actual FastCGI response sizesの項目です。まずはphp-fpm.sockの値だけ抜き出して別ファイルにまとめます。
続いてphpfpmonly-access.logの応答を元に値を算出します。

$ awk '($9 ~ /200/) { i++;sum+=$10;max=$10>max?$10:max; } END { printf("Maximum: %d\nAverage: %d\n",max,i?sum/i:0); }' phpfpmonly-access.log

すると最大値と平均値が出されます。
とりあえず最大値でも溢れないように設定すれば問題ないと思います。

と、ここまではよくある話。
問題がリバースプロキシのバッファサイズだった場合、上記の設定で問題が解決します。しかし今回は一向に改善しません。試しに10倍の値にしても502エラーが出続けました。

PHP-FPMが原因で動かなかった場合の対処法

次に注目したのが以下の部分。

upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:"

特定のページやアプリではなく、PHP自体が停止の原因なのかもしれない…。ひょっとしたらPHP側にもバッファーの設定があるのか?と探したらありました。
fastcgi_bufferingという設定です。

解説の内、重要な部分は以下の部分

バッファリング無効な場合は、応答を受け取るとすぐにクライアントに同期して渡されます。nginxはFastCGIサーバから全ての応答を読み込もうとはしないでしょう。nginxがサーバから同時に受け取れるデータの最大サイズは、fastsgi_buffer_size ディレクティブによって設定されます。

どうやらPHP自体で大きなヘッダサイズの応答をする場合はこちらのほうも設定する必要があるようです。

それぞれの意味については以下を参照

今回は以下のように設定しました。

    fastcgi_buffers 8 32K; # default 8 4k|8k
    fastcgi_buffer_size 32k; # default 4k|8k
    fastcgi_busy_buffers_size 64k; # default 8k|16k

fastcgi_busy_buffers_sizeは上記の通り特に設定しなくても動きます。
この設定で再起動すると再び502エラーが出ることはありませんでした。上記2つの設定はあくまでバッファの最大サイズを増やしただけなので、大きなバッファサイズが必要なページは限定的なため、今回の設定によって特別メモリ消費が多くなることもありませんでした。


以上、よくあるproxy_buffersだけでなく、fastcgi_buffersも設定したほうが良いかもしれないよという投稿でした。
一番の問題はそんなに大きなヘッダサイズを消費するような設計ですが、自分の関知しないものもあるので、応急処置として設定しておきましょう。

がリバースプロキシの例と同じようにサイズを変更できるようです。


現在のページを共有する



現在のページに関連する記事

Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 NginxとFastCGIの組み合わせでHTTP_USER_AGENTが取得できない
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 Nginxとリバースプロキシ、php-fpmとOPcacheのインストールと設定
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 Nginx 1.6.2にngx_cache_purge 2.3組み込むんでコンパイルする方法
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 WordPressの特定のファイルに対してNginxでIPを規制する方法
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 iOSのWeb Clip機能で使うWebpage Iconのまとめと、作成方法
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 ロリポップ!でWebサイトのデータをzip圧縮してバックアップする方法
Nginxで502 Bad Gatewayの原因が「upstream sent too big header~」の場合の対処法 WordPress公式テーマTwenty Tenを子テーマでレスポンシブWebデザインに変更

おすすめの記事

コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう

コピペから脱出!iptablesの仕組みを理解して環境に合わせた設…

公式ドキュメントよりも詳しいTinyMCEの使い方(基本編)

公式ドキュメントよりも詳しいTinyMCEの使い方(基本編)

Mac OS 9時代のIDE接続のHDDをMacDrive 10を利用してWindows 10で読み込む方法

Mac OS 9時代のIDE接続のHDDをMacDrive 10を利用してWindows 10…

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

自前の国別IPv6、IPv4アドレス割当リストを作成しよう

自前の国別IPv6、IPv4アドレス割当リストを作成しよう

サーバの処理を自動実行するcronの仕組みと応用法

サーバの処理を自動実行するcronの仕組みと応用法

WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹底解説

WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹…

ImageMagickをWindowsのXAMPPに導入する方法

ImageMagickをWindowsのXAMPPに導入する方法


コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。