Как обрабатывать слишком большой файл cookie, из-за которого Nginx возвращает 502?

Aug 21 2020

Наш сервер Nginx в настоящее время возвращает 502 для пользователя для нашего приложения на основе NodeJS, и в журналах ошибок указано:

2670 upstream sent too big header while reading response header from upstream

Это, по-видимому, вызвано слишком большим размером файла cookie (заголовок превышает 4 КБ по запросу), и мы не знаем, как справиться с этой ситуацией, кроме указания пользователю очистить свои файлы cookie для сайта. Есть предложения, как с этим бороться?

Конфигурация прокси-прохода в нашем файле nginx:

location / {
    proxy_pass http://localhost:8081;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect off;
    proxy_set_header x-forwarded-host $host; proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-NginX-Proxy true;
}

Дальнейший тест, передавая экземпляр Nginx, показывает, что вышестоящий сервер Node.JS может обрабатывать файл размером более 4 КБ, предполагая, что проблема находится на уровне Nginx.

Наше окружение:

Сервер Node.js 10.19.0 на базе Express, обслуживаемый Nginx 1.14.0 в системе на основе Ubuntu. Приложение, работающее на сервере Node.js, использует Quasar SSR.

Ответы

2 AndreM Aug 21 2020 at 22:16

Решение, на котором я закончил, заключалось в увеличении буфера для размера заголовка до 16 КБ, на основе статьи и документации Nginx :

proxy_buffers         8 16k;  # Buffer pool = 8 buffers of 16k
proxy_buffer_size     16k;    # 16k of buffers from pool used for headers

Процитируем конкретные тексты из документации:

На proxy_buffers:

Синтаксис: proxy_buffers number size;
По умолчанию: proxy_buffers 8 4k|8k;
Контекст:http, server, location

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

На proxy_buffer_size:

Синтаксис: proxy_buffer_size size;
По умолчанию: proxy_buffer_size 4k|8k;
Контекст:http, server, location

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