背景:今天对接后端 Agent 返回消息时,发现输出效果不如 ChatGPT、豆包或 deepseek 那样流畅。通过开发者工具查看发现,同一毫秒内会返回约 10 条消息,所以会造成消息一大块一大块的渲染,而不是像打字机那样丝滑,起初以为是算法或后端问题,经过排查才发现是 Nginx 代理层的默认缓冲设置导致的。
1. 为什么会出现这种情况?
Nginx 默认开了 proxy_buffering,会先把后端响应缓冲到内存里,攒够一部分数据后再一次性发给前端。
所以在 Nginx 配置里关掉:
bash
proxy_buffering off;
chunked_transfer_encoding on;
proxy_cache off;
这样 Nginx 就会「边收到边转发」,前端就能逐条拿到流了。
解决方案如下:
(1)给nginx的proxy代理加这三行代码:
proxy_buffering off; # 关闭响应缓冲
chunked_transfer_encoding on; # 开启分块传输
proxy_cache off; # 关闭缓存
若不想影响其他接口,只对某一个流式接口单独关闭代码缓冲,则单独加即可:
# 单独配置 /api/medical/AIChat/getReply
location = /{{你的具体流式接口地址}} {
proxy_pass {{你的域名}}/{{你的具体流式接口地址}}
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffering off; # 关闭响应缓冲
chunked_transfer_encoding on; # 开启分块传输
proxy_cache off; # 关闭缓存
}
这样发到产线后就解决了
(2)本地开发环境如何解决?以我的vite.config.js为例:
bash
proxy: {
// 单独给 /api/AIChat/getReply 加特殊配置
'/api/AIChat/getReply': {
target: `${pythonDomain}/api/AIChat/getReply`,
changeOrigin: true,
ws: true,
// 不做 rewrite,让它直通后端
// 如果要 rewrite,也必须保持和后端路径一致
},
// 其它 /api 依然走原有规则
'/api': {
target: `${pythonDomain}/api`,
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace('/api', '')
}
}
好了,本地开发环境与线上环境都解决了,快去试试吧!