EventSource(SSE)部署至服务器后数据仅在连接关闭时返回,求排查
SSE部署后无法实时推送消息的问题
本地运行时,每次调用res.write后消息都能实时返回,但部署到服务器后,所有消息仅在EventSource连接关闭时才一次性返回,表现得和普通HTTP请求一样。
相关代码
前端代码
const event_source = new EventSource("https://test.com/sse"); event_source.addEventListener('message', (message) => { console.log(message) }, false); event_source.addEventListener('open', (_e) => { console.log('EventSource Connected !'); }, false); event_source.addEventListener('error', (err) => { //Close Event Source }, false);
后端代码
let aa = 0 setInterval(() => { aa++ if (aa === 5) { return r(aa) } res.write(`event: aa\n`) res.write(`data: sefa -> ${aa}\n\n`) }, 1000)
Nginx配置
location /sse { proxy_pass http://localhost:3005; }
问题原因及解决办法
问题根源在Nginx的默认代理配置:Nginx会对代理的HTTP响应做缓冲,只有缓冲区填满或连接关闭时才会把内容发给客户端,直接阻断了SSE的实时推送能力。
修改Nginx配置,禁用缓冲并开启长连接支持:
location /sse { proxy_pass http://localhost:3005; # 禁用响应缓冲,确保实时推送 proxy_buffering off; # SSE需要HTTP/1.1的长连接支持 proxy_http_version 1.1; # 清除Connection头,避免被替换为close proxy_set_header Connection ''; # 指定SSE对应的Content-Type proxy_set_header Content-Type text/event-stream; # 禁用缓存 proxy_cache off; }
另外,后端代码里需要手动刷新输出缓冲区(以Node.js为例),确保每次res.write后数据立即发送:
let aa = 0 setInterval(() => { aa++ if (aa === 5) { res.end(); // 结束连接,原代码的r(aa)应为结束连接逻辑 return; } res.write(`event: aa\n`) res.write(`data: sefa -> ${aa}\n\n`) res.flush(); // 强制刷新缓冲区 }, 1000)
内容的提问来源于stack exchange,提问作者SefaUn
相关产品推荐
相关产品推荐

