Nginx反向代理实时流媒体需按协议分层处理:RTMP等TCP流用stream模块四层转发;HLS/HTTP-FLV等HTTP流用http块proxy_pass代理,并禁用缓冲、启用负载均衡与健康检查;WebRTC信令走HTTP/WebSocket,媒体UDP流须由stream或专用TURN服务器承载。

要让 Nginx 反向代理实时流媒体请求(如 RTMP、HLS、WebRTC 或 HTTP-FLV)到后端流服务器集群,关键不在常规 http 块的 proxy_pass,而在于协议匹配、连接保持、低延迟转发和集群调度逻辑。Nginx 本身不原生支持 RTMP 协议代理,但可通过模块扩展或分层架构实现;对基于 HTTP 的流(如 HLS 分片、HTTP-FLV、DASH),标准 HTTP 反向代理即可胜任;对 TCP/UDP 流媒体,则需 stream 模块介入。
区分流类型,选对代理层级
实时流媒体不是单一协议,必须先明确客户端访问方式:
-
RTMP 推流/拉流:属于 TCP 应用层协议,Nginx 官方不支持,需安装第三方
nginx-rtmp-module(作为独立 RTMP 服务器使用,非纯代理);若仅做“透明中转”,应启用stream模块做四层转发。 -
HLS / HTTP-FLV / DASH:本质是 HTTP 请求(.m3u8、.ts、.flv 文件),完全适配 Nginx 的
http反向代理,可结合缓存、负载均衡、HTTPS 终结统一处理。 -
WebRTC(TURN/STUN 或媒体信令):信令走 HTTP/WebSocket,可用
http或stream(WebSocket over TLS 时注意 ALPN);媒体流本身为 UDP,必须由stream模块或专用 TURN 服务器承载,Nginx 不直接代理音视频 RTP 包。
HTTP 类流媒体(HLS/HTTP-FLV)的反向代理配置
适用于已将流封装为 HTTP 资源的场景,例如前端请求 https://live.example.com/app/stream.flv,后端流服务运行在 192.168.10.10:8080 和 192.168.10.11:8080 上:
- 在
http块中定义上游集群,启用健康检查与会话保持(如按 stream 名哈希):upstream live_backend {<br> ip_hash;<br> server 192.168.10.10:8080 max_fails=2 fail_timeout=10s;<br> server 192.168.10.11:8080 max_fails=2 fail_timeout=10s;<br>} - 在
server块中匹配流路径,透传关键头并禁用缓冲:location ~ ^/(app|live)/.*\.(flv|m3u8|ts|mp4)$ {<br> proxy_pass http://live_backend;<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br> proxy_buffering off;<br> proxy_cache off;<br> proxy_http_version 1.1;<br> proxy_set_header Upgrade $http_upgrade;<br> proxy_set_header Connection "upgrade";<br>} - 对 HLS 的
.m3u8响应,建议开启缓存(短 TTL),减少源站压力;对.ts分片可设更长缓存,但需确保Cache-Control与源站一致。
TCP/UDP 流媒体(RTMP、RTP、SRT)的四层代理配置
当需要将客户端 RTMP 推流(如 rtmp://live.example.com/live/stream)透明转发至内网多个流服务器时,必须使用 stream 模块(确认编译含 --with-stream):
- 在顶层
stream块中定义上游与负载策略:upstream rtmp_cluster {<br> least_conn;<br> server 192.168.10.10:1935 weight=3;<br> server 192.168.10.11:1935 weight=3;<br> server 192.168.10.12:1935 backup;<br>} - 监听 RTMP 端口并转发:
server {<br> listen 1935;<br> proxy_pass rtmp_cluster;<br> proxy_timeout 1h;<br> proxy_responses 1;<br>} -
proxy_timeout必须设长(如 1 小时),避免直播长连接被误断;proxy_responses 1表示只等待一次响应即建立连接,适合无状态转发。
补充要点:安全、可观测性与平滑扩缩容
真实生产环境中还需考虑:
-
HTTPS + WSS 终结:对外提供
wss://live.example.com/ws信令,Nginx 终止 TLS 后以ws://转发至后端集群,降低流服务器 SSL 开销。 -
动态上游发现:配合 Consul 或 DNS SRV 记录,用
resolver+ 变量域名实现服务自动注册,避免硬编码 IP。 -
连接数与带宽限速:用
limit_conn(按 IP 或 key)和limit_rate防止单流打满带宽,保护集群稳定性。 -
日志增强:记录
$upstream_addr、$upstream_response_time、$request_length,便于定位卡顿源头是网络、代理还是源站。


















