апстрим отправил слишком большой заголовок при чтении заголовка ответа из апстрима

227

Я получаю такие ошибки:

2014/05/24 11:49:06 [ошибка] 8376 # 0: * 54031 обратный поток отправил слишком большой заголовок при чтении заголовка ответа из восходящего потока, клиент: 107.21.193.210, сервер: aamjanata.com, запрос: «GET / the- Brainwash-хроник спонсируемых-на-Гуджарат правительства /,% 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.ком / заместитель Brainwash-хроник спонсируемых-на-Гуджарат правительства /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- Brainwash-хроник спонсируемых-на-Гуджарат правительства /,% 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.ком / заместитель Brainwash-хроник спонсируемых-на-Гуджарат правительства /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the- Brainwash-хроник спонсируемых-на-Гуджарат правительства /,% 20https: /aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government /,% 20https: /aamjanata.com/the-brainwash-chronicles- спонсировал-на-Гуджарат правительства /,% 20ht

Всегда одно и то же. 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";
    }`
Vidyut
источник
ваш конфиг прокси не выглядит правильным. Можете поделиться конфигом?
Нео
Вы можете попробовать добавить: fastcgi_buffers 16 16k; fastcgi_buffer_size 32k;
Нео
2
возможный дубликат Upstream слишком большой - nginx + codeigniter
dnozay

Ответы:

407

Добавьте следующее в ваш файл conf

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
Нео
источник
161
Хотя ваш ответ привел меня к правильному ответу, вы должны показать, как определить правильный размер буфера и почему это важно. В противном случае это выстрел в темноте. Смотрите здесь, чтобы получить представление о размерах: gist.github.com/magnetikonline/…
Уэс Джонсон
4
"fastcgi_buffer_size 32k;" один не работал, мне нужно было обе строки для NginX, чтобы перезапустить. Я пришел сюда из-за ошибки 502 с NginX, вызванной плагином WordPress.
Пи Джей Брюнет
6
Если fast_cgi_buffersне помогло, попробуйте proxy_buffers ответ ниже : @amd
icc97
11
Любое объяснение этого ответа, пожалуйста.
Эдсон Орасио Джуниор
5
Это работает для меня, я просто хочу добавить, что в Ubuntu 16.04 файл конфигурации nginx находится по адресу, /etc/nginx/nginx.confа значения должны находиться внутри http {...}
Mario
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
ты человек! Спасибо! первый вариант сработал в моем приложении ruby ​​on rails
Nezir
Возможно глупый вопрос, но у меня есть прокси-сервер перед сервером, который возвращает эту ошибку. Смена буфера сработала, но я получил новую ошибку на внутренней машине. 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

Вы можете увидеть в 3-й строке снизу, что предел буфера был достигнут, нарушен, и следующий поток записал поверх него. Затем Nginx закрыл соединение и вернул 502 клиенту.

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

примеры включают в себя:

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

ppostma1
источник
3
Этот ответ ударил гвоздь в голову. Иногда это не просто конфигурация nginx, но то, что на самом деле создает заголовок. Когда error_reporting содержит уведомления, но display_errors отключен в php.ini, все сообщения отображаются в заголовке FCGI вместо содержимого.
Schien
17

Инструкции Plesk

В 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;
icc97
источник
1
Куда? Какой конфиг?
Redsandro
@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/issues/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, чтобы она записывала ошибки на диск.

Lyte
источник
1

Это по-прежнему самый высокий SO-вопрос в Google при поиске этой ошибки, так что давайте поднимем ее.

Когда вы получаете эту ошибку и не хотите сразу углубляться в настройки NGINX, вы можете проверить свои выводы на консоли отладки. В моем случае я выводил множество текста в консоль FirePHP / Chromelogger, и, поскольку все это отправляется в виде заголовка, это вызывало переполнение.

Возможно, нет необходимости изменять настройки веб-сервера, если эта ошибка вызвана просто отправкой безумных количеств сообщений журнала.

DavidKunz
источник
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;

И файл fasgi.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;
 # ........
}
macherif
источник