Nginx代理SSE需三点:禁用缓冲与缓存、透传text/event-stream响应头、显式配置CORS;须设proxy_buffering off、add_header Access-Control-Allow-Origin "*"、proxy_read_timeout 300等参数。

要让 Nginx 正确代理 Server-Sent Events(SSE)并支持跨域访问,关键在于三点:保持长连接不被中断、正确透传 SSE 所需的响应头、以及显式允许跨域请求。默认配置下 Nginx 可能会缓冲响应、关闭空闲连接或屏蔽自定义头,导致 SSE 断连或浏览器报错。
启用流式响应与禁用缓冲
Nginx 默认启用 proxy_buffering,会缓存后端响应直到满或结束,而 SSE 要求逐块实时推送数据。必须关闭缓冲,并设置合适的超时和传输模式:
- proxy_buffering off; —— 禁用代理缓冲
- proxy_cache off; —— 关闭缓存(SSE 不可缓存)
- proxy_http_version 1.1; —— 使用 HTTP/1.1 以支持 keep-alive
- proxy_set_header Connection ''; —— 清除 Connection 头,避免中间设备干扰长连接
透传 SSE 必需响应头
后端(如 Node.js、Python Flask)通常设置 Content-Type: text/event-stream 和 Cache-Control: no-cache,但 Nginx 默认可能过滤或覆盖这些头。需显式放行:
- proxy_hide_header Cache-Control; —— 防止 Nginx 覆盖后端的缓存策略(实际应由后端控制)
- add_header Cache-Control "no-cache"; —— 若后端未设,Nginx 补充(更推荐后端设置)
- add_header Content-Type "text/event-stream"; —— 仅当后端未正确设置时补充(优先保证后端输出准确)
- proxy_pass_request_headers on; —— 确保原始请求头(如 Origin)能被后端读取,用于 CORS 判断
配置跨域(CORS)响应头
SSE 请求受浏览器 CORS 限制,即使只发 GET,也需服务端明确允许。Nginx 可直接添加响应头,无需依赖后端(尤其当前端无法改源站时):
- add_header Access-Control-Allow-Origin "*"; —— 允许任意源(生产环境建议指定域名)
-
add_header Access-Control-Allow-Credentials "true"; —— 若需携带 Cookie,前端需设
withCredentials: true,此时Access-Control-Allow-Origin不能为*,须写具体域名 - add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization"; —— 按需补充所需请求头
调优连接与超时参数
SSE 连接常保持数分钟甚至更久,需延长 Nginx 各环节超时,防止被主动断开:
- proxy_read_timeout 300; —— 设置从后端读取响应的最大等待时间(单位秒),建议 ≥ 客户端重连间隔
- proxy_send_timeout 300; —— 向客户端发送响应的超时(一般影响小,但建议同步设长)
- keepalive_timeout 300; —— 保持客户端连接的空闲超时,应 ≥ proxy_read_timeout
- send_timeout 300; —— 发送响应给客户端的超时,避免因网络慢被中断
不复杂但容易忽略:所有涉及 SSE 的 location 块都必须单独配置上述指令,且不能被更高层的 proxy_buffering on; 覆盖。测试时用 curl 或浏览器开发者工具检查响应头是否完整、Connection 是否 keep-alive、是否有 chunked 编码,以及 EventSource 是否持续收到 data: 行。

















