解决 Nginx 配置中对 SSE 对 proxy_buffering 异常的影响

背景

随着 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