1. 为什么选择Docker+Nginx-RTMP搭建直播服务?
最近两年线上活动越来越频繁,很多团队都需要快速搭建临时直播服务。传统方式需要手动编译Nginx并配置RTMP模块,光是处理依赖项就可能耗掉半天时间。而用Docker容器化方案,从零开始到推流成功最快只要10分钟。
我去年给公司内部培训搭建直播系统时,实测传统方式需要处理至少7个依赖包,而Docker方案只需要两条命令。更关键的是,当需要迁移服务器时,容器化方案能实现环境的一致性,避免出现"在我机器上能跑"的经典问题。
Nginx-RTMP模块作为目前最稳定的开源流媒体方案之一,支持HLS、DASH等现代协议,同时保持对传统RTMP协议的良好兼容。配合Docker的端口映射能力,单台2核4G的云服务器就能支撑500人同时观看720p直播流。
2. 五分钟完成基础环境搭建
2.1 准备Linux服务器
推荐使用Ubuntu 20.04 LTS或更新版本,实测这个系统对Docker的兼容性最好。如果是阿里云/腾讯云等云服务商,记得在安全组规则中放行1935(TCP)和80/443端口。我遇到过三次因为忘记开端口导致推流失败的案例,特别是有些云平台默认会启用防火墙。
# 更新系统包(所有操作建议在root用户下执行) apt update && apt upgrade -y2.2 安装Docker引擎
现在安装Docker比前几年简单多了,官方提供了一键安装脚本。不过我还是喜欢用apt安装,更可控:
# 安装必要工具 apt install -y apt-transport-https ca-certificates curl software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 apt update && apt install -y docker-ce docker-ce-cli containerd.io # 验证安装 docker --version如果看到Docker版本号输出(比如20.10.17),说明安装成功。建议立即执行systemctl enable docker设置开机自启。
3. 部署Nginx-RTMP容器
3.1 选择合适的基础镜像
虽然tiangolo/nginx-rtmp镜像下载量最大,但我更推荐使用alfg/nginx-rtmp镜像。这个镜像更新更频繁,默认支持HLS和stat统计页面:
docker pull alfg/nginx-rtmp如果拉取速度慢,可以尝试更换国内镜像源。创建或修改/etc/docker/daemon.json文件:
{ "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn" ] }然后执行systemctl restart docker重启服务。
3.2 启动容器并配置端口
标准RTMP协议使用1935端口,但实际部署时建议把HLS的80端口也映射出来:
docker run -d \ -p 1935:1935 \ -p 8080:80 \ --name nginx-rtmp \ alfg/nginx-rtmp这里有个小技巧:加上--restart unless-stopped参数可以让容器意外退出时自动重启。我在生产环境用这个参数避免过三次半夜服务中断。
验证容器是否正常运行:
docker ps -a如果STATUS列显示"Up",说明服务已经启动。可以通过docker logs nginx-rtmp查看实时日志。
4. 配置推流与拉流
4.1 OBS推流设置详解
打开OBS设置→推流,服务类型选择"自定义",服务器地址格式为:
rtmp://你的服务器IP/live流密钥可以任意填写,比如"test"。这样完整的推流地址就是:
rtmp://你的服务器IP/live/test这里有个常见坑点:如果服务器绑定了域名,有些OBS版本会强制要求rtmp地址包含域名。此时需要在hosts文件中临时添加域名解析。
4.2 多种拉流方式配置
除了RTMP协议,我们还可以用HLS协议实现网页端播放:
http://你的服务器IP:8080/hls/test.m3u8实测HLS延迟在6-10秒左右,适合对实时性要求不高的场景。如果需要更低延迟,可以这样配置VLC播放器:
- 媒体→打开网络串流
- 输入地址:
rtmp://你的服务器IP/live/test - 在"更多选项"中把缓存调到300ms
我做过对比测试:同样的720p视频流,RTMP延迟能控制在1秒内,而HLS平均有8秒延迟。但HLS的优势是能自适应码率,在网络波动时更稳定。
5. 高级配置与性能优化
5.1 自定义Nginx配置
如果需要修改RTMP参数,比如增加并发流限制,可以这样操作:
# 进入容器shell docker exec -it nginx-rtmp /bin/bash # 编辑配置文件 vi /etc/nginx/nginx.conf在rtmp块中添加这些参数:
rtmp { server { listen 1935; chunk_size 4096; max_streams 100; max_connections 1000; application live { live on; record off; # 开启HLS支持 hls on; hls_path /tmp/hls; hls_fragment 3s; hls_playlist_length 60s; } } }修改后需要重启容器:docker restart nginx-rtmp
5.2 负载监控与自动恢复
建议安装cAdvisor监控容器资源使用情况:
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest然后访问http://服务器IP:8081就能看到实时监控面板。当RTMP服务异常时,可以设置自动重启策略:
docker update --restart=on-failure:3 nginx-rtmp6. 常见问题排查指南
6.1 推流连接失败排查
先检查1935端口是否开放:
telnet 你的服务器IP 1935如果连接失败,可能是:
- 云服务商安全组未放行
- 服务器防火墙未配置
- Docker端口映射错误
可以用这个命令验证端口映射:
docker port nginx-rtmp6.2 播放卡顿优化方案
如果观众反映直播卡顿,可以尝试以下调整:
- 在OBS中降低输出分辨率(比如从1080p降到720p)
- 调整码率设置(720p建议2500-3500kbps)
- 在Nginx配置中增加
buflen 500ms参数 - 开启OBS的"动态码率"选项
我在处理一次线上活动卡顿时发现,当服务器带宽跑满时,TCP重传率会飙升。这时候在Nginx配置中加入bandwidth 100Mbps;限制能有效缓解问题。
7. 生产环境部署建议
对于正式业务场景,建议做这些增强配置:
域名与HTTPS:
docker run -d \ -p 1935:1935 \ -p 80:80 \ -p 443:443 \ -v /path/to/certs:/etc/letsencrypt \ -e RTMP_STREAM_NAMES=all \ --name nginx-rtmp \ alfg/nginx-rtmp多实例负载均衡: 使用Docker Swarm或Kubernetes部署多个RTMP节点,前面用Nginx做负载均衡:
rtmp { server { listen 1935; application live { live on; record off; push rtmp://backend1/live; push rtmp://backend2/live; } } }日志持久化:
docker run -d \ -v ./logs:/var/log/nginx \ --name nginx-rtmp \ alfg/nginx-rtmp自动扩缩容: 结合Prometheus监控指标,设置当并发流超过阈值时自动扩容新容器。��去年用这个方案成功支撑了公司2000人同时观看的年会直播。