en amont envoyé un en-tête trop grand lors de la lecture de l'en-tête de réponse en amont

227

Je reçois ce genre d'erreurs:

2014/05/24 11:49:06 [erreur] 8376 # 0: * 54031 en amont envoyé un en-tête trop grand lors de la lecture de l'en-tête de réponse en amont, client: 107.21.193.210, serveur: aamjanata.com, demande: "GET / the- brainwash-chronicles-parrainé par le gujarat-gouvernement /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorisé par le gujarat-gouvernement /,% 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-sponsorisé par le gujarat-gouvernement /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- brainwash-chronicles-parrainé par le gujarat-gouvernement /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorisé par le gujarat-gouvernement /,% 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-sponsorisé par le gujarat-gouvernement /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- brainwash-chronicles-parrainé par le gujarat-gouvernement /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- parrainé par le gouvernement du gujarat /,% 20ht

C'est toujours pareil. Une URL s'est répétée encore et encore avec une virgule de séparation. Impossible de comprendre ce qui cause cela. Quelqu'un a une idée?

Mise à jour: une autre erreur:

http request count is zero while sending response to client

Voici la config. Il y a d'autres choses non pertinentes, mais cette partie a été ajoutée / modifiée

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

Et puis dans le bloc serveur: set $ 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
la source
votre configuration proxy ne semble pas correcte. Pouvez-vous partager la config?
Neo
pouvez-vous essayer d'ajouter: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
doublon possible en amont trop grand - nginx + codeigniter
dnozay

Réponses:

407

Ajoutez ce qui suit à votre fichier conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Néo
la source
161
Bien que votre réponse m'ait conduit à la bonne réponse, vous devez montrer comment déterminer les tailles de tampon correctes et pourquoi cela compte. Sinon, c'est un coup dans le noir. Voir ici pour avoir une idée sur le dimensionnement: gist.github.com/magnetikonline/…
Wes Johnson
4
"fastcgi_buffer_size 32k;" seul ne fonctionnait pas, j'avais besoin des deux lignes pour que NginX redémarre. Je suis venu ici à cause d'une erreur 502 avec NginX causée par un plugin WordPress.
PJ Brunet
6
Si fast_cgi_bufferscela ne vous aide pas, essayez la proxy_buffers réponse ci-dessous par @amd
icc97
11
Toute explication sur cette réponse s'il vous plaît.
Edson Horacio Junior
5
Cela fonctionne pour moi, je veux juste ajouter que dans ubuntu 16.04 le fichier de configuration nginx est situé à /etc/nginx/nginx.confet que les valeurs doivent aller à l'intérieur de http {...}
Mario
134

Si nginx fonctionne en tant que proxy / proxy inverse

c'est-à-dire pour les utilisateurs de ngx_http_proxy_module

En plus fastcgi, leproxy module enregistre également l'en-tête de demande dans un tampon temporaire.

Vous devrez donc peut-être également augmenter le proxy_buffer_sizeet le proxy_buffers, ou le désactiver totalement (veuillez lire la documentation nginx ).

Exemple de configuration de mise en mémoire tampon du proxy

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

Exemple de désactivation de votre tampon proxy (recommandé pour les serveurs à longue interrogation)

http {
  proxy_buffering off;
}

Pour plus d'informations: documentation du module proxy Nginx

amd
la source
8
"proxy_busy_buffers_size" doit être inférieur à la taille de tous les "proxy_buffers" moins un tampon
chovy
tu es l'homme! Merci! première option a fonctionné dans mon application ruby ​​on rails
Nezir
Probablement une question idiote, mais j'ai un proxy devant le serveur qui renvoie cette erreur. La modification du tampon a fonctionné, mais j'obtiens une nouvelle erreur sur la machine interne. writev() failed (104: Connection reset by peer) while sending to client Ces paramètres de proxy pourraient-ils corriger cette erreur et iraient-ils sur le serveur en amont ou le proxy?
Adam Patterson
1
Pourquoi proxy_buffers 4 ...? Puisque la valeur par défaut semble être 8
adrianTNT
23

upstream sent too big header while reading response header from upstream est la façon générique de nginx de dire "je n'aime pas ce que je vois"

  1. Votre thread de serveur en amont s'est écrasé
  2. Le serveur en amont a renvoyé un en-tête non valide
  3. Les avis / avertissements renvoyés par STDERR ont débordé leur tampon et lui et STDOUT ont été fermés

3: Regardez les journaux d'erreurs au-dessus du message, est-il en streaming avec des lignes enregistrées précédant le message? PHP message: PHP Notice: Undefined index: Exemple d'extrait d'une boucle mon fichier journal:

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

