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 媒体网关,内置多种插件(如 videoroom、audiobridge、textroom、streaming 等),可作为 SFU/多媒体中转枢纽,为你的前端/客户端提供实时音视频会话能力。

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

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

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

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

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

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

3. Docker 一键部署

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

3.1 拉取与启动

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

    • 例如:janus.jcfg、janus.transport.http.jcfg、janus.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.jcfg、janus.transport.*.jcfg、janus.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 以及端口
    • secure、cert_pem、cert_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 进行屏幕共享

媒体获取 体验