【发布时间】:2021-04-24 20:54:48
【问题描述】:
每隔几分钟我就会在 Chrome 和 Firefox 上遇到控制台错误,但事件仍在发生 - 这种情况会持续一段时间,直到最终 Chrome 记录 520 错误并且 Firefox '无法建立与服务器的连接' 导致事件源完全中断。
我在本地对此进行了测试,两种浏览器都没有问题。我们生产环境的不同之处在于我们支持 nginx 代理和 CloudFlare 安全性。
这些是我在后端使用的标头:
'Connection': 'keep-alive',
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'X-Accel-Buffering': 'no'
这是后端(节点JS)中的代码
res.writeHead(200, headers);
res.setTimeout(1000 * 60 * 120)
res.flushHeaders()
req.on('close', () => {
res.end()
})
res.on('timeout', () => res.end())
这些是我尝试过的 nginx 配置:
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
http2_max_field_size 64k;
http2_max_header_size 512k;
proxy_read_timeout 12h;
前端代码
let source = new EventSource('/events')
source.onerror = (e) => console.log(e)
source.onmessage = (msg) => console.log(msg)
感谢任何建议。谢谢
【问题讨论】:
-
520 是cloudflare specific error,firefox 和 chrome 处理它的方式不同,因为它不完全是标准的。我还看到 http2,cloudflare 有一些有趣的 http2 支持,所以可能需要检查 cloudflare http2 设置并确保了解和支持 cloudflare 和 nginx 之间的 http 版本。意思是什么时候是http1,什么时候是https2,有时只能降级,有时只能升级
标签: google-chrome nginx eventsource