Nginx 代理导致流式数据丢失的解决方案
在流式数据传输(如 SSE)中,Nginx 默认的缓冲机制可能会导致数据流式失效,所有数据被合并成一条再推送给前端。
关于SseEmitter流式传输内容参考博客:使用 SseEmitter 实现 Spring Boot 后端的流式传输
1. 问题描述
在本地测试时,我的流式数据传输是正常的:
- 后端使用
SseEmitter
持续推送数据。 - 前端
EventSource
逐步接收流式数据。
但当我把项目部署到服务器,并通过 Nginx 代理后,前端收到的数据变成了一次性推送,而不是流式返回。经过排查,发现是 Nginx 默认的缓存和缓冲机制 导致了这个问题。
2. 解决方案:修改 Nginx 配置
为了解决流式数据丢失的问题,我们需要在 Nginx 配置文件中进行调整,禁用缓存和缓冲机制。
修改 nginx.conf
或你的站点配置
location /api/chat/ {
proxy_pass http://127.0.0.1:8080;
# 关闭 Nginx 代理缓存
proxy_cache off;
# 禁用缓冲,让数据即时发送
proxy_buffering off;
# 启用分块传输编码,确保流式数据正常推送
chunked_transfer_encoding on;
# 优化 TCP 传输
tcp_nopush on;
tcp_nodelay on;
# 连接保持时间,避免过快关闭连接
keepalive_timeout 300;
}