使用 Nginx 时 SSE 事件数据被切断

SSE event data gets cut off when using Nginx

我正在使用 React 和 Flask 实现一个 Web 界面。此接口的一个组件是服务器发送的事件,用于在数据库中更新数据时更新前端的数据。此数据非常大,一个事件可能包含超过 16000 个字符。

React 前端使用反向代理到 flask 后端,以便将 API 请求转发给它。当直接访问这个后端时,这对 SSE 工作正常,并且数据按预期推送。然而,当使用 Nginx 服务于反向代理时,一些奇怪的事情发生了。似乎 nginx 缓冲事件流并将其分块,直到它填充了大约 16000 个字符才发送结果。如果来自事件的数据小于此值,则意味着前端将不得不等待发送更多事件。如果来自事件的数据较大,则意味着告诉 EventSource 已收到消息的新行不是事件的一部分。这导致前端在发送事件 X+1 时接收到事件 X(即,当换行符实际出现在流中时)。

这是使用nginx时的响应头:

HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Thu, 19 Nov 2020 13:10:49 GMT
Content-Type: text/event-stream; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

这是运行flask run直接访问端口时的响应头(后面我打算用gunicorn,但我用flask run测试了确定问题出在 nginx 而不是 gunicorn):

HTTP/1.0 200 OK
Content-Type: text/event-stream; charset=utf-8
Cache-Control: no-transform
Connection: keep-alive
Connection: close
Server: Werkzeug/1.0.1 Python/3.7.6
Date: Thu, 19 Nov 2020 13:23:54 GMT

这是sites-available中的nginx配置:

upstream backend {
        server 127.0.0.1:6666;
}

server {
        listen 7076;
        root <path/to/react/build/>;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }

        location /api {
                include proxy_params;
                proxy_pass http://backend;
                proxy_set_header Connection "";
                proxy_http_version 1.1;
                proxy_buffering off;
                proxy_cache off;
                chunked_transfer_encoding off;
        }
}

此配置基于 here 提到的答案。

如您所见,proxy_bufferingchunked_transfer_encoding 都关闭了,所以我不明白为什么会这样。我也尝试过更改缓冲区大小,但没有任何运气。

谁能告诉我为什么会这样?我该如何修复它,使使用 nginx 的结果与我不使用它时的行为相同?谢谢。

上述配置确实有效。但是,我使用的服务器包含另一个覆盖我的配置的 nginx 配置。当特定于 SSE 的配置参数也被添加到该配置时,事情开始按预期工作。所以 this question 一直都是正确的。