upstream sent too big header while reading response header from upstream
Hennadii Makhomed
gmm на csdoc.com
Чт Мар 6 16:55:12 UTC 2025
On 06.03.2025 11:54, Илья Шипицин wrote:
>> upstream sent too big header
>> while reading response header from upstream
> в данном случае имеется в виду весь header,
> не какой-то конкретный заголовок
директива fastcgi_buffer_size задает размер буфера для чтения
заголовка ответа от апстрима, а директива fastcgi_buffers задает
число и размер буферов которые потом уже используются для чтения
тела ответа от апстрима. соответственно, чтобы убрать 502 ошибку
достаточно будет просто увеличивать fastcgi_buffer_size на размер
еще одной страницы памяти, для x86_64 - это ровно 4096 байт.
по умолчанию, этого буфера размер равен 4K, если есть 502 ошибки -
увеличиваем 4, 8, 12, 16, 20, 24, 28, 32, 36, 40,... до тех пор,
пока 502 ошибки полностью не пропадут. и все, - проблема решена!
а размер каждого буфера в fastcgi_buffers - увеличивать не надо,
и лучше оставить равным размеру страницы, чтобы не было впустую
расходования памяти, вместо этого лучше увеличить их количество,
они же выделяются не все сразу, а только по мере необходиомости.
зачем же тогда в интернете такое большое количество рекомендаций
делать большой размер одного буфера в директиве fastcgi_buffers?
> увеличение размера буферов --> увеличение расхода памяти.
> если она есть в достатке, почему бы и нет.
вне зависимости от того, сколько там есть памяти, все равно,
убрать эту 502 ошибку можно только увеличивая размер буфера
с помощою директивы fastcgi_buffer_size - и других вариантов
тут нет, если backend должен вернуть именно такие заголовки.
пока что остановился на таком наборе директив:
fastcgi_buffer_size 8k;
fastcgi_busy_buffers_size 16k;
fastcgi_buffers 16 4k;
proxy_buffer_size 8k;
proxy_busy_buffers_size 16k;
proxy_buffers 16 4k;
Илья, спасибо, что помогли мне лучше разобраться с этим вопросом.
P.S.
freenginx уже не развивается, последнее обновление там было 2024-09-03.
из живых форков nginx остались только nginx, OpenResty, Tengine и Angie.
осталось только 4 варианта nginx, если не считать коммерческие версии.
>>> у всех ли стоит задача максимально разгрузить бекенд ?
>>
>> а разве нет?
>
> сильно зависит от бекенда. если бекенд вполне современный
> и не имеет проблем с c10k, то дополнительная буферизация не нужна.
> мы перед asp.net выключали буферизацию. отлично работало.
>
> какой смысл ? терминация ssl, высокая плотность хостинга на белых адресах,
> L7 маршрутизация по локейшенам.
для такого набора задач - разве не будет лучше использовать haproxy ?
https://en.wikipedia.org/wiki/HAProxy
HAProxy was written in 2000 by Willy Tarreau,
a core contributor to the Linux kernel,
who still maintains the project.
тут это оффтопик наверное, но в open source версии haproxy, как я понял
из документации, есть такие возможности настроки очередей и приоритетов,
каких нет даже в коммерческой версии nginx и тем более в open source
версии nginx, так что для терминации TLS, маршрутизации и приоретизации
запросов - наверное haproxy еще лучше подходит? В том числе и уровень
защиты от DDoS можно значительно повысить, разбив все клиентские
подключения на классы, и в первую очередь обслуживая запросы от
целевой аудитории, а те страны из которых приходят как правило
только DDoS-запросы - обслуживать в самом конце списка приоритетов,
только если будут свободными ресурсы сервера и не будет более
приоритетных и более важных запросов от целевой аудитории
и ботов поисковых систем. Такой алгоритм haproxy, как я понял
из их документации, позволяет сделать. это же очень хорошие
возможности, позволяют сделать сайт гораздо более защищенным
от DDoS-атак и это позволит "максимально разгрузить бекенд".
очереди есть только в платной версии nginx, а приоритетов -
нет даже и в платной версии nginx, насколько я помню из доки.
и Максим Дунин сказал, что не надо надеяться на то, что очереди
из платной версии nginx когда-либо появятся в бесплатной версии.
--
Best regards,
Gena
Подробная информация о списке рассылки nginx-ru