Janus WebRTC 网关快速部署:Docker + Nginx 反代 + STUN/TURN 实战

服务端技术 精选 8 分钟 |
Janus WebRTC 网关快速部署:Docker + Nginx 反代 + STUN/TURN 实战

本文面向使用 janus-gateway / janus webrtc gateway 的开发者,覆盖 janus-gateway docker 的快速部署与上线实践。

这篇文章聚焦“能跑起来”的视角:先给出最小可用的 Janus 启动方式,再给出 Docker 化部署方案,并把 HTTPS/WSS 反向代理与 STUN/TURN 的关键点说清楚,帮助你把 Demo 快速带起来,然后再按需加固。

参考资料:

1. Janus 是什么(一句话版)

Janus 是一款通用的 WebRTC 媒体网关,内置多种插件(如 videoroomaudiobridgetextroomstreaming 等),可作为 SFU/多媒体中转枢纽,为你的前端/客户端提供实时音视频会话能力。

2. 快速启动(最小可运行)

下面以“本机调试”为出发点,跑起来 Janus 核心服务与内置 Web 示例页面(供功能验证)。

注:为避免浏览器安全策略影响,推荐尽早通过 HTTPS/WSS 环境访问(见后文反向代理)。

2.1 使用源码/发行包方式(概览)

  • 选项 A:自行编译(需安装依赖:libnicelibsrtplibmicrohttpdjanssonlibwebsockets 等)。
  • 选项 B:使用发行包或容器镜像(更快)。

如果你希望最快运行,建议直接看“Docker 部署”。

3. Docker 一键部署

