upstream enviou cabeçalho muito grande ao ler o cabeçalho de resposta do upstream

227

Estou recebendo este tipo de erro:

2014/05/24 11:49:06 [erro] 8376 # 0: * 54031 upstream enviou cabeçalho muito grande ao ler o cabeçalho de resposta do upstream, cliente: 107.21.193.210, servidor: aamjanata.com, solicitação: "GET / the- crônicas de lavagem cerebral patrocinadas pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- patrocinado pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- governo de gujarat /,% 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 / as crônicas de lavagem cerebral patrocinadas pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- crônicas de lavagem cerebral patrocinadas pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- patrocinado pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- governo de gujarat /,% 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 / as crônicas de lavagem cerebral patrocinadas pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- crônicas de lavagem cerebral patrocinadas pelo governo de gujarat /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- governo patrocinado pelo gujarat /,% 20ht

Sempre é o mesmo. Um URL repetido várias vezes com vírgula separando. Não consigo descobrir o que está causando isso. Alguém tem uma ideia?

Atualização: outro erro:

http request count is zero while sending response to client

Aqui está a configuração. Existem outras coisas irrelevantes, mas esta parte foi adicionada / 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;
    }

E então no bloco do servidor: defina $ 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
fonte
sua configuração de proxy não parece correta. Você pode compartilhar a configuração?
Neo
você pode tentar adicionar: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
possível duplicata de Upstream muito grande - nginx + codeigniter
dnozay

Respostas:

406

Adicione o seguinte ao seu arquivo conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Neo
fonte
160
Embora sua resposta tenha me levado à resposta correta, você deve mostrar como determinar os tamanhos corretos de buffer e por que isso importa. Caso contrário, é um tiro no escuro. Veja aqui para ter uma idéia do dimensionamento: gist.github.com/magnetikonline/…
Wes Johnson
4
"fastcgi_buffer_size 32k;" sozinho não funcionou, eu precisava das duas linhas para o NginX reiniciar. Eu vim aqui por causa de um erro 502 com o NginX causado por um plugin do WordPress.
PJ Brunet
6
Se fast_cgi_buffersnão ajudar, tente a proxy_buffers resposta abaixo por @amd
icc97
11
Qualquer explicação sobre esta resposta, por favor.
Edson Horacio Junior
5
Isso funciona para mim, eu só quero acrescentar que no ubuntu 16.04 o arquivo de configuração nginx está localizado em /etc/nginx/nginx.confe os valores devem ir dentro de http {...} #
2626 Mario Mario
134

Se o nginx estiver sendo executado como proxy / proxy reverso

isto é, para usuários de ngx_http_proxy_module

Além disso fastcgi, o proxymódulo também salva o cabeçalho da solicitação em um buffer temporário.

Assim você pode precisar também para aumentar a proxy_buffer_sizeea proxy_buffersou desativá-lo totalmente (Por favor, leia a documentação nginx ).

Exemplo de configuração de buffer de proxy

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

Exemplo de desativação do seu buffer proxy (recomendado para servidores de sondagem longa)

http {
  proxy_buffering off;
}

Para obter mais informações: Documentação do módulo proxy Nginx

amd
fonte
8
"proxy_busy_buffers_size" deve ser menor do que o tamanho de todos os "proxy_buffers" menos um tampão
Chovy
você é o cara! obrigado! primeira opção trabalhou no meu ruby on rails app
Nezir
Provavelmente é uma pergunta boba, mas tenho um proxy na frente do servidor que está retornando esse erro. Alterar o buffer funcionou, mas recebo um novo erro na máquina interna. writev() failed (104: Connection reset by peer) while sending to client Essas configurações de proxy possivelmente corrigiriam esse erro e iriam para o servidor upstream ou o proxy?
Adam Patterson
1
Por que o proxy_buffers 4 ...? Como o padrão parece ser 8
adrianTNT
23

upstream sent too big header while reading response header from upstream é a maneira genérica do nginx de dizer "não gosto do que estou vendo"

  1. O encadeamento do servidor upstream falhou
  2. O servidor upstream enviou um cabeçalho inválido de volta
  3. O Aviso / Avisos enviados de STDERR transbordou seu buffer e ele e STDOUT foram fechados

