upstream envió un encabezado demasiado grande al leer el encabezado de respuesta

227

Recibo este tipo de errores:

24/05/2014 11:49:06 [error] 8376 # 0: * 54031 upstream envió un encabezado demasiado grande al leer el encabezado de respuesta de upstream, cliente: 107.21.193.210, servidor: aamjanata.com, solicitud: "GET / the- brainwash-chronicles-patrocinado-por-gobierno-gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-por-gujarat-gogo/,% 20https: /aamjanata.com/the-brainwash-chronicles- patrocinado-por-gobierno-gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsors-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by- gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-gogo//% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-gogo/ ,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-por-gujarat-government /,% 20https: / aamjanata.com / the-brainwash-chronicles-patrocinado-por-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-government /,% 20https: /aamjanata.com/the- brainwash-chronicles-patrocinado-por-gobierno-gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-por-gujarat-gogo/,% 20https: /aamjanata.com/the-brainwash-chronicles- patrocinado-por-gobierno-gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsors-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by- gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-government/,%20https: //aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-gogo /,%20https:/aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-government/,%20https:/aamjanata.com / the-brainwash-chronicles-patrocinado-por-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-by-gujarat-government /,% 20https: /aamjanata.com/the- brainwash-chronicles-patrocinado-por-gobierno-gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-spon patrocinado-por-gujarat-gogo/,% 20https: /aamjanata.com/the-brainwash-chronicles- patrocinado por el gobierno de gujarat /,% 20ht

Siempre es lo mismo. Una url repetida una y otra vez con comas separadas. No puedo entender qué está causando esto. ¿Alguien tiene una idea?

Actualización: otro error:

http request count is zero while sending response to client

Aquí está la configuración. Hay otras cosas irrelevantes, pero esta parte fue agregada / editada

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

Y luego en el bloque del servidor: establezca $ 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
fuente
su configuración de proxy no parece correcta. ¿Puedes compartir la configuración?
Neo
¿Puedes intentar agregar: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
posible duplicado de Upstream demasiado grande - nginx + codeigniter
dnozay

Respuestas:

407

Agregue lo siguiente a su archivo conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Neo
fuente
161
Si bien su respuesta me llevó a la respuesta correcta, debe mostrar cómo determinar los tamaños correctos del búfer y por qué eso es importante. De lo contrario, es un tiro en la oscuridad. Vea aquí para tener una idea sobre el tamaño: gist.github.com/magnetikonline/…
Wes Johnson
44
"fastcgi_buffer_size 32k;" solo no funcionó, necesitaba ambas líneas para que NginX se reiniciara. Vine aquí debido a un error 502 con NginX causado por un complemento de WordPress.
PJ Brunet
66
Si fast_cgi_buffersno ayuda, intente la proxy_buffers respuesta a continuación por @amd
icc97
11
Cualquier explicación sobre esta respuesta por favor.
Edson Horacio Junior
55
Funciona para mí, solo quiero agregar que en ubuntu 16.04 el archivo de configuración nginx se encuentra en /etc/nginx/nginx.confy los valores deben ir dentro de http {...}
Mario
134

Si nginx se ejecuta como proxy / proxy inverso

es decir, para usuarios de ngx_http_proxy_module

Además fastcgi, el proxymódulo también guarda el encabezado de la solicitud en un búfer temporal.

Por lo tanto, es posible que también necesite aumentar el proxy_buffer_sizey elproxy_buffers deshabilitarlo por completo (lea la documentación de nginx ).

Ejemplo de configuración de búfer de proxy

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

Ejemplo de deshabilitación de su búfer proxy (recomendado para servidores de sondeo largos)

http {
  proxy_buffering off;
}

Para más información: documentación del módulo proxy Nginx

amd
fuente
8
"proxy_busy_buffers_size" debe ser menor que el tamaño de todos los "proxy_buffers" menos un buffer
chovy
¡tu eres el hombre! ¡Gracias! primera opción trabajó en mi rubí en los carriles aplicación
Nezir
Probablemente sea una pregunta tonta, pero tengo un proxy frente al servidor que devuelve este error. Cambiar el búfer funcionó, pero recibo un nuevo error en la máquina interna. writev() failed (104: Connection reset by peer) while sending to client ¿Es posible que esa configuración de proxy solucione ese error y que vaya al servidor ascendente o al proxy?
Adam Patterson el
1
¿Por qué el proxy_buffers 4 ...? Dado que el valor predeterminado parece ser 8
adrianTNT
23

