关键是要关闭 nginx 默认缓冲行为,首要配置是 location 块内设置 proxy_buffering off;同时建议关闭 proxy_cache 和 proxy_request_buffering,启用 chunked_transfer_encoding 与 tcp_nodelay,并调优超时和缓冲区大小,确保后端响应头及 upgrade 头正确透传。

要让 Nginx 正确转发流式响应(如 SSE、WebSocket、实时日志、AI 打字机效果等),关键不是调优带宽或压缩,而是**打破默认缓冲行为**。Nginx 默认会攒够数据再发,这和流式“边生成边推送”的本质冲突。
必须关闭 proxy_buffering
这是最核心的一条。只要没关,其他配置都白搭。
- proxy_buffering off; —— 禁用响应缓冲,让 Nginx 收到后端一个字节就立刻转发给客户端
- 该指令需放在具体
location块内,不能只写在http或server层级 - 如果同时代理普通接口和流式接口,建议为流式路径单独配 location,避免影响其他请求
配套关闭缓存与请求缓冲
缓冲和缓存是连带机制,关一个不等于全关。
- proxy_cache off; —— 防止 Nginx 把流式响应当成静态内容缓存
- proxy_request_buffering off; —— 避免 Nginx 把客户端的长连接请求体先缓存再发给后端(对 SSE/POST 流场景尤其重要)
- 这两项虽非绝对强制,但在生产环境强烈建议加上,避免偶发卡顿或超时重置
启用分块传输与调优 TCP 行为
让底层网络配合流式语义,减少粘包和延迟。
- chunked_transfer_encoding on; —— 启用 HTTP 分块编码,是流式响应的协议基础
- tcp_nodelay on; —— 关闭 Nagle 算法,避免小包合并,提升实时性
- proxy_read_timeout 300; —— 设置足够长的读超时(如 5 分钟),防止长连接被误断
- 可选:
proxy_buffer_size 1k; proxy_buffers 4 1k;控制最小缓冲粒度,进一步降低延迟感
检查后端与 Header 透传是否到位
Nginx 只是通道,两端配合才能跑通。
- 确认后端已设置正确的响应头:
Content-Type: text/event-stream(SSE)或Transfer-Encoding: chunked - 确保
proxy_set_header Connection "upgrade";和proxy_set_header Upgrade $http_upgrade;已配置(WebSocket 必需) - 不要遗漏
X-Forwarded-For和Host等基础头,否则后端可能拒绝或路由错误











