反代后面是 FastAPI 的 SSE 接口,location 里已经写了 proxy_buffering off,浏览器 network 面板仍是一次性收到全部事件,响应头里也看不到 chunked。
把日志和配置对完,能解释这个现象的基本就这几处。上游自己开了 gzip 压缩;框架中间件把 StreamingResponse 又包了一层;少了 X-Accel-Buffering: no 响应头;proxy_cache 开着 会把整个响应缓存下来。
直接打上游确认是不是 Nginx 的问题
curl -N http://127.0.0.1:8000/stream
接着在响应里补 Accel 头
python -c "print({'X-Accel-Buffering':'no'})"
然后关掉 gzip 与缓存后重载配置
nginx -t; nginx -s reload
从公网侧再抓一次响应头
curl -N -D - https://api.example.com/stream -o /dev/null
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
同样的操作我在测试机上先走了一遍,线上只做验证过的部分。
别只看报错消失,验证要多做一步。响应头出现 Transfer-Encoding: chunked,客户端每秒都能收到事件,访问日志在流结束前就写入。
提醒一点。proxy_buffering off 只解决 Nginx 这层,gzip、缓存、框架中间件任一处的缓冲都会让流变成整包。这类问题最好一次改到位,反复小改反而容易把原因搅混。
