
本文面向使用 janus-gateway / janus webrtc gateway 的开发者,覆盖 janus-gateway docker 的快速部署与上线实践。
这篇文章聚焦“能跑起来”的视角:先给出最小可用的 Janus 启动方式,再给出 Docker 化部署方案,并把 HTTPS/WSS 反向代理与 STUN/TURN 的关键点说清楚,帮助你把 Demo 快速带起来,然后再按需加固。
参考资料:
- Janus 官方文档:https://janus.conf.meetecho.com/docs/
- Docker 部署仓库(参考):https://github.com/wangsrGit119/janus-webrtc-gateway-docker
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 拉取与启动
-
准备配置目录:在项目根目录下创建
conf/
,放入你的 Janus 配置文件(可参考官方 conf 模板)。- 例如:
janus.jcfg
、janus.transport.http.jcfg
、janus.eventhandler.sampleevh.jcfg
等。
- 例如:
-
编写
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
- 启动服务:
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. 参考链接
- 官方文档(Architecture/Plugins/Transport):https://janus.conf.meetecho.com/docs/
- Docker 部署参考仓库:https://github.com/wangsrGit119/janus-webrtc-gateway-docker
- coturn(TURN 服务器):https://github.com/coturn/coturn
- webrtc-internals:
chrome://webrtc-internals
标签
版权声明
本文由 WebRTC.link 创作,采用 CC BY-NC-SA 4.0 许可协议。本站转载文章会注明来源以及作者。如果您需要转载,请注明出处以及作者。
评论区
Giscus评论由 Giscus 驱动,基于 GitHub Discussions