вгору надсилається занадто великий заголовок під час зчитування заголовка відповіді з висхідної лінії


227

Я отримую такі помилки:

24.05.2014 11:49:06 [помилка] 8376 # 0: * 54031 вгору надсилається занадто великий заголовок під час зчитування заголовка відповіді з висхідного потоку, клієнт: 107.21.193.210, сервер: aamjanata.com, запит: "GET / the- мозкові промивання-хроніки, спонсоровані гуджаратом-урядом /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- спонсорував уряд гуджарат /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- гуджарат-уряд /,% 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 / промивання мозку-хроніки, спонсоровані гуджаратським урядом /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- мозкові промивання-хроніки, спонсоровані гуджаратом-урядом /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- спонсорував уряд гуджарат /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by- гуджарат-уряд /,% 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 / промивання мозку-хроніки, спонсоровані гуджаратським урядом /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- мозкові промивання-хроніки, спонсоровані гуджаратом-урядом /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- спонсорував уряд гуджарат /,% 20хт

Завжди воно те саме. URL повторюється знову і знову з розділенням коми. Не можу зрозуміти, що це викликає. Хтось має ідею?

Оновлення: Ще одна помилка:

http request count is zero while sending response to client

Ось конфігурація. Є й інші нерелевантні речі, але ця частина була додана / відредагована

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

