处理大模型流式SSE转发,Nginx代理缓冲关闭的正确参数
大模型接口通常以 SSE(Server-Sent Events)方式把结果逐字或逐段推送给前端,如果中间经过 Nginx 反向代理,默认开启的代理缓冲会把响应攒到一定大小再统一发出,导致前端不是实时收到字符,而是等很久才一次性出现大段内容。
解决这个问题需要在 Nginx 转发配置里关闭代理缓冲,核心参数是 proxy_buffering off;,同时配合禁用代理缓存和设置 HTTP 1.1,下面按零基础可照做的顺序展开。
为什么 SSE 转发必须关闭 Nginx 缓冲
Nginx 的 proxy_buffering 默认开启,它会将后端返回的数据先存到缓冲区,直到攒够 4KB 或响应结束才发送给客户端。
对普通接口影响不大,但 SSE 依赖长连接和持续输出,一旦被缓冲,逐字推送就变成了延迟释放,表现就是“等半天突然出现一大段”。
大模型场景中用户期待的是打字机效果,所以必须关闭缓冲。
正确参数配置示例
在 Nginx 配置中,找到需要转发大模型接口的 location 块,加入以下配置:
location /v1/chat/completions {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
每一项含义如下:
proxy_http_version 1.1;:后端默认支持 HTTP/1.1,SSE 长连接必需。proxy_set_header Connection "";:清空 Connection 头,避免 Nginx 复用上游连接时影响流式响应。proxy_buffering off;:核心参数,关闭代理缓冲,数据到达后立即转发给客户端。proxy_cache off;:关闭代理缓存,防止响应被缓存导致不实时。proxy_read_timeout和proxy_send_timeout:设置较长超时时间,避免流式输出中途被 Nginx 掐断。
完整操作步骤
先确认 Nginx 配置文件位置。
Debian/Ubuntu 系统一般在 /etc/nginx/nginx.conf,CentOS 在 /etc/nginx/nginx.conf,站点配置通常在 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/。
如果使用宝塔面板,可以在“网站 → 设置 → 配置文件”中直接编辑。
按顺序执行:
- 打开对应站点配置文件,找到需要代理大模型接口的
location。 - 粘贴上面的配置片段,注意把
proxy_pass改成你自己的后端地址。 - 保存文件后执行
nginx -t检查语法,出现syntax is ok表示正常。 - 执行
systemctl reload nginx或nginx -s reload重载配置。
重载不会中断现有连接,可以放心操作。
常见配置坑点
只关闭 proxy_buffering 不一定完全生效,还需要留意以下几点:
- 如果开启了
proxy_cache,即使关闭 buffering,缓存层也可能吞掉流式响应,务必加上proxy_cache off;。 - 不要在后端同时开启 gzip,否则 Nginx 或前端可能因为压缩缓冲导致流式数据延迟,建议 SSE 接口单独关闭压缩。
- 如果 Nginx 前面还有 CDN 或另一层反向代理,那一层也需要关闭缓冲,比如 Cloudflare 有
buffer开关。 - 某些情况下还需要设置
fastcgi_buffering off;,但该指令只影响 FastCGI 上游,常规 HTTP 代理不需要。 - 如果使用了
proxy_buffers之类的指令,关闭 buffering 后这些配置不会生效,不用重复设置。
验证流式转发是否正常
修改配置后,可以用 curl 直接测试后端和 Nginx 的行为差异。
先测后端:
curl -N --max-time 60 http://后端地址/v1/chat/completions -H "Content-Type: application/json" -d '{"stream": true}'
观察是否逐字输出。
然后测 Nginx 地址:
curl -N --max-time 60 https://你的域名/v1/chat/completions -H "Content-Type: application/json" -d '{"stream": true}'
如果 Nginx 地址也能逐字出现内容,说明 proxy_buffering off; 已生效。
另外可以用 curl -I 查看响应头,如果看到 X-Accel-Buffering: no,也说明 Nginx 已确认关闭缓冲。
如果发现输出仍然不实时,优先检查是否有多层代理、是否开启了 gzip、以及 proxy_cache 是否真的关掉。
配置完成后建议用实际大模型接口连续测试几分钟,确认流式输出稳定后再接入生产环境。