Upstream hat einen zu großen Header gesendet, während der Antwortheader von Upstream gelesen wurde

225

Ich erhalte folgende Fehler:

2014/05/24 11:49:06 [Fehler] 8376 # 0: * 54031 Upstream hat beim Lesen des Antwortheaders vom Upstream einen zu großen Header gesendet, Client: 107.21.193.210, Server: aamjanata.com, Anfrage: "GET / the- Gehirnwäsche-Chroniken-gesponsert-von-Gujarat-Regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- gesponsert von der gujarat-regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- Gujarat-Regierung /,% 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 / die-Gehirnwäsche-Chroniken-gesponsert-von-Gujarat-Regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- Gehirnwäsche-Chroniken-gesponsert-von-Gujarat-Regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- gesponsert von der gujarat-regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- Gujarat-Regierung /,% 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 / die-Gehirnwäsche-Chroniken-gesponsert-von-Gujarat-Regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- Gehirnwäsche-Chroniken-gesponsert-von-Gujarat-Regierung /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- gesponsert von der gujarat-regierung /,% 20ht

Es ist immer das gleiche. Eine URL, die immer wieder mit Komma getrennt wird. Ich kann nicht herausfinden, was dies verursacht. Hat jemand eine Idee?

Update: Ein weiterer Fehler:

http request count is zero while sending response to client

Hier ist die Konfiguration. Es gibt andere irrelevante Dinge, aber dieser Teil wurde hinzugefügt / bearbeitet

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;
    }

