upstream wysłał zbyt duży nagłówek podczas odczytywania nagłówka odpowiedzi z upstream

227

Otrzymuję tego rodzaju błędy:

2014/05/24 11:49:06 [error] 8376 # 0: * 54031 upstream wysłał zbyt duży nagłówek podczas czytania nagłówka odpowiedzi z upstream, klient: 107.21.193.210, serwer: aamjanata.com, żądanie: „GET / the- pranie mózgu-kroniki-sponsorowane-przez-gujarat-rząd /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorowany przez 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-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- pranie mózgu-kroniki-sponsorowane-przez-gujarat-rząd /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorowany przez 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-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- pranie mózgu-kroniki-sponsorowane-przez-gujarat-rząd /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- sponsorowany przez gujarat-government /,% 20ht

Zawsze jest tak samo. Adres URL powtarzany w kółko z oddzielaniem przecinkiem. Nie mogę ustalić, co to powoduje. Czy ktoś ma pomysł?

Aktualizacja: Kolejny błąd:

http request count is zero while sending response to client

Oto konfiguracja. Istnieją inne nieistotne rzeczy, ale ta część została dodana / zredagowana

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

A potem w bloku serwera: ustaw $ 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
źródło
konfiguracja serwera proxy wydaje się nieprawidłowa. Czy możesz udostępnić konfigurację?
Neo
czy możesz spróbować dodać: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Neo
2
możliwy duplikat Upstream za duży - nginx + codeigniter
dnozay

Odpowiedzi:

406

Dodaj następujące elementy do pliku conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Neo
źródło
160
Chociaż Twoja odpowiedź doprowadziła mnie do prawidłowej odpowiedzi, powinieneś pokazać, jak określić prawidłowe rozmiary buforów i dlaczego to ma znaczenie. W przeciwnym razie jest to strzał w ciemność. Zobacz tutaj, aby uzyskać pomysł na temat wielkości: gist.github.com/magnetikonline/...
Wes Johnson
4
„fastcgi_buffer_size 32k;” sam nie działał, potrzebowałem obu linii do ponownego uruchomienia NginX. Przybyłem tutaj z powodu błędu 502 z NginX spowodowanego przez wtyczkę WordPress.
PJ Brunet,
6
Jeśli fast_cgi_buffersnie pomóż, wypróbuj proxy_buffers poniższą odpowiedź autorstwa @amd
icc97
11
Wszelkie wyjaśnienia dotyczące tej odpowiedzi proszę.
Edson Horacio Junior
5
Działa to dla mnie, chcę tylko dodać, że w Ubuntu 16.04 znajduje się plik konfiguracyjny nginx, /etc/nginx/nginx.confa wartości powinny znajdować się w http {...}
Mario
134

Jeśli nginx działa jako proxy / reverse proxy

to znaczy dla użytkowników ngx_http_proxy_module

Oprócz fastcgitego proxymoduł zapisuje również nagłówek żądania w buforze tymczasowym.

Może być więc konieczne zwiększenie proxy_buffer_sizei proxy_bufferswyłączenie lub całkowite wyłączenie (Proszę przeczytać dokumentację nginx ).

Przykład konfiguracji buforowania proxy

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

Przykład wyłączenia bufora proxy (zalecane w przypadku długich serwerów odpytywania)

http {
  proxy_buffering off;
}

Więcej informacji: dokumentacja modułu proxy Nginx

amd
źródło
8
„proxy_busy_buffers_size” musi być mniejszy niż rozmiar wszystkich „proxy_buffers” minus jeden bufor
chovy
jesteś meżczyzną! dzięki! pierwsza opcja działała w mojej aplikacji Ruby on
Rails
Prawdopodobnie głupie pytanie, ale mam serwer proxy przed serwerem, który zwraca ten błąd. Zmiana bufora działała, ale pojawia się nowy błąd na wewnętrznej maszynie. writev() failed (104: Connection reset by peer) while sending to client Czy te ustawienia proxy ewentualnie naprawiłyby ten błąd i czy działałyby na serwerze nadrzędnym lub serwerze proxy?
Adam Patterson,
1
Dlaczego proxy_buffers 4 ...? Ponieważ domyślnie wydaje się być 8
adrianTNT
23

upstream sent too big header while reading response header from upstream to ogólny sposób, w jaki nginx mówi: „Nie podoba mi się to, co widzę”

  1. Wątek serwera nadrzędnego uległ awarii
  2. Serwer nadrzędny odesłał nieprawidłowy nagłówek
  3. Zawiadomienie / ostrzeżenia wysłane z STDERR przepełniły swój bufor i zarówno on, jak i STDOUT zostały zamknięte

3: Spójrz na dzienniki błędów nad komunikatem, czy jest przesyłane strumieniowo z zarejestrowanymi liniami poprzedzającymi komunikat? PHP message: PHP Notice: Undefined index: Przykładowy fragment z pętli mojego pliku dziennika:

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

