アップストリームからの応答ヘッダーの読み取り中に、アップストリームが送信したヘッダーが大きすぎます


227

次のようなエラーが発生します。

2014/05/24 11:49:06 [エラー] 8376#0:* 54031アップストリームがアップストリームからの応答ヘッダーの読み取り中に大きすぎるヘッダーを送信、クライアント:107.21.193.210、サーバー:aamjanata.com、リクエスト: "GET / the- brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles- Sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by- gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/ 、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/ aamjanata。com / the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the- brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles- Sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by- gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https://aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20https:/aamjanata。com / the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the- brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /、%20https:/aamjanata.com/the-brainwash-chronicles-グジャラート州政府//、%20ht

常に同じです。URLは、カンマ区切りで繰り返し繰り返されます。これを引き起こしている原因を理解できません。誰かがアイデアを持っていますか?

更新:別のエラー:

http request count is zero while sending response to client

これが設定です。他にも無関係なものがありますが、この部分が追加・編集されました

fastcgi_cache_path /var/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
            #this should match value of "listen" directive in php-fpm pool
            server unix:/var/run/php5-fpm.sock;
    }

そして、サーバーブロックで:$ skip_cache 0を設定します。

    # POST requests and urls with a query string should always go to PHP
    if ($request_method = POST) {
            set $skip_cache 1;
    }
    if ($query_string != "") {
            set $skip_cache 1;
    }

    # Don't cache uris containing the following segments
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
    }

    # Don't use the cache for logged in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
            set $skip_cache 1;
    }

    location / {
            # This is cool because no php is touched for static content.
            # include the "?$args" part so non-default permalinks doesn't break when using query string
            try_files $uri $uri/ /index.php?$args;
    }


    location ~ \.php$ {
            try_files $uri /index.php;
            include fastcgi_params;
            fastcgi_pass php;
            fastcgi_read_timeout 3000;

            fastcgi_cache_bypass $skip_cache;
            fastcgi_no_cache $skip_cache;

            fastcgi_cache WORDPRESS;
            fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }`

プロキシ設定が正しくないようです。設定を共有できますか?
ネオ

追加してみてください:fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo

回答:


406

以下をconfファイルに追加してください

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
あなたの答えが私を正しい反応に導いてくれましたが、正しいバッファサイズを決定する方法とそれが重要な理由を示す必要があります。そうでなければ、それは暗闇の中でのショットです。サイズ上のアイデアを得るためにここを参照してください:gist.github.com/magnetikonline/...を
ウェス・ジョンソン

4
「fastcgi_buffer_size 32k;」単独では機能しなかったため、NginXを再起動するには両方の行が必要でした。WordPressプラグインが原因のNginXでの502エラーのため、ここに来ました。
PJ Brunet

6
fast_cgi_buffers助けにならない場合は、@ amdによるproxy_buffers 以下答えを試してください
icc97

11
この回答についての説明があれば教えてください。
エドソンオラシオジュニア

5
それは私のために働きます、私はちょうどubuntu 16.04でnginx設定ファイルが置かれていることを追加したいと思います/etc/nginx/nginx.conf、そして値はhttp {...}の中に入るはずです
マリオ

134

nginxがプロキシ/リバースプロキシとして実行されている場合

つまり、 ngx_http_proxy_module

に加えてfastcgiproxyモジュールはリクエストヘッダーを一時バッファに保存します。

そのため、proxy_buffer_sizeおよびを増やすproxy_buffersか、完全に無効にする必要がある場合があります(nginxのドキュメントをお読みください)。

プロキシバッファリング構成の例

http {
  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;
}

プロキシバッファを無効にする例(長時間のポーリングサーバーに推奨)

http {
  proxy_buffering off;
}

詳細情報:Nginxプロキシモジュールのドキュメント


8
「proxy_busy_buffers_sizeは、」すべて「proxy_buffers」マイナス1つのバッファのサイズよりも小さくなければなりません
chovy

あなたは男です!ありがとう!Ruby on Railsアプリで最初のオプションが機能した
Nezir

おそらくばかげた質問ですが、サーバーの前にこのエラーを返すプロキシがあります。バッファの変更は機能しましたが、内部のマシンで新しいエラーが発生しました。writev() failed (104: Connection reset by peer) while sending to client それらのプロキシ設定はおそらくそのエラーを修正しますか、そして上流のサーバーまたはプロキシに行きますか?
Adam Patterson、

1
なぜproxy_buffers 4 ...?デフォルトは8のようです
adrianTNT

23

upstream sent too big header while reading response header from upstream nginxの「私が見ているものが気に入らない」という一般的な言い方です

  1. アップストリームサーバースレッドがクラッシュしました
  2. アップストリームサーバーが無効なヘッダーを送り返しました
  3. STDERRから送信された通知/警告がバッファをオーバーフローさせ、バッファとSTDOUTの両方が閉じられました

3:メッセージの上にあるエラーログを見てください。メッセージの前にログ行が記録されていますか? PHP message: PHP Notice: Undefined index: ループのログファイルのサンプルスニペット:

2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
... // 20 lines of same
PHP message: PHP Notice:  Undefined index: Firstname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Lastname in /srv/www/classes/data_convert.php on line 1090
PHP message: PHP Notice:  Undef
2015/11/23 10:30:02 [error] 32451#0: *580927 FastCGI sent in stderr: "ta_convert.php on line 1090
PHP message: PHP Notice:  Undefined index: Firstname

下から3行目で、バッファ制限に達して壊れ、次のスレッドがその上に書き込んだことがわかります。次にNginxは接続を閉じ、クライアントに502を返しました。

2:リクエストごとに送信されたすべてのヘッダーをログに記録し、それらを確認して標準に準拠していることを確認します(nginxは、コンテンツがカウントされる前にエラーメッセージがバッファーに入れられたため、無効なコンテンツの長さを送信して、24時間以上経過したcookieを削除することを許可していません。 ..)。getallheaders関数呼び出しは、通常、抽象化されたコードの状況で役立ちます phpがすべてのヘッダーを取得

例は次のとおりです。

<?php
//expire cookie
setcookie ( 'bookmark', '', strtotime('2012-01-01 00:00:00') );
// nginx will refuse this header response, too far past to accept
....
?>

この:

<?php
header('Content-type: image/jpg');
?>

<?php   //a space was injected into the output above this line
header('Content-length: ' . filesize('image.jpg') );
echo file_get_contents('image.jpg');
// error! the response is now 1-byte longer than header!!
?>

1:スレッドが正しいエンドポイントに到達し、完了前に終了しないことを確認するため、またはスクリプトログを作成します。


3
この答えは頭の中に釘を打ちました。時々、それはnginxの設定だけではなく、実際にヘッダーを生成しているものです。error_reportingに通知が含まれているが、php.iniでdisplay_errorsがオフの場合、すべてのメッセージがコンテンツではなくFCGIヘッダーに表示されます。
スキー

17

Pleskの手順

Plesk 12では、nginxをリバースプロキシとして実行していました(これがデフォルトだと思います)。そのため、nginxもプロキシとして実行されているため、現在の上位の回答は機能しません。

に行きました Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings

次に、そのページの下部で、ここで上位2つの回答の組み合わせになるように設定した追加のnginxディレクティブを設定できます。

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

1
どこ?どの構成ですか?
Redsandro 2017年

@Redsandroあなたがそれを介してSubscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsそれを見つけることができない場合、私はあなたが何を意味するのかわかりませんか?
icc97 2017年

これは私にとっての解決策でした:ドメイン>ドメイン名> Apacheとnginxの設定>追加のnginxディレクティブPlesk Onyxバージョン17.8.11
dijkstra8x

1
これを新しいファイルに追加/etc/nginx/conf.d/proxy.confしてnginxを再起動しました。正常に動作します。ありがとう!
rubo77

6

Symfonyフレームワークを使用している場合:Nginxの設定をいじる前に、まずChromePHPを無効にしてみてください。

1-app / config / config_dev.ymlを開きます

2-次の行にコメントを付けます。

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHPは、X-ChromePhp-Dataヘッダーにjsonでエンコードされたデバッグ情報をパックします。これは、fastcgiを使用したnginxのデフォルト設定には大きすぎます。

出典:https//github.com/symfony/symfony/issues/8413#issuecomment-20412848


3

これを経験している1台のサーバーがfpm設定を無効にし、通常はディスクに記録されるphpエラー/警告/通知がFCGIソケット経由で送信されていることに気づきました。ヘッダーの一部がバッファチャンク全体に分割されると、解析バグがあるようです。

したがって、php_admin_value[error_log]実際に書き込み可能なものに設定し、php-fpmを再起動するだけで問題を解決できました。

小さなスクリプトで問題を再現できます。

<?php
for ($i = 0; $i<$_GET['iterations']; $i++)
    error_log(str_pad("a", $_GET['size'], "a"));
echo "got here\n";

バッファを上げると、502はヒットしにくくなりましたが、不可能ではありませんでした。たとえば、ネイティブ:

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=121 iterations=30 < HTTP/1.1 502 Bad Gateway
size=109 iterations=33 < HTTP/1.1 502 Bad Gateway
size=232 iterations=33 < HTTP/1.1 502 Bad Gateway
size=241 iterations=48 < HTTP/1.1 502 Bad Gateway
size=145 iterations=51 < HTTP/1.1 502 Bad Gateway
size=226 iterations=51 < HTTP/1.1 502 Bad Gateway
size=190 iterations=60 < HTTP/1.1 502 Bad Gateway
size=115 iterations=63 < HTTP/1.1 502 Bad Gateway
size=109 iterations=66 < HTTP/1.1 502 Bad Gateway
size=163 iterations=69 < HTTP/1.1 502 Bad Gateway
[... there would be more here, but I piped through head ...]

fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;

bash-4.1# for it in {30..200..3}; do for size in {100..250..3}; do echo "size=$size iterations=$it $(curl -sv "http://localhost/debug.php?size=$size&iterations=$it" 2>&1 | egrep '^< HTTP')"; done; done | grep 502 | head
size=223 iterations=69 < HTTP/1.1 502 Bad Gateway
size=184 iterations=165 < HTTP/1.1 502 Bad Gateway
size=151 iterations=198 < HTTP/1.1 502 Bad Gateway

正解は次のとおりです。エラーをディスクに記録するようにfpm設定を修正してください。


1

これは、このエラーを検索するときのGoogleでの最高のSO質問であるので、ぶつかってみましょう。

このエラーが発生し、すぐにNGINX設定を詳しく調べたくない場合は、デバッグコンソールへの出力を確認することをお勧めします。私の場合、FirePHP / Chromeloggerコンソールに大量のテキストを出力していましたが、これはすべてヘッダーとして送信されるため、オーバーフローが発生していました。

異常な量のログメッセージを送信しただけでこのエラーが発生した場合は、Webサーバーの設定を変更する必要がない場合があります。


0

問題がphpが送信しているヘッダーに関連していることはわかりません。バッファリングが有効になっていることを確認してください。簡単な方法は、proxy.confファイルを作成することです。

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    100m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffering         on;
proxy_buffer_size       128k;
proxy_buffers           4 256k;
proxy_busy_buffers_size 256k;

そしてfascgi.confファイル:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_buffers 128 4096k;
fastcgi_buffer_size 4096k;
fastcgi_index  index.php;
fastcgi_param  REDIRECT_STATUS    200;

次に、デフォルトの構成サーバーで次のように呼び出す必要があります。

http {
  include    /etc/nginx/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  #access_log   /logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
 # ........
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.