Und dann im Serverblock: setze $ 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";
    }`
Vidyut
quelle
Ihre Proxy-Konfiguration scheint nicht richtig zu sein. Können Sie die Konfiguration teilen?
Neo
können Sie versuchen hinzuzufügen: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
mögliches Duplikat von Upstream zu groß - Nginx + Codeigniter
Dnozay

Antworten:

405

Fügen Sie Ihrer conf-Datei Folgendes hinzu

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Neo
quelle
159
Während Ihre Antwort mich zur richtigen Antwort führte, sollten Sie zeigen, wie Sie die richtigen Puffergrößen bestimmen und warum dies wichtig ist. Ansonsten ist es ein Schuss in die Dunkelheit. Hier finden Sie eine Vorstellung von der Größe: gist.github.com/magnetikonline/…
Wes Johnson
4
"fastcgi_buffer_size 32k;" alleine funktionierte nicht, ich brauchte beide Zeilen, damit NginX neu gestartet werden konnte. Ich bin wegen eines 502-Fehlers mit NginX hierher gekommen, der durch ein WordPress-Plugin verursacht wurde.
PJ Brunet
5
Wenn fast_cgi_buffersSie nicht helfen, versuchen Sie die proxy_buffers Antwort unten von @amd
icc97
10
Jede Erklärung zu dieser Antwort bitte.
Edson Horacio Junior
5
Es funktioniert für mich, ich möchte nur hinzufügen, dass sich in Ubuntu 16.04 die Nginx-Konfigurationsdatei unter befindet /etc/nginx/nginx.confund die Werte in http {...}
Mario
133

Wenn nginx als Proxy / Reverse-Proxy ausgeführt wird

das heißt, für Benutzer von ngx_http_proxy_module

Darüber hinaus fastcgiist dieproxy speichert Modul den Anforderungsheader in einem temporären Puffer.

Daher müssen Sie möglicherweise auch das proxy_buffer_sizeund das erhöhen proxy_buffersoder es vollständig deaktivieren (Bitte lesen Sie die Nginx-Dokumentation ).

Beispiel für die Konfiguration der Proxy-Pufferung

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

Beispiel für das Deaktivieren Ihres Proxy-Puffers (empfohlen für lange Abfrageserver)

http {
  proxy_buffering off;
}

Weitere Informationen: Dokumentation zum Nginx-Proxy-Modul

amd
quelle
8
"proxy_busy_buffers_size" muss kleiner sein als die Größe aller "proxy_buffers" minus eines Puffers
chovy
du bist der Mann! Vielen Dank! erste Option funktionierte in meiner Ruby on Rails App
Nezir
Wahrscheinlich eine dumme Frage, aber ich habe einen Proxy vor dem Server, der diesen Fehler zurückgibt. Das Ändern des Puffers hat funktioniert, aber auf dem internen Computer wird ein neuer Fehler angezeigt. writev() failed (104: Connection reset by peer) while sending to client Würden diese Proxy-Einstellungen möglicherweise diesen Fehler beheben und würden sie auf den Upstream-Server oder den Proxy gehen?
Adam Patterson
1
Warum das proxy_buffers 4 ...? Da Standard 8 zu sein scheint
adrianTNT
23

upstream sent too big header while reading response header from upstream ist die generische Art von Nginx zu sagen: "Ich mag nicht, was ich sehe."

  1. Ihr Upstream-Server-Thread ist abgestürzt
  2. Der Upstream-Server hat einen ungültigen Header zurückgesendet
  3. Die von STDERR zurückgesendeten Mitteilungen / Warnungen liefen über ihren Puffer und sowohl er als auch STDOUT wurden geschlossen

3: Sehen Sie sich die Fehlerprotokolle über der Nachricht an. Streamen sie mit protokollierten Zeilen vor der Nachricht? PHP message: PHP Notice: Undefined index: Beispielausschnitt aus einer Schleife meiner Protokolldatei:

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

Sie können in der 3. Zeile von unten sehen, dass das Pufferlimit erreicht, gebrochen und der nächste Thread darüber geschrieben wurde. Nginx schloss dann die Verbindung und gab 502 an den Client zurück.

2: Protokollieren Sie alle pro Anforderung gesendeten Header, überprüfen Sie sie und stellen Sie sicher, dass sie den Standards entsprechen (nginx erlaubt nicht, dass ein Cookie älter als 24 Stunden gelöscht / abgelaufen wird, und sendet eine ungültige Inhaltslänge, da Fehlermeldungen gepuffert wurden, bevor der Inhalt gezählt wurde. ..). Der Funktionsaufruf getallheaders kann normalerweise in abstrakten Codesituationen hilfreich sein PHP alle Header

Beispiele beinhalten:

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

und das:

<?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: Überprüfen Sie oder erstellen Sie ein Skriptprotokoll, um sicherzustellen, dass Ihr Thread den richtigen Endpunkt erreicht und nicht vor Abschluss beendet wird.

ppostma1
quelle
3
Diese Antwort traf den Nagel im Kopf. Manchmal ist es nicht nur die Konfiguration von Nginx, sondern auch, was den Header tatsächlich erzeugt. Wenn error_reporting die Hinweise enthält, display_errors in php.ini deaktiviert ist, werden alle Nachrichten im FCGI-Header anstelle des Inhalts angezeigt.
Schien
16

Plesk Anweisungen

In Plesk 12 wurde Nginx als Reverse-Proxy ausgeführt (was meiner Meinung nach die Standardeinstellung ist). Die aktuelle Top-Antwort funktioniert also nicht, da Nginx auch als Proxy ausgeführt wird.

Ich ging zu Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Dann können Sie unten auf dieser Seite die zusätzlichen Nginx-Anweisungen festlegen, die ich als Kombination der beiden wichtigsten Antworten hier festgelegt habe:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
quelle
1
Wo? Welche Konfiguration?
Redsandro
@Redsandro Wenn Sie es nicht finden können, Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsbin ich mir nicht sicher, was Sie meinen?
icc97
Dies war die Lösung für mich: Domains> Domainname> Apache & Nginx-Einstellungen> Zusätzliche Nginx-Direktiven Plesk Onyx Version 17.8.11
dijkstra8x
1
Ich habe dies in eine neue Datei eingefügt /etc/nginx/conf.d/proxy.confund nginx neu gestartet, es funktioniert gut, danke!
rubo77
6

Wenn Sie das Symfony-Framework verwenden: Versuchen Sie zunächst, ChromePHP zu deaktivieren, bevor Sie mit der Nginx-Konfiguration herumspielen.

1 - Öffnen Sie die Datei app / config / config_dev.yml

2 - Kommentieren Sie diese Zeilen:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP packt die json-codierten Debug-Informationen in den X-ChromePhp-Data-Header, der für die Standardkonfiguration von nginx mit fastcgi zu groß ist.

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

Lucas Bustamante
quelle
3

Am Ende stellten wir fest, dass unser einziger Server, auf dem dies auftrat, die fpm-Konfiguration kaputt gemacht hatte, was dazu führte, dass PHP-Fehler / Warnungen / Hinweise, die normalerweise auf der Festplatte protokolliert wurden, über den FCGI-Socket gesendet wurden. Es sieht so aus, als ob es einen Parsing-Fehler gibt, wenn ein Teil des Headers auf die Pufferblöcke aufgeteilt wird.

Also einstellen php_admin_value[error_log] reichte auf etwas tatsächlich Beschreibbares zu setzen und php-fpm neu zu starten, um das Problem zu beheben.

Wir könnten das Problem mit einem kleineren Skript reproduzieren:

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

Das Erhöhen der Puffer machte die 502er schwerer zu treffen, aber nicht unmöglich, zB native:

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

Daher glaube ich, dass die richtige Antwort lautet: Korrigieren Sie Ihre fpm-Konfiguration, damit Fehler auf der Festplatte protokolliert werden.

Lyte
quelle
1

Dies ist immer noch die höchste SO-Frage bei Google, wenn nach diesem Fehler gesucht wird.

Wenn Sie diesen Fehler erhalten und nicht sofort in die NGINX-Einstellungen eintauchen möchten, sollten Sie Ihre Ausgaben an der Debug-Konsole überprüfen. In meinem Fall habe ich eine Menge Text an die FirePHP / Chromelogger-Konsole ausgegeben, und da dies alles als Header gesendet wird, hat dies den Überlauf verursacht.

Es ist möglicherweise nicht erforderlich, die Webserver-Einstellungen zu ändern, wenn dieser Fehler nur durch das Senden von wahnsinnig vielen Protokollnachrichten verursacht wird.

DavidKunz
quelle
0

Ich bin nicht sicher, ob das Problem damit zusammenhängt, welchen Header PHP sendet. Stellen Sie sicher, dass die Pufferung aktiviert ist. Der einfache Weg besteht darin, eine proxy.conf-Datei zu erstellen:

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;

Und eine fascgi.conf-Datei:

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;

Als nächstes müssen Sie sie auf Ihrem Standardkonfigurationsserver folgendermaßen aufrufen:

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;
 # ........
}
Macherif
quelle