vous pouvez voir dans la 3ème ligne du bas que la limite de tampon a été atteinte, cassée et le thread suivant a écrit dessus. Nginx a ensuite fermé la connexion et renvoyé 502 au client.

2: enregistrez tous les en-têtes envoyés par demande, examinez-les et assurez-vous qu'ils sont conformes aux normes (nginx n'autorise rien de plus de 24 heures à supprimer / expirer un cookie, en envoyant une longueur de contenu non valide car les messages d'erreur ont été mis en mémoire tampon avant que le contenu ne soit compté. ..). L'appel de fonction getallheaders peut généralement aider dans les situations de code abstrait php obtenir tous les en-têtes

les exemples comprennent:

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

et ça:

<?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: vérifiez ou créez un journal de script pour vous assurer que votre thread atteint le point final correct et ne se ferme pas avant la fin.

ppostma1
la source
3
Cette réponse a frappé le clou dans la tête. Parfois, ce n'est pas seulement la configuration de nginx, mais ce qui produit réellement l'en-tête. Lorsque error_reporting contient les notifications mais display_errors est désactivé dans php.ini, tous les messages apparaissent dans l'en-tête FCGI au lieu du contenu.
Schien
17

Instructions Plesk

Dans Plesk 12, j'avais nginx fonctionnant en tant que proxy inverse (qui, je pense, est la valeur par défaut). Donc, la première réponse actuelle ne fonctionne pas car nginx est également exécuté en tant que proxy.

Je suis allé Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Ensuite, au bas de cette page, vous pouvez définir les directives nginx supplémentaires que j'ai définies comme une combinaison des deux premières réponses ici:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
la source
1
Où? Quelle config?
Redsandro
@Redsandro Si vous ne pouvez pas le trouver via Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsalors je ne sais pas ce que vous voulez dire?
icc97
c'était la solution pour moi: Domaines> Nom de domaine> Paramètres Apache et nginx> Directives nginx supplémentaires Plesk Onyx Version 17.8.11
dijkstra8x
1
J'ai ajouté cela dans un nouveau fichier /etc/nginx/conf.d/proxy.confet redémarré nginx, cela fonctionne bien, merci!
rubo77
6

Si vous utilisez le framework Symfony: Avant de jouer avec la configuration Nginx, essayez d'abord de désactiver ChromePHP.

1 - Ouvrez app / config / config_dev.yml

2 - Commentez ces lignes:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP contient les informations de débogage codées json dans l'en-tête X-ChromePhp-Data, qui est trop grande pour la configuration par défaut de nginx avec fastcgi.

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

Lucas Bustamante
la source
3

Nous avons fini par nous rendre compte que notre seul serveur qui connaissait cela avait interrompu la configuration de fpm, entraînant des erreurs / avertissements / notifications php qui étaient normalement enregistrés sur le disque étaient envoyés via le socket FCGI. Il semble qu'il y ait un bogue d'analyse lorsqu'une partie de l'en-tête est divisée entre les morceaux de tampon.

Donc, régler php_admin_value[error_log]sur quelque chose de réellement inscriptible et redémarrer php-fpm était suffisant pour résoudre le problème.

Nous pourrions reproduire le problème avec un script plus petit:

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

Augmenter les tampons a rendu les 502 plus difficiles à toucher mais pas impossible, par exemple natif:

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

Je pense donc que la bonne réponse est: corrigez votre configuration fpm pour qu'elle enregistre les erreurs sur le disque.

lyte
la source
1

C'est toujours la question SO la plus élevée sur Google lors de la recherche de cette erreur, nous allons donc la supprimer.

Lorsque vous obtenez cette erreur et que vous ne souhaitez pas plonger dans les paramètres NGINX immédiatement, vous pouvez vérifier vos sorties sur la console de débogage. Dans mon cas, je produisais des charges de texte vers la console FirePHP / Chromelogger, et puisque tout est envoyé en tant qu'en-tête, cela provoquait le débordement.

Il peut ne pas être nécessaire de modifier les paramètres du serveur Web si cette erreur est causée par l'envoi de quantités insensées de messages de journal.

DavidKunz
la source
0

Je ne suis pas sûr que le problème soit lié à l'en-tête PHP envoyé. Assurez-vous que la mise en mémoire tampon est activée. La manière la plus simple consiste à créer un fichier 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;

Et un fichier 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;

Ensuite, vous devez les appeler dans votre serveur de configuration par défaut de cette façon:

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
la source