Nginx proxy_buffering: отдавать SSE без задержки

Категория: Nginx · Обновлено:

Nginx по умолчанию буферизует ответы upstream, поэтому небольшие события SSE могут приходить клиенту пачкой. Отключите буферизацию только для event-stream маршрута и задайте допустимую паузу между чтениями; сам backend при этом должен отправлять и сбрасывать события.

Передавать события сразу

Добавьте настройки в location, который проксирует endpoint SSE:

Текст
location /events/ {
    proxy_pass http://backend;
    proxy_buffering off;
    proxy_cache off;
    proxy_read_timeout 1h;
}

Backend должен отвечать с Content-Type: text/event-stream, разделять события пустой строкой и своевременно flush-ить вывод. Иначе Nginx не сможет отправить клиенту данные, которых ещё нет в ответе upstream.

proxy_read_timeout ограничивает паузу между последовательными чтениями от backend, а не общую длительность соединения. Подберите значение по heartbeat вашего потока: если событий нет дольше указанного срока, Nginx закроет соединение. Правило proxy_buffering off действует только в выбранном контексте и не отключает буферизацию других location.

Документация: proxy_buffering, proxy_read_timeout.