背景
随着 Web 技术的不断发展,越来越多的网站开始采用 SSE(Server-Sent Events)技术来实现实时通信。SSE 是一种基于 HTTP 的推送技术,通过浏览器与服务器之间的长连接,服务器可以持续向浏览器推送数据。这种技术在实时聊天、股票行情、实时推送等场景中得到广泛应用。
在实现 SSE 的过程中,我们通常会采用 Nginx 作为反向代理服务器,将请求转发给后端应用程序。但是,在 Nginx 的配置中开启了 proxy_buffering 后,会导致 SSE 数据传输异常,出现类似“Content-Length is not known”的错误。这是因为 proxy_buffering 开启后,Nginx 会先缓存响应数据,等到整个响应完成后再一次性发送给客户端,这显然与 SSE 的实时推送不符。
解决方案
为了解决这个问题,我们需要在 Nginx 的配置中对 SSE 请求禁用 proxy_buffering。具体来说,我们需要在 location 中添加如下配置:
-- -------------------- ---- ------- -------- ---- - --------------- ---- ---------------- ---------- --- ---------------- ----------------- ---------- ------------------ ---- ---------------- ---- ------ ------------------ -------------- ---------------- ------- -------------- ---------- --------------- -
其中,proxy_buffering off 表示禁用 Nginx 的缓存功能,proxy_set_header Connection '' 和 proxy_set_header Transfer-Encoding 'chunked' 则是为了让 Nginx 以 chunked 的方式传输数据,以避免 Content-Length 未知的问题。另外,proxy_http_version 1.1 表示使用 HTTP/1.1 协议,proxy_set_header Host $host 则是为了保留原始请求的 Host 头信息。最后,proxy_cache_bypass $http_upgrade 和 proxy_set_header Upgrade $http_upgrade 则是为了支持 WebSocket 和 SSE。
示例代码
下面是一个简单的 SSE 示例代码,使用 Node.js 实现:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ----------------------- ---- -- - -- -------- --- ------- - ------------------ - --------------- -------------------- ---------------- ----------- ------------- ------------ --- -------------- -- - ----- ---- - ------ ----- --------------------------- ---------------- -- ------ - ---- - ------------------ ---------------- --------------- --------------- ----------- - --- ------------------- -- -- - ------------------- ------- -- ---- ------- ---
在 Nginx 的配置中,我们需要将 /sse 请求转发给 Node.js 应用程序:
-- -------------------- ---- ------- -------- ---- - --------------- ---- ---------------- ---------- --- ---------------- ----------------- ---------- ------------------ ---- ---------------- ---- ------ ------------------ -------------- ---------------- ------- -------------- ---------- ---------------------- -
总结
通过禁用 Nginx 的缓存功能,我们可以解决 SSE 数据传输异常的问题。在实际应用中,我们需要根据具体的场景和需求,合理配置 Nginx 的反向代理服务器,以保证 SSE 的稳定运行。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65cc6f11add4f0e0ff5d360f