LiveKit部署实战:一份配置从跑通到生产
【免费下载链接】livekitEnd-to-end realtime stack for connecting humans and AI项目地址: https://gitcode.com/GitHub_Trending/li/livekit
要给一个 200 人规模的在线课堂挑实时音视频底座,LiveKit部署基本是你落地时要先跑通的一环。它把信令、媒体转发(SFU)、房间状态收进同一个 Go 服务,你不用自己拼 SFU 加 Redis 的分布式拼图。下文不讲参数手册,只回答三个问题:它解决什么、最短怎么跑起来、生产要踩哪些坑。
🔧 架构速览:先记住三层关系
把 LiveKit 想成一部「电话交换台」,客户端先走信令握手,再走媒体流,状态交给 Redis 共享。
如果只让你记住三件事,就是下面这三个配置维度,后文都围绕它们展开:
- 网络端口:
rtc的 UDP 端口范围(媒体)加 TCP 回退端口。 - 密钥 keys:JWT 鉴权,不配服务端起不来。
- Redis 状态外置:配了就自动进入分布式模式,是横向扩容的开关。
📌 跑通最小可用配置
下面是能直接启动的最短配置,端口和密钥各留一行,其余走默认值。
port: 7880 rtc: port_range_start: 50000 port_range_end: 60000 tcp_port: 7881 keys: my_key: my_secret logging: level: info逐行说明为什么是这个值:
| 参数 | 不配会怎样 / 配了之后效果 |
|---|---|
port: 7880 | 不配默认也是 7880,承载信令与 RoomService API |
port_range_start/end | 媒体 RTP 走这段 UDP,不配默认 50000-60000;改了要同步改防火墙 |
tcp_port: 7881 | UDP 被墙时的 ICE/TCP 回退,必须直接暴露、不能挂 TLS |
keys | 不配则启动校验直接失败,客户端 token 靠它签名 |
启动后用一条命令确认就绪,预期返回OK:
./livekit-server --config config.yaml # 启动服务 curl -s http://localhost:7880/ # 预期输出: OK ./livekit-server --config config.yaml ports # 列出实际占用的 TCP/UDP 端口改port会同时移动信令和 API 的监听口;改 UDP 范围只影响媒体、不动信令。仓库根目录的config-sample.yaml注释了全部高级项,需要时再查。
⚙️ 生产部署:按规模递进
单机加固:开发 vs 生产对比
开发模式(--dev)会悄悄帮你做两件事:日志切 debug、只绑回环地址,还会在你没给密钥时塞进devkey/secret占位对。这些在生产都是雷。关键差异如下:
| 维度 | 开发 | 生产 |
|---|---|---|
| 密钥 | 占位devkey/secret | 必须换成真实密钥对,建议走generate-keys生成 |
| 监听 | 仅127.0.0.1 | 绑真实网卡,前置 LB 并启用 TLS |
| 日志 | debug 全量 | info加sample: true采样,避免日志风暴 |
| 指标 | 不开 | 开prometheus.port,否则无法扩缩容 |
| 运行身份 | 当前用户 | 建议非 root,--cap-drop ALL最小化权限 |
多节点与容器化:端口怎么暴露、状态放哪
端口解决后,下一个要处理的是网络暴露模型。三类端口归属完全不同:
| 端口 | 协议 | 暴露范围 |
|---|---|---|
| 7880 | TCP | 对外,挂 LB + TLS |
| 7881 | TCP | 对公网裸暴露,禁止 TLS/LB |
| 50000-60000 | UDP | 对公网裸暴露,防火墙放行入站 |
| 6789 | TCP | 仅集群内,给 Prometheus 抓 |
把有状态的 Redis 从进程里剥离,是横向扩容的前提。容器化片段如下,它同时回答了端口暴露与状态外置两件事:
services: redis: image: redis:7-alpine livekit: image: livekit/livekit-server command: --config /config.yaml volumes: - ./config.yaml:/config.yaml ports: - "7880:7880" - "7881:7881" - "50000-60000:50000-60000/udp" environment: - LIVEKIT_REDIS_ADDRESS=redis:6379 deploy: replicas: 2 restart: unless-stopped这段里replicas解决的是上面第三点「横向扩容」,redis服务解决的是状态外置。弹性伸缩的触发条件建议盯节点指标:单节点 CPU 或轨道数逼近上限(默认每核约 400 轨道)时加副本,而不是按连接数盲目扩。
可观测性闭环:指标、告警、采样
开 Prometheus 并开启日志采样,指标、日志、告警才闭得了环:
prometheus: port: 6789 # username: metrics # password: <strong-password> logging: level: info json: true sample: true告警阈值建议(结合 Grafana 面板):
| 指标 | 关注点 | 建议阈值 |
|---|---|---|
| 房间/参与者数 | 容量水位 | 接近节点limit上限 |
| 节点 CPU 使用率 | 单核热点 | 持续 >70% |
| 信号/信令 RTT | 信令健康 | 持续偏高触发回退 |
sample日志采样 | 防日志风暴 | 生产必开 |
⚠️ 部署前必看的 5 个高频问题
- UDP 范围没放行:客户端能连信令却黑屏,媒体包进不来。解法:防火墙对
port_range_start-end开放入站 UDP。 - 7881 被挂了 TLS:ICE/TCP 回退直接失效。解法:该端口裸暴露,不加证书。
- 云主机内网 IP 外发错候选:AWS/GCP 上客户端连不上。解法:开
rtc.use_external_ip: true走 STUN 发现公网 IP。 - 密钥写进镜像:泄露后无法单独轮换。解法:密钥与 secret 走 Secret/环境变量注入,不烤进镜像。
- Redis 挂了全集群掉线:状态没外置就扛不住。解法:配 Redis(含哨兵),多节点共享房间状态。
回到开头那个 200 人的课堂:到这里,这套 LiveKit部署单机就能扛下全量课堂,节点不够时横向加副本即可,不必重写架构。
【免费下载链接】livekitEnd-to-end realtime stack for connecting humans and AI项目地址: https://gitcode.com/GitHub_Trending/li/livekit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考