w trzeciej linii od dołu widać, że limit bufora został przekroczony, zepsuł się, a nad nim napisał następny wątek. Nginx następnie zamknął połączenie i zwrócił klientowi 502.

2: zaloguj wszystkie nagłówki wysłane na żądanie, przejrzyj je i upewnij się, że są one zgodne ze standardami (nginx nie zezwala na usuwanie / wygasanie pliku cookie przez osoby starsze niż 24 godziny, wysyłając niepoprawną długość treści, ponieważ komunikaty o błędach były buforowane przed policzeniem treści. ..). Wywołanie funkcji getallheaders może zwykle pomóc w abstrakcyjnych sytuacjach kodu php pobiera wszystkie nagłówki

Przykłady obejmują:

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

i to:

<?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: sprawdź lub zrób dziennik skryptu, aby upewnić się, że Twój wątek osiąga prawidłowy punkt końcowy i nie kończy pracy przed zakończeniem.

ppostma1
źródło
3
Ta odpowiedź trafiła w sedno. Czasami nie jest to tylko konfiguracja nginx, ale to, co faktycznie tworzy nagłówek. Gdy raportowanie błędów zawiera powiadomienia, ale display_errors jest wyłączony w php.ini, wszystkie komunikaty pojawiają się w nagłówku FCGI zamiast treści.
Schien
17

Instrukcje Plesk

W Plesk 12 miałem nginx działający jako odwrotny serwer proxy (który moim zdaniem jest domyślny). Tak więc obecna najwyższa odpowiedź nie działa, ponieważ nginx jest również uruchamiany jako serwer proxy.

Poszedłem do Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Następnie na dole tej strony możesz ustawić dodatkowe dyrektywy nginx, które ustawiłem jako kombinację dwóch pierwszych odpowiedzi tutaj:

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;
icc97
źródło
1
Gdzie? Która konfiguracja?
Redsandro,
@ Redsandro Jeśli nie możesz tego znaleźć, to Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsnie jestem pewien, co masz na myśli?
icc97
to było dla mnie rozwiązanie: Domeny> Nazwa domeny> Ustawienia Apache i nginx> Dodatkowe dyrektywy nginx Plesk Onyx Wersja 17.8.11
dijkstra8x
1
Dodałem to do nowego pliku /etc/nginx/conf.d/proxy.confi zrestartowałem nginx, działa dobrze, dzięki!
rubo77
6

Jeśli korzystasz z frameworka Symfony: zanim zaczniesz zadzierać z konfiguracją Nginx, spróbuj najpierw wyłączyć ChromePHP.

1 - Otwórz aplikację / config / config_dev.yml

2 - Skomentuj następujące wiersze:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP spakuje informacje debugowania zakodowane w formacie json w nagłówku X-ChromePhp-Data, który jest zbyt duży dla domyślnej konfiguracji nginx z fastcgi.

Źródło: https://github.com/symfony/symfony/issues/8413#issuecomment-20412848

Lucas Bustamante
źródło
3

W końcu zdaliśmy sobie sprawę, że nasz jedyny serwer, który tego doświadczył, zepsuł konfigurację fpm, co spowodowało błędy / ostrzeżenia / powiadomienia php, które normalnie byłyby logowane na dysk, były wysyłane przez gniazdo FCGI. Wygląda na to, że wystąpił błąd analizowania, gdy część nagłówka zostaje podzielona na części bufora.

Więc ustawienie php_admin_value[error_log]czegoś, co faktycznie można zapisać i ponowne uruchomienie php-fpm wystarczyło, aby rozwiązać problem.

Możemy odtworzyć problem za pomocą mniejszego skryptu:

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

Zwiększenie buforów sprawiło, że 502 były trudniejsze do trafienia, ale nie niemożliwe, np. Natywne:

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

Tak więc uważam, że poprawna odpowiedź to: napraw konfigurację fpm, aby rejestrowała błędy na dysku.

lyte
źródło
1

To wciąż najwyższe pytanie SO w Google podczas wyszukiwania tego błędu, więc rozwiążmy go.

Gdy pojawia się ten błąd i nie chcesz od razu zagłębiać się w ustawienia NGINX, możesz sprawdzić swoje dane wyjściowe w konsoli debugowania. W moim przypadku wysyłałem mnóstwo tekstu do konsoli FirePHP / Chromelogger, a ponieważ wszystko to jest wysyłane jako nagłówek, powodowało to przepełnienie.

Zmiana ustawień serwera WWW może nie być potrzebna, jeśli błąd ten jest spowodowany jedynie wysyłaniem niesamowitych ilości komunikatów dziennika.

DavidKunz
źródło
0

Nie jestem pewien, czy problem dotyczy tego, co nagłówek php wysyła. Upewnij się, że buforowanie jest włączone. Prostym sposobem jest utworzenie pliku 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;

I plik 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;

Następnie musisz wywołać je na domyślnym serwerze konfiguracji w ten sposób:

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
źródło