Nginx 502 Bad Gateway. Решается путем увеличения буфера. Зачем?

Я собираюсь создать стек LEMP для запуска Drupal. Я установил Nginx и PHP-FastCGI.

Nginx работал нормально, но любые попытки запустить PHP дали мне ошибку "502 Bad Gateway".

Быстрый Google показал: nginx 502 bad gateway, и увеличение размера буфера решило проблему.

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;

Вопрос в том, почему?

Мое понимание

Из предыдущей ссылки, казалось бы, nginx отправлял запросы на PHP-FastCGI, и он не отвечал. Как насчет этих запросов сделали тайм-аут?

У него не было достаточно времени, чтобы ответить, потому что php был сложным (это было не так, это было phpinfo();). Теперь я увеличил буфер, когда мне следует беспокоиться о необходимости повторного увеличения буфера?

Ответ 1

Если вы проверите журнал ошибок nginx, скорее всего, вы увидите это сообщение:
upstream sent too big header while reading response header from upstream

fastcgi_buffers устанавливает количество и размер памяти сегментов буфера, используемых для ответа восходящего потока FastCGI.

Значения по умолчанию, представленные в документации:
fastcgi_buffers 8 4k|8k;
где размер буфера по умолчанию равен PAGESIZE вашей операционной системы.
getconf PAGESIZE позволяет получить текущий размер страницы памяти.

Например, в Ubuntu 14.01 значение PAGESIZE по умолчанию составляет 4 КБ. Это означает, что у вас есть 8 сегментов по 4 КБ каждый. Всего 32 КБ. Ответ FastCGI больше этого числа, поэтому мы получаем код ответа 502 - server received

Это не очень хорошее объяснение, но оно поможет вам лучше понять, я надеюсь.

Ответ 2

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

Если ваше приложение испускает много заголовков Set-Cookie (или что-то еще, влияющее на общий размер заголовков HTTP), размер буфера по умолчанию здесь может быть недостаточным, и вам нужно его увеличить.

Чтобы понять, как вам нужно увеличить его, вы можете прочитать мою сверхдетальную запись здесь - это о proxy_buffer_size, но буферы fastcgi_ ведут себя очень похоже. Процитируем основную команду:

curl -s -w \%{size_header} -o /dev/null https://example.com

Убедитесь, что вы проверили правильный URL-адрес, и добавьте заголовки запросов через -H, если это необходимо.

Это даст вам размер заголовка в байтах. Затем вам нужно будет выровнять полученное значение до 4 Кб (типичный размер страницы памяти).

Так что, если вы получили, например, 14342 байта, тогда его необходимо установить:

fastcgi_buffer_size 16k;

Сложная задача не в этом, а в том, что когда вы увеличиваете этот размер буфера, вам нужно увеличить либо fastcgi_buffer_size и/или fastcgi_busy_buffers_size, так как NGINX использует/вычисляет значение по умолчанию для последнего.

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