要让 Nginx 正确代理 SSE,核心是移除所有默认干扰机制:必须关闭缓冲与缓存(proxy_buffering off; proxy_cache off; proxy_request_buffering off; gzip off)、延长并协同各层超时(proxy_read_timeout、proxy_send_timeout、keepalive_timeout 均设为 24h 并启用 proxy_socket_keepalive)、确保协议与关键头正确透传(HTTP/1.1、清空 Connection、隐藏 X-Accel-Buffering 和 Cache-Control、补充 no-cache 与 CORS 头)。

要让 Nginx 正确代理 SSE,核心不是“适配”,而是**移除所有默认干扰机制**——SSE 本质是一条单向、持续、低延迟的 HTTP 流,任何缓冲、缓存、压缩或过早断连都会破坏它。
必须关闭缓冲与缓存
SSE 要求数据逐块即时透传,Nginx 默认启用的 proxy_buffering 会攒够缓冲区才转发,造成明显延迟甚至断流:
- proxy_buffering off; —— 强制禁用响应缓冲
- proxy_cache off; —— 彻底关闭代理缓存(SSE 响应不可复用)
- proxy_request_buffering off; —— 防止 Nginx 尝试读取并缓存空请求体
- gzip off; —— 禁用 gzip;分块流被压缩后浏览器无法按行解析,会导致卡死
必须延长并协同各层超时
SSE 连接常需维持数分钟至数小时,仅调大 proxy_read_timeout 不够,多个环节都可能静默中断连接:
- proxy_read_timeout 24h; —— 后端响应等待上限(建议设为业务最大容忍时长)
- proxy_send_timeout 24h; —— 防止 Nginx 因“长时间未发数据”主动断开
- keepalive_timeout 24h; —— 维持客户端到 Nginx 的 keep-alive 连接
- proxy_socket_keepalive on; —— 启用 TCP 层保活,对抗中间防火墙或云 LB 的空闲断连
注意:若流量经过阿里云 SLB、腾讯云 CLB 或 AWS ALB,它们自带空闲超时(常为 60–300 秒),必须同步在控制台调大,否则 Nginx 配置无效。
必须确保协议与关键头正确透传
浏览器依赖特定协议版本和响应头识别 SSE,Nginx 不得覆盖或截断:
- proxy_http_version 1.1; —— SSE 必须基于 HTTP/1.1(HTTP/1.0 不支持持久连接)
- proxy_set_header Connection ''; —— 清空 Connection 头,防止注入 close 导致连接意外关闭
- proxy_hide_header X-Accel-Buffering; —— 隐藏 Nginx 自动添加的缓冲提示头
- proxy_hide_header Cache-Control; —— 防止覆盖后端设置的 no-cache
- add_header Cache-Control "no-cache"; —— 若后端未设,此处兜底补充
- add_header Access-Control-Allow-Origin "*"; —— 显式支持跨域(生产环境请指定域名)
Content-Type 应由后端返回 text/event-stream,Nginx 不应通过 add_header 覆盖,除非确认后端缺失。
典型 location 配置示例
以下是一个精简、可直接使用的 SSE 专用配置片段:
location /events {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
proxy_cache off;
proxy_request_buffering off;
gzip off;
proxy_read_timeout 86400;
proxy_send_timeout 86400;
keepalive_timeout 86400;
proxy_socket_keepalive on;
proxy_hide_header X-Accel-Buffering;
proxy_hide_header Cache-Control;
add_header Cache-Control "no-cache";
add_header Access-Control-Allow-Origin "*";
}


















