восходящий поток отправил слишком большой заголовок при чтении заголовка ответа из восходящего потока
Я получаю такие ошибки:
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-адрес повторяется снова и снова с разделением запятой. Не могу понять, что является причиной этого. У кого-нибудь есть идея?
Обновление: Еще одна ошибка:
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";
}`
6 answers
Добавьте следующее в свой файл 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 сказать "Мне не нравится то, что я вижу"
- Ваш поток вышестоящего сервера потерпел крах
- Вышестоящий сервер отправил неверный заголовок обратно
- Уведомление/Предупреждения, отправленные из STDERR, переполняли их буфер, и как он, так и стандартный вывод были закрыты
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 получает все заголовки
Примеры включают:
<?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:
Прежде чем связываться с конфигурацией Nginx, попробуйте сначала отключить ChromePHP.
1 - Открыть приложение/config/config_dev.yml
2 - Прокомментируйте эти строки:
#chromephp:
#type: chromephp
#level: info
CHROMEPHP упаковывает информацию об отладке в формате json, закодированную в заголовке X-CHROMEPHP-данных, который слишком велик для конфигурации 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-е более трудными для попадания, но не невозможными, например, родной язык:
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, чтобы она записывала ошибки на диск.