upstream sent too big header while reading response header from upstream es la forma genérica de nginx de decir "No me gusta lo que estoy viendo"

  1. Su subproceso del servidor ascendente se bloqueó
  2. El servidor ascendente devolvió un encabezado no válido
  3. Los avisos / advertencias enviados desde STDERR desbordaron su búfer y tanto él como STDOUT se cerraron

3: Mire los registros de error sobre el mensaje, ¿está transmitiendo con líneas registradas que preceden al mensaje? PHP message: PHP Notice: Undefined index: Fragmento de ejemplo de un bucle mi archivo de 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

Puedes ver en la tercera línea desde la parte inferior que el límite del búfer se alcanzó, se rompió y el siguiente hilo escribió sobre él. Nginx luego cerró la conexión y devolvió 502 al cliente.

2: registre todos los encabezados enviados por solicitud, revíselos y asegúrese de que cumplan con los estándares (nginx no permite que nada anterior a 24 horas elimine / caduque una cookie, enviando contenido no válido porque se almacenaron mensajes de error antes de que el contenido contara. ..). La llamada a la función getallheaders generalmente puede ayudar en situaciones de código abstracto php obtener todos los encabezados

Ejemplos incluyen:

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

y esto:

<?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: verifique o cree un registro de secuencia de comandos para asegurarse de que su hilo llegue al punto final correcto y no salga antes de la finalización.

ppostma1
fuente
3
Esta respuesta dio en el clavo. A veces no es solo la configuración de nginx, sino lo que realmente está produciendo el encabezado. Cuando error_reporting contiene los avisos pero display_errors está desactivado en php.ini, todos los mensajes se muestran en el encabezado FCGI en lugar de contenido.
Schien
17

Instrucciones de Plesk

En Plesk 12, tenía nginx ejecutándose como un proxy inverso (que creo que es el predeterminado). Por lo tanto, la respuesta principal actual no funciona, ya que nginx también se ejecuta como proxy.

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

Luego, en la parte inferior de esa página, puede establecer las directivas Adicionales nginx que configuro para ser una combinación de las dos respuestas principales aquí:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
fuente
1
¿Dónde? Cual config?
Redsandro
@Redsandro Si no puede encontrarlo a través de, Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsentonces no estoy seguro de lo que quiere decir.
icc97
esta fue la solución para mí: Dominios> Nombre de dominio> Configuración de Apache y nginx> Directivas adicionales de nginx Plesk Onyx Versión 17.8.11
dijkstra8x
1
Agregué esto en un nuevo archivo /etc/nginx/conf.d/proxy.confy reinicié nginx, funciona bien, ¡gracias!
rubo77
6

Si está utilizando el marco de Symfony: antes de jugar con la configuración de Nginx, primero intente deshabilitar ChromePHP.

1 - Abra la aplicación / config / config_dev.yml

2 - Comenta estas líneas:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP incluye la información de depuración codificada en json en el encabezado X-ChromePhp-Data, que es demasiado grande para la configuración predeterminada de nginx con fastcgi.

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

Lucas Bustamante
fuente
3

Terminamos dándonos cuenta de que nuestro único servidor que estaba experimentando esto había roto la configuración de fpm, lo que resultó en errores / advertencias / avisos de php que normalmente se registraban en el disco se enviaban a través del zócalo FCGI. Parece que hay un error de análisis cuando parte del encabezado se divide entre los fragmentos de búfer.

Entonces configurando php_admin_value[error_log] algo realmente escribible y reiniciar php-fpm fue suficiente para solucionar el problema.

Podríamos reproducir el problema con un script más pequeño:

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

Elevar los búferes hizo que los 502 fueran más difíciles de alcanzar pero no imposibles, por ejemplo, nativos:

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

Entonces, creo que la respuesta correcta es: arregle su configuración de fpm para que registre los errores en el disco.

Lyte
fuente
1

Esta sigue siendo la pregunta SO más alta en Google cuando se busca este error, así que vamos a solucionarlo.

Al recibir este error y no querer profundizar en la configuración de NGINX de inmediato, es posible que desee verificar sus salidas a la consola de depuración. En mi caso, estaba enviando un montón de texto a la consola FirePHP / Chromelogger, y como todo esto se envía como un encabezado, estaba causando el desbordamiento.

Es posible que no sea necesario cambiar la configuración del servidor web si este error se debe al simple envío de cantidades increíbles de mensajes de registro.

DavidKunz
fuente
0

No estoy seguro de que el problema esté relacionado con el encabezado que envía php. Asegúrese de que el almacenamiento en búfer esté habilitado. La manera simple es crear un archivo 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;

Y un archivo 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;

A continuación, debe llamarlos en su servidor de configuración predeterminado de esta manera:

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
fuente