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


投稿日:2019年4月19日
  • 0
  • 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デザインに変更

おすすめの記事

Web制作の自由度をフレームワークレベルまで高めたCorvid by Wix 

Web制作の自由度をフレームワークレベルまで高めたCorvid by Wi…

DNS Amp攻撃の解説と、踏み台にされないためのBIND DNSの設定

DNS Amp攻撃の解説と、踏み台にされないためのBIND DNSの設定

NexusFontが重い場合はWindows Font Cache Serviceを無効にしよう

NexusFontが重い場合はWindows Font Cache Serviceを無効にしよう

ClamAVとClamSMTPを利用してPostfixのメールをウイルスチェック

ClamAVとClamSMTPを利用してPostfixのメールをウイルスチェック

シンプルなスパムコメント対策プラグイン「Simple AntiSpam」を作成しました

シンプルなスパムコメント対策プラグイン「Simple AntiSpam」を…

誤って削除したGoogle Chromeのブックマークを復元する方法

誤って削除したGoogle Chromeのブックマークを復元する方法

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

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

初めてでも理解できるようになる「Firefox機能拡張の開発」

初めてでも理解できるようになる「Firefox機能拡張の開発」

パソコン用メガネなんていらない!無料でできる5つの疲れ目対策

パソコン用メガネなんていらない!無料でできる5つの疲れ目対策


コメントを残す

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

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