You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署环境下Nginx RTMP模块配置报错:host not found in upstream

Docker部署环境下Nginx RTMP模块配置报错:host not found in upstream

嘿,这个问题我之前踩过一模一样的坑!核心原因其实是Nginx的RTMP模块和HTTP模块是相互独立的——你在HTTP块里定义的api-servers upstream,RTMP模块根本认不出来!

你看,当RTMP模块读到http://api-servers/...这个地址时,它会把api-servers当成普通域名去做DNS解析,但你的Docker环境里根本没有这个域名的解析记录,自然就抛出了host not found的错误。

给你两个可行的解决方案,按需选择:

方案一:直接使用真实服务器地址(简单但无负载均衡)

如果暂时不需要负载均衡能力,你可以直接把upstream里的真实IP和端口填到RTMP的回调地址里:

rtmp {
  server {
    listen 1935;

    on_publish http://172.16.16.6:7575/api/livevideostreams/startlivevideostream; 
    on_publish_done http://172.16.16.7:8585/api/livevideostreams/stoplivevideostream; 
  }
}

这种方法最直接,但缺点是没法用到你配置的负载均衡规则。

方案二:通过HTTP模块转发回调请求(保留负载均衡)

如果想保留负载均衡的能力,我们可以让RTMP把回调请求先发给同一容器内的HTTP模块,再由HTTP模块用upstream去转发:

  1. 先在HTTP块里新增一个专门处理RTMP回调的location:
http {
  upstream api-servers {
    server 172.16.16.6:7575;# load balancing server 1
    server 172.16.16.7:8585;# load balancing server 2 
  }

  server{
    listen 8080;

    location / {
      # 你原来的proxy_pass配置...
    }

    # 新增RTMP回调转发规则
    location /rtmp-callback/ {
      proxy_pass http://api-servers/api/livevideostreams/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}
  1. 然后修改RTMP模块的回调地址,指向HTTP模块的这个location:
rtmp {
  server {
    listen 1935;

    on_publish http://localhost:8080/rtmp-callback/startlivevideostream; 
    on_publish_done http://localhost:8080/rtmp-callback/stoplivevideostream; 
  }
}

这里要注意,在Docker容器里,localhost指的是容器自身,只要你的HTTP模块和RTMP模块在同一个Nginx容器里,这个地址就能正常通信。如果是多容器部署,把localhost换成API服务的Docker容器名或者所在网络的IP就行。

另外还要确认你的Nginx镜像已经包含了RTMP模块,比如可以用官方带RTMP的镜像,或者自己构建的时候加上--add-module=nginx-rtmp-module参数。

备注:内容来源于stack exchange,提问作者Ananth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:08:11