nginx不能代理webrtc的udp媒体流,但可安全代理其https信令、管理接口及websocket连接(如/rtc/v1/subscribe),核心配置包括ssl终止、显式upgrade头透传、map映射connection_upgrade,并设置长超时与禁用buffering。

WebRTC 流量本身不走 HTTP 协议,但 WebRTC 的信令(signaling)和部分控制接口(如 SRS 的 HTTP API、Web 控制台、HTTPS 推拉流端点)依赖 HTTPS 和 WebSocket。Nginx 不能直接转发 WebRTC 的 UDP 媒体流(如 SRTP、RTCP),但它可以代理 WebRTC 所需的信令通道、HTTP 管理接口、以及关键的 WebSocket 连接(如 SRS 的 /rtc/v1/subscribe 或 /rtc/v1/publish)。配置核心是:HTTPS 终止 + WebSocket 透传 + 正确头信息传递。
确保 Nginx 支持 WebSocket 和 HTTP/1.1
Nginx 默认不自动升级 WebSocket 连接,必须显式配置升级逻辑:
- 在 http 块顶部添加映射规则(全局生效,只需一次):
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
- 该映射让 Nginx 能识别
Upgrade: websocket请求头,并将Connection: upgrade正确透传给后端。
配置 HTTPS 端口并代理到 SRS 的 HTTPS 接口
假设 SRS 已通过 httpx-static 或内置 HTTPS 模块启用 HTTPS(如监听 https://192.168.0.110:1985),Nginx 需做 SSL 终止:
- 监听 443,加载证书(可使用自签名或 Let’s Encrypt);
-
proxy_pass指向 SRS 的 HTTPS 地址时,建议改用其 HTTP 端口(如http://192.168.0.110:8080)以避免证书链嵌套问题; - 若坚持代理 HTTPS 后端(即
https://...),需开启proxy_ssl_*参数并信任其证书。
为 WebRTC 相关路径显式启用 WebSocket 透传
SRS 的 WebRTC 推拉流通常通过 /rtc/v1/ 路径发起 WebSocket 连接。Nginx 必须对这些路径保留 Upgrade 行为:
- 在
location块中匹配 WebRTC 关键路径,例如:
location ^~/rtc/v1/ {
proxy_pass http://192.168.0.110:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
-
proxy_read/send_timeout设长些,防止 WebRTC 长连接被误断; -
^~前缀确保前缀匹配优先于正则,提升效率; - 不要加
proxy_buffering on,避免阻塞实时信令帧。
补充:SRS 侧需配合的设置
Nginx 是“代理”,SRS 是“被代理方”,二者需协同:
- SRS 的
http_api和http_server应启用 HTTPS 或至少允许 HTTP(若由 Nginx 统一加密); - SRS 的
vhost配置中,rtc模块的listen地址应设为内网 IP(如0.0.0.0:8000),且不暴露公网; - 若使用自签名证书生成 SRS 的
mysrs.crt,Nginx 无需验证它——因为 Nginx 到 SRS 走的是内网 HTTP; - 前端 JS 初始化 RTCPeerConnection 时,信令 URL 应指向 Nginx 域名(如
wss://stream.example.com/rtc/v1/subscribe),而非直连 SRS 内网地址。