以下示例基于社区维护的 Docker 项目(参考:https://github.com/wangsrGit119/janus-webrtc-gateway-docker ),针对“能跑通 Demo + 反代/证书 + STUN/TURN 对接”给出一个可落地的流程。

3.1 拉取与启动

  1. 准备配置目录:在项目根目录下创建 conf/,放入你的 Janus 配置文件(可参考官方 conf 模板)。

    • 例如:janus.jcfgjanus.transport.http.jcfgjanus.eventhandler.sampleevh.jcfg 等。
  2. 编写 docker-compose.yml(来自仓库 README 的示例):

services:
  janus-gateway:
    image: 'sucwangsr/janus-webrtc-gateway-docker:latest'
    # 仅启动 janus:
    #command: ["/usr/local/bin/janus", "-F", "/usr/local/etc/janus"]
    # 同时启动 nginx(8086) + janus:
    command: ["sh", "-c", "nginx && /usr/local/bin/janus -F /usr/local/etc/janus"]
    network_mode: "host"
    volumes:
      - "./conf/janus.transport.http.jcfg:/usr/local/etc/janus/janus.transport.http.jcfg"  # adminapi 配置
      - "./conf/janus.jcfg:/usr/local/etc/janus/janus.jcfg"
      - "./conf/janus.eventhandler.sampleevh.jcfg:/usr/local/etc/janus/janus.eventhandler.sampleevh.jcfg"
    restart: always
  1. 启动服务:
docker compose up -d
# 或
docker-compose up -d

启动完成后,你应当拥有:

  • 一个运行中的 Janus 网关(含 janus.transport.websockets/http
  • 容器内默认配置文件(janus.jcfgjanus.transport.*.jcfgjanus.plugin.*.jcfg

3.2 关键配置项(最小集)

常见需要关注的几个配置位于 conf/ 目录(容器内),不同镜像路径略有不同:

  • janus.jcfg
    • stun_server / stun_port:STUN 服务器地址与端口
    • turn_server / turn_port / turn_type / turn_user / turn_pwd:TURN 相关
    • nat_1_1_mapping:如处于 NAT 背后,可设置公网 IP 做 1:1 映射
    • interface:可绑定网卡/地址
  • janus.transport.websockets.jcfg
    • ws / wss:是否启用 WS/WSS 以及端口
    • securecert_pemcert_key:WSS 所需证书
    • http / https:是否启用 HTTP/HTTPS 以及端口(如使用内置 HTTP(S))
  • janus.transport.http.jcfg
    • port / admin_port:REST/事件接口端口
    • admin_secret:管理接口密钥(务必妥善保管)

提示:生产环境建议关闭未使用的传输(如禁用明文 WS/HTTP,仅暴露 WSS/HTTPS)。

3.3 Nginx 反向代理(HTTPS/WSS)

如果你用外部 Nginx 统一做 HTTPS/WSS 终止,核心是把 WebSocket(/janus)与静态 Demo 页面反代到 Janus 后端:

# 中文注释:仅作示例,请按需合并你的站点配置
server {
  listen 443 ssl http2;
  server_name rtc.example.com;

  ssl_certificate     /etc/letsencrypt/live/rtc.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/rtc.example.com/privkey.pem;

  # 反代 Janus WebSockets 接口(假设容器内暴露 8188/8989)
  location /janus {
    proxy_pass http://127.0.0.1:8188; # 或 https://127.0.0.1:8989 (WSS)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
  }

  # 示例站点
  location / {
    root /var/www/your-janus-demo;
    index index.html;
  }
}

如果希望 Nginx 仅做反代,WSS 证书也可以交给 Janus 自己管理(在 janus.transport.websockets.jcfg 中配置 cert_pem/cert_key)。二者择一即可。

3.4 STUN/TURN 协同

WebRTC P2P 建连高度依赖网络环境。建议:

# janus.jcfg 里典型配置片段(示意)
stun_server = "stun:stun.l.google.com"  # 中文注释:示例 STUN,生产建议自建或替换
stun_port   = 19302

# 当直连失败时走 TURN
turn_server = "turn:turn.example.com"
turn_port   = 3478
turn_user   = "user"
turn_pwd    = "pass"
turn_type   = "udp"  # 可选 udp/tcp/tls

# 如果 Janus 在 NAT 背后,配置 1:1 公网映射
nat_1_1_mapping = "203.0.113.10"

TURN 服务可选择 coturn,自建后在 Janus 与前端 SDP 中共同生效,显著提升复杂网络下的连通率。

3.5 验证与排查

  • 打开官方 Demo(或容器内提供的示例页),验证 videoroom/echotest/streaming 等插件是否可用。
  • 打开浏览器 DevTools → Network,确认 /janus 的 WebSocket 101 升级成功。
  • Chrome chrome://webrtc-internals 观察 ICE 候选、连接状态与码率变化。
  • 服务端看 Janus 日志(容器内通常在 /var/log/janus/ 或标准输出)。

4. 前端接入要点(janus.js)

  • 会话/句柄:先 Janus.init,再创建会话(session),再 attach 指定插件(如 janus.plugin.videoroom)。
  • 协商流程:createOffer/Answer → 通过 Janus 信令转发 → 收发远端 SDP/ICE。
  • 编解码:尽量与浏览器支持匹配(VP8/VP9/H.264/Opus);必要时在插件或 SDP 层做编解码约束。
  • 多路订阅:videoroom 下行多订阅要关注带宽与解码压力,移动端注意分辨率/帧率控制。

最小伪代码结构(仅示意):

// 中文注释:在 HTTPS 域名下加载 janus.js,并确保 /janus 可访问
Janus.init({debug: true, callback: () => {
  const janus = new Janus({
    server: 'wss://rtc.example.com/janus', // 你的反代地址
    success: () => {
      janus.attach({
        plugin: 'janus.plugin.videoroom',
        success: (pluginHandle) => {
          // 创建/加入房间,发布/订阅流
        },
        onmessage: (msg, jsep) => {
          // 处理 Janus 事件与 SDP
        },
        onremotestream: (stream) => {
          // 渲染远端流
        }
      });
    }
  });
}});

5. 常见问题(FAQ 精选)

  • 无法连上/黑屏:优先检查 WSS 反代、证书链是否完整,浏览器是否报 mixed content;其次看 STUN/TURN 可用性。
  • 移动端卡顿:合理设置发布端的分辨率/帧率与码率;必要时使用分层编码(SVC)或多档位发布。
  • NAT 下 Janus 公网可见性:开启 nat_1_1_mapping,结合外层端口映射;必要时配合 TURN。
  • 编解码不匹配:通过 SDP 限制或在房间策略控制优先编解码。

6. 参考链接

标签

#Janus #WebRTC #媒体服务器 #Docker #Nginx #SFU #Videoroom #TURN

版权声明

本文由 WebRTC.link 创作,采用 CC BY-NC-SA 4.0 许可协议。本站转载文章会注明来源以及作者。如果您需要转载,请注明出处以及作者。

评论区

Giscus

评论由 Giscus 驱动,基于 GitHub Discussions

相关文章

探索更多相关内容,深入了解 WebRTC 技术的各个方面

演示 Demo

LIVE

基础摄像头访问

展示如何使用 getUserMedia API 获取摄像头和麦克风

媒体获取 体验

PTZ 摄像头控制

控制支持 PTZ 功能的摄像头进行平移、倾斜和缩放

媒体获取 体验

屏幕共享

使用 getDisplayMedia API 进行屏幕共享

媒体获取 体验