Nginx 代理导致流式数据丢失的解决方案

在流式数据传输(如 SSE)中,Nginx 默认的缓冲机制可能会导致数据流式失效,所有数据被合并成一条再推送给前端。
关于SseEmitter流式传输内容参考博客:使用 SseEmitter 实现 Spring Boot 后端的流式传输


1. 问题描述

在本地测试时,我的流式数据传输是正常的:

  1. 后端使用 SseEmitter 持续推送数据。
  2. 前端 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;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