实现秒级实时流媒体转发需在location块精准启用proxy_buffering off,并同步禁用proxy_cache、gzip,启用chunked_transfer_encoding和HTTP/1.1长连接,调优超时与TCP参数,且后端须禁用缓冲并设置正确响应头。

要实现秒级实时流媒体转发,核心是让 Nginx 停止缓存后端响应体,做到“收到即发”,而 proxy_buffering off 就是触发这一行为的关键开关。但它单独启用无效,必须在协议、超时、传输层和响应头层面协同配置,否则仍会出现首字节延迟高、消息堆积或连接中断等问题。
精准作用于流媒体路径,避免全局关闭
不要在 http 或 server 块中全局设置 proxy_buffering off——这会破坏普通 API 和静态资源的吞吐效率与稳定性。应仅对实际承载流媒体的 location 精准控制:
location /stream { proxy_pass http://media_backend; proxy_buffering off; }location /hls/ { ... proxy_buffering off; }-
location /llm/tokens { ... proxy_buffering off; }(适用于 token 流式输出)
必须同步关闭的配套机制
proxy_buffering 关闭后,Nginx 不再管理响应体生命周期,以下默认机制会冲突或失效,必须显式禁用:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- proxy_cache off:防止 Nginx 尝试缓存未结束的 chunked 响应,引发截断或 502
- gzip off:gzip 需完整响应才能压缩,与流式转发不兼容
- chunked_transfer_encoding on:显式启用分块编码,避免因缺失 Content-Length 而阻塞发送
- proxy_http_version 1.1; proxy_set_header Connection '':确保长连接不被中间代理降级或误关
关键超时与底层传输调优
流媒体常有空闲期或低频帧输出,超时值过短会导致连接被主动断开:
- proxy_read_timeout 300(或更长):适配后端帧间隔,如 SSE 或 LLM 场景下可能数十秒才发下一个 chunk
- tcp_nodelay on:禁用 Nagle 算法,确保每个小包(如单个视频 GOP 或 event 数据)立即发出,不合并等待
- proxy_buffer_size 4k:必须保留该值,它只缓存响应头,关闭 buffering 后仍需此空间写入状态行和 headers,设为 0 会直接导致 502
后端与响应头配合要点
Nginx 只透传,不生成或修正流式语义,后端必须主动配合:
- 后端需禁用自身输出缓冲(如 PHP 的
flush()、Python 的yield+response.stream、Node.js 的res.write() + res.flush()) - 响应头中必须含
Content-Type: video/mp4(或application/vnd.apple.mpegurl、text/event-stream等对应类型)和Cache-Control: no-cache - 避免返回
Content-Length,否则部分客户端或 CDN 会等待“满长”才开始解析播放 - 可加
add_header X-Accel-Buffering no;显式告知浏览器此处无缓冲,增强兼容性
不复杂但容易忽略

















