GNU/Linux >> Linux の 問題 >  >> Linux

アップストリームから応答ヘッダーを読み取っているときにアップストリームが大きすぎるヘッダーを送信しました–NGINXエラー

WooCommerceに基づくクライアントのWebサイトで作業しているときに、チェックアウトページが「502Badgateway」というエラーメッセージで失敗するのを偶然目にしました。この問題はNGINXが原因である可能性があり、それはたまたま真実でした。 'として読み取られたNGINXエラーログは、アップストリームリクエストからの応答ヘッダーの読み取り中に大きすぎるヘッダーを送信しました:GET / checkout / HTTP / 1.1、アップストリーム:fastcgi:// unix:/ var / run / php-fpm / php- fpm.sock ‘。このチュートリアルでは、エラーの内容とその修正方法について説明します。

エラー「アップストリームが読み取り中に大きすぎるヘッダーを送信しましたアップストリームからの応答ヘッダー」とはどういう意味ですか?

ページが受信側の容量よりも大きいヘッダーを送信しているように見えることを理解しています。しかし、サーバーが処理するには大きすぎるヘッダーサイズは何でしたか?エラーが発生したページはチェックアウトページで、カートに10個のアイテムが追加されていました。したがって、Cookie、ページのコンテンツはすべて高く、ヘッダーサイズが大きくなる可能性があります。では、応答ヘッダーに含まれるものを見つける方法は?簡単です。

  1. Chromeブラウザを起動し、右クリックしてInspectを選択します
  2. Networkをクリックします タブ
  3. ページを再読み込み
  4. 左側のパネルから任意の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応答バッファーの詳細については、こちらをご覧ください。


Linux
  1. nginx-413リクエストエンティティが大きすぎます

  2. Mysqlエラーの解決:開いているファイルが多すぎます

  3. 502 Bad Gateway ErrorNGINX[解決策]

  1. Bashを使用してファイルから行を読み取る:対その間?

  2. ファイルからGrepパターンを読み取る?

  3. HTTP応答ステータスコード

  1. rpm:共有ライブラリのロード中にエラーが発生しました:ELF ヘッダーが無効です

  2. 「引数リストが長すぎます」というエラーでディレクトリからファイルを削除できない

  3. リロード中にnginx構成ファイルを設定しても、Nginxはデフォルトのエラーログファイルを開こうとします