3: Veja os logs de erro acima da mensagem. Ele está transmitindo com linhas registradas que precedem a mensagem? PHP message: PHP Notice: Undefined index: Exemplo de trecho de um loop do meu arquivo de log:

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

você pode ver na terceira linha, de baixo, que o limite do buffer foi atingido, quebrou e o próximo segmento escreveu sobre ele. O Nginx então fechou a conexão e retornou 502 ao cliente.

2: registre todos os cabeçalhos enviados por solicitação, revise-os e certifique-se de que estejam em conformidade com os padrões (o nginx não permite que nada mais de 24 horas exclua / expire um cookie, enviando tamanho de conteúdo inválido porque as mensagens de erro foram armazenadas em buffer antes da contagem do conteúdo. ..) A chamada de função getallheaders geralmente pode ajudar em situações de código abstraídas php get all headers

exemplos incluem:

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

e isto:

<?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 ou faça um log de script, para garantir que seu encadeamento alcance o ponto final correto e não saia antes da conclusão.

ppostma1
fonte
3
Esta resposta atingiu a unha na cabeça. Às vezes, não é apenas a configuração do nginx, mas o que realmente está produzindo o cabeçalho. Quando error_reporting contém os avisos, mas display_errors está desativado no php.ini, todas as mensagens são exibidas no cabeçalho FCGI em vez do conteúdo.
Schien
17

Instruções Plesk

No Plesk 12, eu tinha o nginx sendo executado como um proxy reverso (que eu acho que é o padrão). Portanto, a principal resposta atual não funciona, pois o nginx também está sendo executado como proxy.

Eu fui para Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Em seguida, na parte inferior da página, você pode definir as diretivas adicionais do nginx, que defini como uma combinação das duas principais respostas aqui:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
fonte
1
Onde? Qual configuração?
Redsandro 13/11
@Redsandro Se você não conseguir encontrá-lo Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings, não sei o que você quer dizer.
icc97
esta foi a solução para mim: Domínios> Nome de domínio> Configurações do Apache e nginx> Diretivas adicionais do nginx Plesk Onyx versão 17.8.11
dijkstra8x
1
Eu adicionei isso em um novo arquivo /etc/nginx/conf.d/proxy.confe reiniciei o nginx, ele funciona bem, obrigado!
rubo77
6

Se você estiver usando a estrutura do Symfony: Antes de mexer com a configuração do Nginx, tente desativar o ChromePHP primeiro.

1 - Abra app / config / config_dev.yml

2 - Comente estas linhas:

#chromephp:
    #type:   chromephp
    #level:  info

O ChromePHP compacta as informações de depuração json-codificadas no cabeçalho X-ChromePhp-Data, que é muito grande para a configuração padrão do nginx com o fastcgi.

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

Lucas Bustamante
fonte
3

Acabamos percebendo que nosso único servidor que estava enfrentando isso havia interrompido a configuração do fpm, resultando em erros / avisos / avisos php que normalmente seriam registrados no disco e estavam sendo enviados pelo soquete FCGI. Parece que há um erro de análise quando parte do cabeçalho é dividida entre os pedaços do buffer.

Então, definindo php_admin_value[error_log] algo realmente gravável e reiniciar o php-fpm foi suficiente para corrigir o problema.

Podemos reproduzir o problema com um script menor:

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

Aumentar os buffers tornou os 502s mais difíceis de acertar, mas não impossíveis, por exemplo, 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

Então, acredito que a resposta correta é: corrija sua configuração do fpm para que ele registre erros no disco.

lyte
fonte
1

Essa ainda é a pergunta SO mais alta do Google ao procurar esse erro, então vamos esclarecê-lo.

Ao obter esse erro e não desejar mergulhar nas configurações do NGINX imediatamente, verifique as saídas no console de depuração. No meu caso, eu estava enviando um monte de texto para o console FirePHP / Chromelogger e, como tudo isso foi enviado como um cabeçalho, estava causando o estouro.

Pode não ser necessário alterar as configurações do servidor da Web se esse erro for causado pelo envio de quantidades insanas de mensagens de log.

DavidKunz
fonte
0

Não tenho certeza de que o problema esteja relacionado ao envio do cabeçalho php. Verifique se o buffer está ativado. A maneira mais simples é criar um arquivo 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 um arquivo 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;

Em seguida, você precisa chamá-los no servidor de configuração padrão da seguinte maneira:

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
fonte