l'upstream ha inviato un'intestazione troppo grande durante la lettura dell'intestazione della risposta dall'upstream


227

Ricevo questo tipo di errori:

2014/05/24 11:49:06 [errore] 8376 # 0: * 54031 upstream ha inviato un'intestazione troppo grande durante la lettura dell'intestazione di risposta dall'upstream, client: 107.21.193.210, server: aamjanata.com, richiesta: "GET / the- lavaggio del cervello-cronache-sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- Gujarat-governo /,% 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-lavaggio del cervello-cronache-sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- lavaggio del cervello-cronache-sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- Gujarat-governo /,% 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-lavaggio del cervello-cronache-sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- lavaggio del cervello-cronache-sponsorizzato-by-Gujarat-governo /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorizzato-by-Gujarat-governo /,% 20ht

È sempre lo stesso Un URL ripetuto più volte con la virgola che separa. Non riesco a capire cosa sta causando questo. Qualcuno ha un'idea?

Aggiornamento: un altro errore:

http request count is zero while sending response to client

Ecco la configurazione. Ci sono altre cose irrilevanti, ma questa parte è stata aggiunta / modificata

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

E poi nel blocco server: imposta $ 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";
    }`

la configurazione del proxy non sembra corretta. Puoi condividere la configurazione?
Neo,

puoi provare ad aggiungere: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo,

Risposte:


406

Aggiungi quanto segue al tuo file conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
Mentre la tua risposta mi ha portato alla risposta corretta, dovresti mostrare come determinare le dimensioni corrette del buffer e perché è importante. Altrimenti è uno sparo nel buio. Vedi qui per avere un'idea sul dimensionamento: gist.github.com/magnetikonline/…
Wes Johnson,

4
"fastcgi_buffer_size 32k;" da solo non ha funzionato, avevo bisogno di entrambe le linee per riavviare NginX. Sono venuto qui a causa di un errore 502 con NginX causato da un plug-in di WordPress.
PJ Brunet,

6
Se fast_cgi_buffersnon aiuta, prova la proxy_buffers risposta di seguito da @amd
icc97

11
Qualsiasi spiegazione su questa risposta per favore.
Edson Horacio Junior,

5
Funziona per me, voglio solo aggiungere che in Ubuntu 16.04 si trova il file di configurazione di nginx /etc/nginx/nginx.confe che i valori dovrebbero andare dentro http {...}
Mario,

134

Se nginx è in esecuzione come proxy / proxy inverso

cioè per gli utenti di ngx_http_proxy_module

Inoltre fastcgi, il proxymodulo salva anche l'intestazione della richiesta in un buffer temporaneo.

Quindi potrebbe essere necessario aumentare anche proxy_buffer_sizee proxy_buffers, o disabilitarla totalmente (Leggere la documentazione di nginx ).

Esempio di configurazione del buffer proxy

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

Esempio di disabilitazione del buffer proxy (consigliato per server di polling lunghi)

http {
  proxy_buffering off;
}

Per ulteriori informazioni: documentazione del modulo proxy Nginx


8
"proxy_busy_buffers_size" deve essere inferiore alla dimensione di tutti i "proxy_bus" meno un buffer
chovy

tu sei l'uomo! Grazie! la prima opzione ha funzionato nella mia app ruby ​​on rails
Nezir

Probabilmente una domanda sciocca, ma ho un proxy davanti al server che sta restituendo questo errore. La modifica del buffer ha funzionato, ma viene visualizzato un nuovo errore sulla macchina interna. writev() failed (104: Connection reset by peer) while sending to client Tali impostazioni del proxy potrebbero correggere quell'errore e andrebbero sul server upstream o sul proxy?
Adam Patterson,

1
Perché il proxy_buffers 4 ...? Poiché l'impostazione predefinita sembra essere 8
adrianTNT

23

upstream sent too big header while reading response header from upstream è il modo generico di nginx di dire "Non mi piace quello che vedo"

  1. Il thread del server upstream si è bloccato
  2. Il server upstream ha inviato indietro un'intestazione non valida
  3. L'avviso / gli avvisi restituiti da STDERR hanno traboccato il buffer e sia esso che STDOUT sono stati chiusi

3: Guarda i log degli errori sopra il messaggio, è in streaming con le linee registrate che precedono il messaggio? PHP message: PHP Notice: Undefined index: Esempio di frammento di un loop del mio file di registro:

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

puoi vedere nella terza riga dal basso che il limite del buffer è stato raggiunto, rotto e il thread successivo ha scritto sopra di esso. Nginx ha quindi chiuso la connessione e restituito 502 al client.

2: registra tutte le intestazioni inviate per richiesta, esaminale e assicurati che siano conformi agli standard (nginx non consente a nulla di più di 24 ore di eliminare / scadere un cookie, inviando una lunghezza del contenuto non valida perché i messaggi di errore sono stati bufferizzati prima del conteggio del contenuto. ..). La chiamata della funzione getallheaders può di solito dare una mano in situazioni di codice astratte php ottenere tutte le intestazioni

esempi inclusi:

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

e questo:

<?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: verifica o crea un registro degli script per assicurarti che il thread raggiunga il punto finale corretto e non esca prima del completamento.


3
Questa risposta ha colpito l'unghia in testa. A volte non è solo la configurazione di nginx, ma ciò che effettivamente produce l'intestazione. Quando error_reporting contiene gli avvisi ma display_errors è disattivato in php.ini, tutti i messaggi vengono visualizzati nell'intestazione FCGI anziché nel contenuto.
Schien,

17

Istruzioni Plesk

In Plesk 12, avevo nginx in esecuzione come proxy inverso (che penso sia il valore predefinito). Quindi l'attuale risposta principale non funziona poiché nginx viene eseguito anche come proxy.

Sono andato a Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Quindi in fondo a quella pagina puoi impostare le direttive addizionali nginx che ho impostato per essere una combinazione delle prime due risposte qui:

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

1
Dove? Quale configurazione?
Redsandro,

@Redsandro Se non riesci a trovarlo tramite, Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsnon sono sicuro di cosa intendi?
icc97,

questa era la soluzione per me: Domini> Nome dominio> Impostazioni Apache e nginx> Ulteriori direttive nginx Plesk Onyx Versione 17.8.11
dijkstra8x

1
Ho aggiunto questo in un nuovo file /etc/nginx/conf.d/proxy.confe riavviato nginx, funziona bene, grazie!
rubo77,

6

Se stai usando il framework Symfony: prima di giocare con Nginx config, prova prima a disabilitare ChromePHP.

1 - Apri l'app / config / config_dev.yml

2 - Commenta queste righe:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP racchiude le informazioni di debug codificate json nell'intestazione X-ChromePhp-Data, che è troppo grande per la configurazione predefinita di nginx con fastcgi.

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


3

Alla fine ci siamo resi conto che il nostro unico server che stava vivendo questo aveva eliminato la configurazione di fpm con conseguente errori / avvisi / avvisi php che sarebbero stati normalmente registrati su disco e inviati sul socket FCGI. Sembra che ci sia un bug di analisi quando parte dell'intestazione viene suddivisa tra i blocchi di buffer.

Quindi impostare php_admin_value[error_log]qualcosa in realtà scrivibile e riavviare php-fpm è stato sufficiente per risolvere il problema.

Potremmo riprodurre il problema con uno script più piccolo:

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

Aumentare i buffer ha reso i 502 più difficili da colpire ma non impossibili, ad esempio nativi:

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

Quindi credo che la risposta corretta sia: correggi la tua configurazione di fpm in modo che registri gli errori sul disco.


1

Questa è ancora la più alta domanda SO su Google quando si cerca questo errore, quindi andiamo a sbatterlo.

Quando si ottiene questo errore e non si desidera immergersi immediatamente nelle impostazioni NGINX, è possibile che si desideri controllare gli output nella console di debug. Nel mio caso stavo inviando un sacco di testo alla console di FirePHP / Chromelogger, e poiché tutto questo veniva inviato come intestazione, stava causando l'overflow.

Potrebbe non essere necessario modificare le impostazioni del server web se questo errore è causato dall'invio di quantità insane di messaggi di log.


0

Non sono sicuro che il problema sia correlato all'intestazione php che sta inviando. Assicurarsi che il buffering sia abilitato. Il modo semplice è creare un file 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;

E un file 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;

Successivamente è necessario chiamarli nel server di configurazione predefinito in questo modo:

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;
 # ........
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.