导出接口每行 yield 一次,服务端日志一秒一条,浏览器 Network 面板十分钟都是 0 字节,直到任务结束才一次性下载完。乍看像缓存或者权限的锅,追下去往往不是。
proxy_buffering off; proxy_cache off; add_header X-Accel-Buffering no;
追下去是这么回事:nginx 默认开启 proxy_buffering,会把上游响应攒进缓冲区再发给客户端,小块数据一直不到阈值。应用层的 gzip 中间件也会再压一层,进一步推迟输出。
「流式响应缓冲」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,响应头加 X-Accel-Buffering: no 让 nginx 不缓冲这一条;对这个接口关掉 gzip 压缩;前端用 fetch 的 reader 逐块读 确认首包时间。
验收就看一点,改完后浏览器 1 秒内收到第一块数据,Network 面板能看到传输中的字节数持续增长。
