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デザインに変更

おすすめの記事

WordPressでアイキャッチ画像をサムネイルとして一覧ページに表示する方法

WordPressでアイキャッチ画像をサムネイルとして一覧ページに表…

WordPress公式テーマTwenty Tenを子テーマでレスポンシブWebデザインに変更

WordPress公式テーマTwenty Tenを子テーマでレスポンシブWebデ…

Windows 10でpsd形式のファイルをサムネイル表示する方法

Windows 10でpsd形式のファイルをサムネイル表示する方法

Googlebotを手懐ける!robots.txtの書き方とrobots.txtテスターの使い方

Googlebotを手懐ける!robots.txtの書き方とrobots.txtテスター…

知らなきゃ損!WordPressの表(テーブル)はExcelで作ろう!

知らなきゃ損!WordPressの表(テーブル)はExcelで作ろう!

ページ編集の手間を劇的に減らす、Custom Field Templateでカスタムフィールドを作る方法

ページ編集の手間を劇的に減らす、Custom Field Templateでカス…

Linuxの基本の基本。Linuxの基本的なディレクトリ構成

Linuxの基本の基本。Linuxの基本的なディレクトリ構成

サーバリソースをリアルタイムに監視するdstatのインストールと使い方

サーバリソースをリアルタイムに監視するdstatのインストールと…


コメントを残す

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

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