必须彻底禁用所有缓存机制才能兼容sse:关闭proxy_buffering和proxy_cache,禁用proxy_request_buffering,透传cache-control等关键响应头,并启用chunked_transfer_encoding,使nginx成为低延迟数据管道。

不能配置反向代理缓存来兼容 SSE。
SSE 本质是单向、无限、实时的 HTTP 流式响应,内容类型为 text/event-stream,要求数据逐块即时透传,任何缓存行为都会破坏其语义——缓存会截断流、延迟事件、返回过期数据,甚至导致连接提前关闭或浏览器解析失败。
所以,“完美兼容”不是调优缓存策略,而是彻底禁用所有缓存相关机制。以下是必须落实的几项关键操作:
关闭代理缓冲
proxy_buffering off;
否则 Nginx 会攒够缓冲区(默认几 KB)才转发,造成秒级延迟,流式效果完全失效。关闭代理缓存
proxy_cache off;proxy_cache_bypass 1;(冗余保险)
即使配置了 cache zone,也必须显式关闭;SSE 响应不可复用,缓存命中将直接中断事件流。禁用请求体缓冲(防干扰)
proxy_request_buffering off;
虽然 SSE 请求通常无 body,但该设置可防止 Nginx 尝试读取并缓存请求,避免潜在阻塞。透传关键响应头,不覆盖
proxy_hide_header Cache-Control;proxy_hide_header Expires;add_header Cache-Control "no-cache, no-store, must-revalidate";(仅作兜底,优先由后端设置)
确保Content-Type: text/event-stream和Cache-Control: no-cache原样到达浏览器。启用分块传输
chunked_transfer_encoding on;
让 Nginx 按后端分块(如每条 event)直接转发,而非等待完整响应。
这些不是“可选优化”,而是 SSE 在 Nginx 下可用的前提条件。所谓“缓存兼容”,在 SSE 场景中是个伪命题——它和缓存天然互斥。真正要做的,是把 Nginx 变成一条低干预、低延迟、高保真的数据管道。











