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

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

2014/05/24 11:49:06 [error] 8376#0: *54031 upstream sent too big header while reading response header from upstream, client: 107.21.193.210, server: aamjanata.com, request: "GET /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-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-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-brainwash-chronicles-sponsored-by-gujarat-government/,%20https:/aamjanata.com/the-brainwash-chronicles-sponsored-by-gujarat-government/,%20ht

всегда одно и то же. URL-адрес повторяется снова и снова с разделяющей запятой. Не могу понять, в чем причина. У кого-нибудь есть идея?

Update: еще одна ошибка:

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

6 ответов


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

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;

если 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


upstream sent too big header while reading response header from upstream это общий способ nginx сказать "мне не нравится то, что я вижу"

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

3: посмотри журналы ошибок сообщение выше, это поток регистрируется линий предыдущем сообщении? PHP message: PHP Notice: Undefined index: Пример фрагмента из цикла my 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

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

2: регистрируйте все заголовки, отправленные на запрос, просмотрите их и убедитесь, что они соответствуют стандартам (nginx не разрешает ничего старше 24 часов удалять / истекать cookie, отправляя недопустимую длину содержимого, потому что сообщения об ошибках были буферизованы перед содержимым просчитанный...). вызов функции 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: Проверьте или сделайте журнал сценария, чтобы убедиться, что ваш поток достигает правильной конечной точки и не выходит до завершения.


инструкции 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;

Если вы используете Symfony framework:

прежде чем возиться с конфигурацией Nginx, попробуйте сначала отключить ChromePHP.

1-Открыть приложение / config / config_dev.в формате YML

2 - прокомментировал эти строки:

#chromephp:
    #type:   chromephp
    #level:  info

chromephp pack отладочная информация JSON-кодируется в заголовке X-ChromePhp-Data, который слишком велик для конфигурации по умолчанию nginx с fastcgi.

источник: https://github.com/symfony/symfony/issues/8413#issuecomment-20412848


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

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, чтобы она регистрировала ошибки на диске.