WooCommerceに基づくクライアントのWebサイトで作業しているときに、チェックアウトページが「502Badgateway」というエラーメッセージで失敗するのを偶然目にしました。この問題はNGINXが原因である可能性があり、それはたまたま真実でした。 'として読み取られたNGINXエラーログは、アップストリームリクエストからの応答ヘッダーの読み取り中に大きすぎるヘッダーを送信しました:GET / checkout / HTTP / 1.1、アップストリーム:fastcgi:// unix:/ var / run / php-fpm / php- fpm.sock ‘。このチュートリアルでは、エラーの内容とその修正方法について説明します。
エラー「アップストリームが読み取り中に大きすぎるヘッダーを送信しましたアップストリームからの応答ヘッダー」とはどういう意味ですか?
ページが受信側の容量よりも大きいヘッダーを送信しているように見えることを理解しています。しかし、サーバーが処理するには大きすぎるヘッダーサイズは何でしたか?エラーが発生したページはチェックアウトページで、カートに10個のアイテムが追加されていました。したがって、Cookie、ページのコンテンツはすべて高く、ヘッダーサイズが大きくなる可能性があります。では、応答ヘッダーに含まれるものを見つける方法は?簡単です。
- Chromeブラウザを起動し、右クリックして
Inspect
を選択します Network
をクリックします タブ- ページを再読み込み
- 左側のパネルから任意のHTTPリクエストを選択し、右側のパネルにHTTPヘッダーを表示します。
これで問題ありません。HTTPヘッダーを表示することはご存知でしょう。しかし、なぜサーバーは「アップストリームから応答ヘッダーを読み取っているときにアップストリームが大きすぎるヘッダーを送信しました」というエラーで失敗したのでしょうか。答えは、各Webサーバーに最大ヘッダーサイズが設定されており、送信されるHTTP要求ヘッダーがWebサーバーで設定されたものよりも大きすぎるということです。以下は、さまざまなWebサーバーでの最大ヘッダーサイズ制限です。
- Apache Webサーバー– 8K
- NGINX –4Kから8K
- IIS(バージョンごとに異なります)– 8K〜16K
- Tomcat(バージョンごとに異なります):8Kから48K。
私が使用しているWebサーバーはNGINXであるため、デフォルトのヘッダーサイズの制限は4Kから8Kです。デフォルトでは、NGINXはシステムページサイズを使用します。これはほとんどのシステムで4Kです。以下のコマンドを使用してそれを見つけることができます:
# getconf PAGESIZE 4096
NGINXFastCGI応答バッファサイズについて説明するスニペットを次に示します。
デフォルトでは、NginxがFastCGIバックエンド(PHP-FPMなど)からの応答の受信を開始すると、クライアントに配信する前に応答をメモリにバッファリングします。設定されたバッファサイズより大きい応答は、ディスク上の一時ファイルに保存されます。
FastCGI応答バッファリングに関連する2つのパラメータは次のとおりです。
fastcgi_buffers
fastcgi_buffer_size
fastcgi_buffers –FastCGI応答のペイロードに使用されるバッファセグメントの数とメモリサイズを制御します。
fastcgi_buffer_size –HTTP応答ヘッダーからのfastCGI応答の最初のチャンクを保持するために使用されるバッファーサイズを制御します。
NGNIXのドキュメントによると、fastCGI応答パラメータのデフォルト値を調整する必要はありません。NGINXはデフォルトで最小ページサイズの4KBを使用し、ほとんどのHTTPヘッダーリクエストに適合するはずです。しかし、私の場合には合わないようです。同じドキュメントによると、一部のフレームワークはSet-Cookie
を介して大量のCookieデータをプッシュする可能性があります HTTPヘッダーとそれがバッファを吹き飛ばし、HTTP500エラーが発生する可能性があります。このような場合、より大きなアップストリームHTTPヘッダーに対応するために、バッファサイズを8k / 16k/32kに増やす必要がある場合があります。
Webが受信したFastCGI応答サイズの平均と最大を見つける方法サーバー?
これは、NGINXアクセスログファイルをgrepすることで確認できます。これを行うには、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); }' access.log
私のWebサーバーでサンプルアウト:
Maximum: 3501304 Average: 21065
注 :HTTP200OK応答のみが考慮されました。
上記のスナップショットから、平均バッファサイズが21Kを超えていることが明らかです。そのため、平均リクエストよりもわずかに大きいバッファサイズを設定する必要があります。これは、おそらく32Kになる可能性があります。これを行うには、nginx.confファイルを開き、location
の下に以下の行を追加します セクション– location ~ \.php$ { }
fastcgi_buffers 32 32k; fastcgi_buffer_size 32k;
注 :より小さなバッファ値を設定する必要がある場合があります。平均サイズが21Kを超えていたため、32Kを設定しました。
FastCGI応答バッファーの詳細については、こちらをご覧ください。