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

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

[error] 27544#0: *47335682 upstream sent too big header while reading response 
 header from upstream, client: 88.88.88.88, server: example..com,
 request: "POST /tool/ HTTP/1.1", upstream: "http://88.88.88.88:7080/tool/",
 host: "example.com"

В связи с этим вопросом можно увеличить размер буфера из файла конфига nginx следующим образом: upstream отправил слишком большой заголовок при чтении заголовка ответа вверх по течению

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

location
      fastcgi_buffers 16 16k; 
      fastcgi_buffer_size 32k;

(Для справок в будущем размер по умолчанию для fastcgi_buffer_size и fastcgi_buffers равен 4k или 8k относительно платформы)

Этот текст отображается в браузере пользователя: Nginx 502 Bad Gateway

Я планирую временно увеличить размер буфера. Затем я могу войти, когда буферы слишком большие. Можно ли узнать заголовки, которые слишком велики для восходящего потока? apache_response_headers() и headers_list() не дали мне всех заголовков ответов. Это только дало мне срок действия, кеш-контроль и заголовки прагмы.

Выполняется ли изменение proxy_buffer_size проблемы с производительностью?

(версия nginx: nginx/1.6.0, php 5.4.42, xcache 3.2)

Ответ 1

Вы можете легко найти ответ на SO, но в действительности имеет значение один вариант конфигурации:

http {
  fastcgi_buffer_size 32k;
}

Тем не менее эта рекомендация, вероятно, не то, что вы хотите. Давайте рассмотрим детали, почему это помогает решить проблему:

fastcgi_buffer:

Синтаксис: размер числа fastcgi_buffers;

По умолчанию: fastcgi_buffers 8 4k | 8k;

Контекст: http, server, location

Устанавливает количество и размер буферов, используемых для чтения ответа с сервера FastCGI, для одного соединения. По умолчанию размер буфера равен одной странице памяти. Это либо 4K, либо 8K, в зависимости от платформы.

fastcgi_buffer_size:

Синтаксис: fastcgi_buffer_size size;

По умолчанию: fastcgi_buffer_size 4k | 8k;

Контекст: http, server, location

Устанавливает размер буфера, используемого для чтения первой части ответ, полученный от сервера FastCGI. Эта часть обычно содержит небольшой заголовок ответа. По умолчанию размер буфера равен одному памяти. Это либо 4K, либо 8K, в зависимости от платформы. Оно может однако, меньше.

Таким образом, существует только fastcgi_buffer_size, потому что заголовок ответа не вписывается в буфер 4 КБ. В большинстве случаев это происходит из-за большого размера файла cookie. Поэтому настоятельно рекомендуется оставить настройки, но вместо этого уменьшить размер файлов cookie и хранить там только минимальное количество данных, например user_id, session_id, поэтому общее хранилище файлов cookie для нечувствительного набора идентификаторов. Некоторые браузеры плохо обрабатывают большие файлы cookie.

Таким образом, решение будет:

1. Reduce cookie size

2. Get back to original settings

http {
  fastcgi_buffers 8 4k;
  fastcgi_buffer_size 4k;
}

В случае возникновения проблем с уменьшением размера файла cookie отключите буферизацию для определенного местоположения:

location /request {
  fastcgi_buffering off;
}