А потім у блоці сервера: встановіть $ 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";
    }`

ваш конфігурація проксі не здається правильним. Чи можете ви поділитися конфігурацією?
Нео

чи можете ви спробувати додати: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Нео

2
можливий дублікат Upstream занадто великий - nginx +
codeigniter

Відповіді:


406

Додайте наступне до файлу конф

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

160
Хоча ваша відповідь призвела мене до правильної відповіді, ви повинні показати, як визначити правильні розміри буфера і чому це має значення. Інакше це постріл у темряві. Дивіться тут, щоб отримати уявлення про розмір: gist.github.com/magnetikonline/…
Уес Джонсон

4
"fastcgi_buffer_size 32k;" поодинці не працювало, мені потрібні були обидві лінії для перезавантаження NginX. Я прийшов сюди через помилку 502 з NginX, викликану плагіном WordPress.
PJ Brunet

6
Якщо fast_cgi_buffersне допоможе, спробуйте proxy_buffers відповідь нижче від @amd
icc97

11
Будь-яке пояснення на цю відповідь, будь ласка.
Едсон Хоракіо Молодший

5
Для мене це працює, я просто хочу додати, що в ubuntu 16.04 файл конфігурації nginx розташований у, /etc/nginx/nginx.confі значення повинні входити всередині http {...}
Маріо,

134

Якщо nginx працює як проксі / зворотний проксі

тобто для користувачів ngx_http_proxy_module

Крім цього fastcgi, proxyмодуль також зберігає заголовок запиту у тимчасовому буфері.

Тому вам може знадобитися також збільшити proxy_buffer_sizeта proxy_buffersабо повністю відключити його (будь ласка, прочитайте документацію на nginx ).

Приклад конфігурації буферизації проксі

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

Приклад вимкнення вашого проксі-буфера (рекомендується для серверів довгого опитування)

http {
  proxy_buffering off;
}

Для отримання додаткової інформації: Документація проксі-модуля Nginx


8
"proxy_busy_buffers_size" повинен бути менше розміру всіх "proxy_buffers" мінус один буфер
chovy

ти чоловік! Дякую! Перший варіант працював у моєму рубіні на
рейковій програмі

Можливо, дурне запитання, але у мене є проксі перед сервером, який повертає цю помилку. Зміна буфера працювала, але я отримую нову помилку на внутрішній машині. writev() failed (104: Connection reset by peer) while sending to client Чи могли б ці налаштування проксі-сервера виправити цю помилку, і він хотів би перейти на поточний сервер або проксі?
Адам Паттерсон

1
Чому proxy_buffers 4 ...? Оскільки за замовчуванням здається 8
adrianTNT

23

upstream sent too big header while reading response header from upstream - це загальний спосіб nginx сказати: "Мені не подобається те, що я бачу"

  1. Помилка вашого потокового сервера вийшла з ладу
  2. Сервер вище за течією відправив назад недійсний заголовок
  3. Повідомлення / попередження, надіслані з STDERR, переповнювали їх буфер, і він, і STDOUT були закриті

3: Подивіться на журнали помилок над повідомленням, чи вони передаються потоковими записаними рядками, що передують повідомленню? PHP message: PHP Notice: Undefined index: Приклад фрагмента з циклу мого файлу журналу:

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

ви бачите в третьому рядку знизу, що межа буфера потрапила, зламана, а наступний потік написав над нею. Потім Nginx закрив з'єднання і повернув 502 клієнту.

2: увійдіть у журнал усі заголовки, надіслані за запитом, перегляньте їх і переконайтесь, що вони відповідають стандартам (nginx не дозволяє видалити / закінчувати файл cookie старше 24 годин, надсилаючи недійсну довжину вмісту, оскільки повідомлення про помилки було завантажено до того, як вміст був підрахований. ..). Виклик функції getallheaders зазвичай може допомогти в абстрагованих ситуаціях з кодом php отримати всі заголовки

приклади включають:

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

і це:

<?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: перевірити або скласти журнал сценаріїв, щоб переконатися, що ваша нитка досягає правильної кінцевої точки та не завершується до завершення.


3
Ця відповідь вдарила цвяхом у голову. Іноді це не просто конфігурація nginx, а те, що насправді створює заголовок. Якщо повідомлення про помилки містить повідомлення, але помилки display_errors вимкнено у php.ini, усі повідомлення відображаються у заголовку FCGI замість вмісту.
Schien

17

Інструкції Плеска

У Plesk 12 у мене був nginx, який працює як зворотний проксі (що, на мою думку, є типовим). Тому поточна відповідь не працює, оскільки nginx також запускається як проксі.

Я пішов Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settings.

Потім у нижній частині цієї сторінки ви можете встановити Додаткові директиви nginx, які я встановив як комбінацію двох найкращих відповідей тут:

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

1
Де? Який конфігурація?
Редсандро

@Redsandro Якщо ви не можете його знайти, Subscriptions | [subscription domain] | Websites & Domains (tab) | [Virtual Host domain] | Web Server Settingsя не впевнений, що ви маєте на увазі?
icc97

це було рішенням для мене: Домени> Ім'я домену> Налаштування Apache & nginx> Додаткові директиви nginx Plesk Onyx Версія 17.8.11
dijkstra8x

1
Я додав це в новий файл /etc/nginx/conf.d/proxy.confі перезапустив nginx, він працює чудово, дякую!
rubo77

6

Якщо ви використовуєте фреймворк Symfony: Перш ніж возитися з конфігурацією Nginx, спершу спробуйте відключити ChromePHP.

1 - Відкрийте додаток / config / config_dev.yml

2 - Прокоментуйте наступні рядки:

#chromephp:
    #type:   chromephp
    #level:  info

ChromePHP пакує інформацію про налагодження, кодовану json, кодовану у заголовку X-ChromePhp-Data, яка занадто велика для конфігурації nginx за замовчуванням з fastcgi.

Джерело: https://github.com/symfony/symfony/isissue/8413#issuecomment-20412848


3

Ми зрозуміли, що наш один сервер, який відчував це, розірвав конфігурацію fpm, що призвело до помилок / попереджень / повідомлень php, які зазвичай були записані на диск, надсилаються через сокет FCGI. Схоже, є помилка розбору, коли частина заголовка розбивається на шматки буфера.

Тож встановлення php_admin_value[error_log]на щось, що насправді можна записати, і перезапуск php-fpm було достатньо для усунення проблеми.

Ми могли б відтворити проблему за допомогою меншого сценарію:

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

Підняття буферів зробило 502 важче вразити, але не неможливо, наприклад, рідне:

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

Тому я вважаю, що правильною відповіддю є: виправити конфігурацію fpm, щоб вона реєструвала помилки на диску.


1

Це все ще найвище SO-запитання в Google при пошуку цієї помилки, тож давайте нарікаємо її.

Отримавши цю помилку і не бажаючи негайно заглиблюватися в налаштування NGINX, ви можете перевірити свої результати на консолі налагодження. У моєму випадку я виводив навантаження тексту на консоль FirePHP / Chromelogger, і оскільки це все надсилається як заголовок, це викликало переповнення.

Можливо, не потрібно буде змінювати налаштування веб-сервера, якщо ця помилка викликана просто відправленням божевільної кількості повідомлень журналу.


0

Я не впевнений, що проблема пов’язана з тим, який заголовок PHP надсилає. Переконайтеся, що буферизація включена. Простий спосіб - створити файл 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;

І файл 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;

Далі вам потрібно зателефонувати на сервер конфігурації за замовчуванням таким чином:

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;
 # ........
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.