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

使用Nginx时,SSE事件数据被切断,nginx,flask,reverse-proxy,server-sent-events,chunked-encoding,Nginx,Flask,Reverse Proxy,Server Sent Events,Chunked Encoding,我正在使用React和Flask实现一个web界面。此接口的一个组件是服务器发送的事件,用于在数据库中更新前端数据时更新数据。此数据相当大,一个事件可能包含16000多个字符 React前端使用反向代理到flask后端,以便将API请求转发给它。当直接访问此后端时,这可以很好地处理SSE,数据按预期推送。然而,当使用Nginx为反向代理服务时,会发生一些奇怪的事情。nginx似乎会缓冲和分块事件流,并在填充大约16000个字符之前不会发送结果。如果来自事件的数据小于此值,则意味着前端必须等待更多

我正在使用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):

这是可用的
站点中的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;
        }
}
上游后端{
服务器127.0.0.1:6666;
}
服务器{
听7076;
根;
index.html;
地点/{
try_files$uri$uri/=404;
}
地点/空气污染指数{
包括代理参数;
代理通行证http://backend;
代理集头连接“”;
proxy_http_版本1.1;
代理缓冲关闭;
代理缓存关闭;
分块传输编码关闭;
}
}
此配置基于上面提到的答案

正如您所看到的,
proxy\u buffering
chunked\u transfer\u encoding
都关闭了,所以我不明白为什么会发生这种情况。我也尝试过改变缓冲区大小,但没有任何运气


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

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

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;
        }
}