恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Nginx-RTMP流媒体服务器搭建与OBS推流使用入门总结
首页
资讯中心
/
Nginx-RTMP流媒体服务器搭建与OBS推流使用入门总结
Nginx-RTMP流媒体服务器搭建与OBS推流使用入门总结
发布时间:2026/8/8 11:36:15
Nginx-RTMP 流媒体服务器搭建与 OBS 推流使用入门总结本文面向刚入行的小白记录一次从零开始在阿里云服务器上搭建 RTMP/HLS 流媒体服务并使用 OBS 推流、VLC 拉流播放的完整过程。示例服务器 IP 使用106.15.65.124。实际使用时请替换成你自己的服务器公网 IP。1. 最终实现效果搭建完成后可以实现下面这条直播链路你的电脑屏幕 / 摄像头 / 麦克风 ↓ OBS 采集画面和声音并编码 ↓ RTMP 推流1935 端口 rtmp://106.15.65.124:1935/live/test ↓ 阿里云服务器 nginx-rtmp 接收直播流 ↓ 服务器自动生成 HLS 文件test.m3u8、test-0.ts、test-1.ts ... ↓ HTTP 播放8080 端口 http://106.15.65.124:8080/hls/test.m3u8 ↓ VLC / 网页播放器播放直播最终常用地址有两个RTMP 推流/拉流地址rtmp://106.15.65.124:1935/live/test HLS 播放地址http://106.15.65.124:8080/hls/test.m3u82. 各个软件和设备分别负责什么2.1 服务器负责什么服务器是整个直播链路中的“中转站”或“流媒体服务器”。本次服务器上安装的是nginx-rtmp它主要负责三件事监听1935端口接收 OBS 推过来的 RTMP 直播流。把 RTMP 直播流切成 HLS 文件例如.m3u8和.ts。通过8080端口向外提供 HLS 播放地址。服务器上生成的 HLS 文件示例/usr/local/nginx-rtmp/html/hls/test.m3u8 /usr/local/nginx-rtmp/html/hls/test-0.ts /usr/local/nginx-rtmp/html/hls/test-1.ts /usr/local/nginx-rtmp/html/hls/test-2.ts其中test.m3u8播放列表告诉播放器应该播放哪些 ts 分片 test-0.ts、test-1.ts真正的视频片段文件2.2 OBS 负责什么OBS 安装在自己的电脑上不是安装在服务器上。OBS 的作用是“推流端”负责采集电脑屏幕 采集摄像头 采集麦克风 把画面和声音编码成视频流 把视频流推送到服务器OBS 中填写的推流参数是服务自定义 服务器rtmp://106.15.65.124:1935/live 串流密钥test上面两部分合起来实际完整推流地址就是rtmp://106.15.65.124:1935/live/test2.3 VLC 负责什么VLC 是播放端也可以理解为“观众端”。VLC 不负责推流也不负责转发它只负责播放服务器上的直播流。VLC 可以打开 RTMP 地址rtmp://106.15.65.124:1935/live/test也可以打开 HLS 地址http://106.15.65.124:8080/hls/test.m3u8一般测试时推荐先用 VLC因为普通浏览器不一定能直接播放.m3u8文件。2.4 浏览器负责什么浏览器可以访问服务器的 HTTP 服务例如http://106.15.65.124:8080/如果配置正确会显示nginx-rtmp is running但是普通 Chrome、Edge 浏览器直接打开.m3u8时可能会下载文件或者显示文本不一定能直接播放直播。想在浏览器里播放 HLS通常需要使用 HLS.js 或 Video.js 这类网页播放器。3. RTMP 和 HLS 的区别本项目中同时使用了两种协议RTMP主要用于 OBS 推流也可以被 VLC 低延迟播放 HLS主要用于网页、手机、VLC 播放3.1 RTMPRTMP 地址示例rtmp://106.15.65.124:1935/live/test特点延迟较低 适合推流 端口通常是 1935 浏览器原生通常不支持直接播放 RTMP3.2 HLSHLS 地址示例http://106.15.65.124:8080/hls/test.m3u8特点兼容性好 适合网页播放和移动端播放 本质是 HTTP 文件访问 延迟比 RTMP 高当前配置中hls_fragment 3s; hls_playlist_length 15s;含义是每 3 秒切一个视频片段 播放列表保留约 15 秒内容因此 HLS 播放通常不是严格实时而是准实时直播可能会有几秒到十几秒延迟。4. 为什么同一个 RTMP 地址OBS 是推流VLC 是拉流同一个地址rtmp://106.15.65.124:1935/live/test既可以被 OBS 使用也可以被 VLC 使用。区别不在地址而在软件执行的 RTMP 操作不同OBS执行 publish 操作也就是发布流、推流 VLC执行 play 操作也就是播放流、拉流可以把这个 RTMP 地址理解成一个“直播间地址”OBS 是主播往直播间里发送画面 VLC 是观众从直播间里观看画面在 nginx-rtmp 配置中application live { live on; allow publish all; allow play all; }表示live这个应用既允许推流也允许播放。5. 端口说明本项目用到的端口如下端口协议作用1935TCPRTMP 推流/拉流端口8080TCPHLS 播放端口80TCP普通 HTTP 网站端口可选443TCPHTTPS 网站端口可选22TCPSSH 远程登录端口检查端口是否监听ss-lntp|grep-E1935|8080正常输出示例LISTEN 0 511 0.0.0.0:1935 0.0.0.0:* users:((nginx,pidxxx,fd6)) LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:((nginx,pidxxx,fd7))含义0.0.0.0:1935 表示 RTMP 服务已经监听所有网卡的 1935 端口 0.0.0.0:8080 表示 HLS HTTP 服务已经监听所有网卡的 8080 端口6. 搭建前的端口放行检查在阿里云轻量服务器、ECS 安全组、防火墙模板、宝塔面板安全设置中需要确认放行1935/tcp 8080/tcp如果安全组里已经存在来源0.0.0.0/0 协议TCPUDP 端口1/65535 策略允许说明所有端口理论上已经放行。虽然测试方便但生产环境不建议长期全部开放。6.1 测试 8080 端口是否外网能访问如果服务器暂时没有程序监听 8080可以临时启动一个测试服务cd/tmp python3-mhttp.server8080--bind0.0.0.0然后在自己电脑浏览器访问http://106.15.65.124:8080如果能看到文件列表说明8080外网能访问。停止测试服务Ctrl C注意如果没有程序监听端口即使防火墙放行了外网测试也可能失败。所以要判断端口是否真的可用必须同时满足服务器内部有程序监听该端口 云防火墙/安全组允许访问该端口7. 为什么不直接使用宝塔自带 Nginx宝塔面板通常自带 Nginx但普通 Nginx 默认不支持 RTMP。检查宝塔 Nginx 是否存在ls/www/server/nginx/sbin/nginx检查宝塔 Nginx 是否带 RTMP 模块/www/server/nginx/sbin/nginx-V21|greprtmp如果没有输出说明宝塔 Nginx 没有 RTMP 模块。如果直接在普通 Nginx 配置里写rtmp { server { listen 1935; } }可能会报错unknown directive rtmp所以本教程采用更安全的方案单独编译安装一个 nginx-rtmp 到 /usr/local/nginx-rtmp 不影响宝塔自带 Nginx 不影响现有网站 出错后方便删除和重装8. 安装编译依赖服务器系统为 Alibaba Cloud Linux 8因此使用dnf。dnfinstall-ygcc gcc-cmakegitwgetpcre-devel zlib-devel openssl-devel看到下面结果说明成功Complete!9. 下载 Nginx 源码和 nginx-rtmp-module进入源码目录mkdir-p/usr/local/srccd/usr/local/srcpwd正常应显示/usr/local/src下载 Nginx 源码wgethttp://nginx.org/download/nginx-1.28.0.tar.gz解压tar-zxfnginx-1.28.0.tar.gz下载 RTMP 模块gitclone https://github.com/arut/nginx-rtmp-module.git检查目录是否存在ls-dnginx-1.28.0 nginx-rtmp-module正常输出nginx-1.28.0 nginx-rtmp-module10. 配置编译参数进入 Nginx 源码目录cd/usr/local/src/nginx-1.28.0pwd正常显示/usr/local/src/nginx-1.28.0执行配置命令./configure\--prefix/usr/local/nginx-rtmp\--with-http_ssl_module\--with-http_stub_status_module\--add-module../nginx-rtmp-module参数含义--prefix/usr/local/nginx-rtmp 安装到 /usr/local/nginx-rtmp不影响宝塔 Nginx --with-http_ssl_module 启用 SSL 模块 --with-http_stub_status_module 启用状态查看模块 --add-module../nginx-rtmp-module 把 RTMP 模块编译进去配置成功时应看到adding module in ../nginx-rtmp-module ngx_rtmp_module was configured Configuration summary nginx path prefix: /usr/local/nginx-rtmp11. 编译并安装 nginx-rtmp编译make-j$(nproc)如果最后没有error并且回到命令行说明编译成功。安装makeinstall检查安装目录ls/usr/local/nginx-rtmp正常输出conf html logs sbin检查 RTMP 模块是否编译进去/usr/local/nginx-rtmp/sbin/nginx-V21|greprtmp正常可以看到--add-module../nginx-rtmp-module12. 配置 nginx-rtmp先确认端口未被占用ss-lntp|grep-E1935|8080如果没有输出说明端口空闲。创建 HLS 目录mkdir-p/usr/local/nginx-rtmp/html/hlschmod-R755/usr/local/nginx-rtmp/html/hls备份原配置cp/usr/local/nginx-rtmp/conf/nginx.conf /usr/local/nginx-rtmp/conf/nginx.conf.bak写入新配置cat/usr/local/nginx-rtmp/conf/nginx.confEOF worker_processes auto; error_log logs/error.log; pid logs/nginx.pid; events { worker_connections 1024; } rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; hls on; hls_path /usr/local/nginx-rtmp/html/hls; hls_fragment 3s; hls_playlist_length 15s; allow publish all; allow play all; } } } http { include mime.types; default_type text/plain; sendfile on; server { listen 8080; server_name _; location / { default_type text/plain; return 200 nginx-rtmp is running\n; } location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /usr/local/nginx-rtmp/html; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin * always; } } } EOF检查配置/usr/local/nginx-rtmp/sbin/nginx-t正常输出nginx: the configuration file /usr/local/nginx-rtmp/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx-rtmp/conf/nginx.conf test is successful13. 启动 nginx-rtmp启动/usr/local/nginx-rtmp/sbin/nginx正常情况下没有输出。检查端口监听ss-lntp|grep-E1935|8080正常输出类似LISTEN 0 511 0.0.0.0:1935 0.0.0.0:* users:((nginx,pidxxx,fd6)) LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:((nginx,pidxxx,fd7))浏览器测试http://106.15.65.124:8080/能看到nginx-rtmp is running说明 HTTP/HLS 服务正常。14. 常用 nginx-rtmp 管理命令检查配置/usr/local/nginx-rtmp/sbin/nginx-t启动/usr/local/nginx-rtmp/sbin/nginx重新加载配置/usr/local/nginx-rtmp/sbin/nginx-sreload停止/usr/local/nginx-rtmp/sbin/nginx-squit强制停止/usr/local/nginx-rtmp/sbin/nginx-sstop查看端口ss-lntp|grep-E1935|8080查看 HLS 文件ls-lh/usr/local/nginx-rtmp/html/hls清空某一路旧直播切片rm-f/usr/local/nginx-rtmp/html/hls/test*15. 可选配置开机自启如果希望服务器重启后 nginx-rtmp 自动启动可以创建 systemd 服务。注意如果 nginx-rtmp 已经手动运行先停止它/usr/local/nginx-rtmp/sbin/nginx-squit创建服务文件cat/etc/systemd/system/nginx-rtmp.serviceEOF [Unit] DescriptionNginx RTMP Streaming Server Afternetwork.target [Service] Typeforking PIDFile/usr/local/nginx-rtmp/logs/nginx.pid ExecStart/usr/local/nginx-rtmp/sbin/nginx -c /usr/local/nginx-rtmp/conf/nginx.conf ExecReload/usr/local/nginx-rtmp/sbin/nginx -s reload ExecStop/usr/local/nginx-rtmp/sbin/nginx -s quit PrivateTmptrue [Install] WantedBymulti-user.target EOF重新加载 systemdsystemctl daemon-reload设置开机自启systemctlenablenginx-rtmp启动服务systemctl start nginx-rtmp查看状态systemctl status nginx-rtmp如果看到active (running)说明服务正常运行。后续重载配置可以用systemctl reload nginx-rtmp停止服务systemctl stop nginx-rtmp16. OBS 下载和安装OBS 要安装在自己的电脑上不是服务器上。下载方式打开 OBS 官网obsproject.com 选择 Windows 下载 Download Installer 安装后打开 OBS不要去不明下载站下载避免安装到带广告或篡改的软件。17. OBS 基本使用方法17.1 第一次打开 OBS第一次打开 OBS 可能会出现自动配置向导。可以选择优先优化直播其次为录制视频设置建议基础画布分辨率1920x1080 输出缩放分辨率1280x720 FPS30如果电脑配置较好也可以输出 1920x1080。17.2 添加画面源在 OBS 主界面底部找到来源点击选择显示器采集如果电脑有多个屏幕需要在属性中选择正确的显示器例如显示器 1 显示器 2OBS 中间预览区必须能看到画面推流出去才会有画面。如果预览画面大小不合适右键预览画面 → 变换 → 适合屏幕快捷键Ctrl F17.3 添加声音OBS 底部有混音器常见项目桌面音频 麦克风/Aux如果音量条在动说明声音采集正常。如果不想让别人听到麦克风可以点击麦克风旁边的小喇叭静音。17.4 设置推流地址进入设置 → 直播填写服务自定义 服务器rtmp://106.15.65.124:1935/live 串流密钥test注意服务器地址不要写 test test 只写在串流密钥里正确写法服务器rtmp://106.15.65.124:1935/live 串流密钥test错误写法服务器rtmp://106.15.65.124:1935/live/test 串流密钥test最终完整推流地址等价于rtmp://106.15.65.124:1935/live/test17.5 推荐 OBS 输出参数进入设置 → 输出如果是简单模式建议视频码率2500 Kbps 视频编码器x264 或 H.264 音频码率128 Kbps如果有硬件编码器优先选择NVIDIA NVENC H.264 AMD HW H.264 Intel QuickSync H.264不建议初学阶段使用AV1 HEVC H.265原因是兼容性可能较差部分播放器可能出现有声音没画面。17.6 开始推流回到 OBS 主界面点击右下角开始直播或开始推流如果右下角状态变绿、LIVE 时间开始走、码率有数值说明正在推流。18. 服务器检查是否收到 OBS 推流OBS 开始推流后服务器执行ls-lh/usr/local/nginx-rtmp/html/hls成功时会看到类似total 37M -rw-r--r-- 1 nobody nobody 5.2M Jun 30 21:06 test-0.ts -rw-r--r-- 1 nobody nobody 2.4M Jun 30 21:06 test-1.ts -rw-r--r-- 1 nobody nobody 5.2M Jun 30 21:06 test-2.ts -rw-r--r-- 1 nobody nobody 219 Jun 30 21:07 test.m3u8只要有test.m3u8 test-0.ts test-1.ts说明OBS 推流成功 nginx-rtmp 接收成功 HLS 切片成功19. VLC 播放测试VLC 安装在自己的电脑或观众电脑上。打开 VLC 后媒体 → 打开网络串流输入 HLS 地址http://106.15.65.124:8080/hls/test.m3u8点击播放。也可以输入 RTMP 地址rtmp://106.15.65.124:1935/live/test一般来说RTMP 延迟更低 HLS 更适合网页和移动端播放但延迟更高20. 常见问题排查20.1 访问 8080 下载文件而不是显示文字原因可能是 Nginx 配置中的默认类型是default_type application/octet-stream;浏览器会把返回内容当作二进制文件下载。解决方式是改成default_type text/plain;并在根路径配置中写location / { default_type text/plain; return 200 nginx-rtmp is running\n; }修改后执行/usr/local/nginx-rtmp/sbin/nginx-t/usr/local/nginx-rtmp/sbin/nginx-sreload20.2 有声音但没有画面常见原因OBS 没有选择正确的显示器 OBS 预览区本身没有画面 编码格式不兼容优先检查 OBS 主界面中间预览区有没有画面。如果有外接屏幕要在显示器采集属性中选择正确屏幕来源 → 显示器采集 → 属性 → 显示器 1 / 显示器 2只要 OBS 预览区有正确画面推流出去才会有画面。20.3 OBS 提示连接失败排查步骤检查 OBS 推流地址是否写对。服务器rtmp://106.15.65.124:1935/live 串流密钥test检查服务器是否监听 1935。ss-lntp|grep1935检查 nginx-rtmp 是否启动。ss-lntp|grep-E1935|8080检查阿里云安全组和宝塔面板是否放行 1935。20.4 打开 m3u8 后浏览器下载文件这是正常现象。普通浏览器不一定能直接播放.m3u8。推荐用 VLC 测试http://106.15.65.124:8080/hls/test.m3u8如果后续想网页播放需要做一个 HTML 页面并使用 HLS.js 或 Video.js。20.5 HLS 延迟比较高当前配置hls_fragment 3s; hls_playlist_length 15s;通常会产生几秒到十几秒延迟。如果想降低延迟可以尝试hls_fragment 1s; hls_playlist_length 3s;但切片越短服务器和播放器压力越大卡顿概率可能增加。初学测试阶段建议先保持稳定。20.6 重新推流后播放旧内容可以先停止 OBS 推流然后服务器清空旧 HLS 文件rm-f/usr/local/nginx-rtmp/html/hls/test*再重新开始推流。21. 安全建议当前配置中allow publish all; allow play all;表示任何人只要知道地址都可以推流和播放。这适合测试但生产环境不安全。可以限制只有自己的公网 IP 能推流application live { live on; record off; allow publish 你的电脑公网IP; deny publish all; allow play all; hls on; hls_path /usr/local/nginx-rtmp/html/hls; hls_fragment 3s; hls_playlist_length 15s; }修改后重载/usr/local/nginx-rtmp/sbin/nginx-t/usr/local/nginx-rtmp/sbin/nginx-sreload此外不建议长期开放所有端口。建议只放行必要端口例如22SSH 80HTTP 443HTTPS 1935RTMP 8080HLS 宝塔面板端口按实际情况放行22. 最简使用流程日常使用时只需要记住下面流程1. 确认服务器 nginx-rtmp 正在运行 2. 打开 OBS 3. 确认 OBS 预览区有画面 4. 确认 OBS 混音器有声音 5. 点击 OBS 的“开始直播/开始推流” 6. 用 VLC 打开 http://106.15.65.124:8080/hls/test.m3u8 7. 能看到画面和听到声音说明直播正常服务器检查命令ss-lntp|grep-E1935|8080OBS 推流配置服务器rtmp://106.15.65.124:1935/live 串流密钥test播放地址HLShttp://106.15.65.124:8080/hls/test.m3u8 RTMPrtmp://106.15.65.124:1935/live/test23. 一句话总结OBS 负责“发直播” 服务器上的 nginx-rtmp 负责“接收、转换、分发直播” VLC 或网页播放器负责“观看直播”。完整关系OBS publish → nginx-rtmp → HLS/RTMP → VLC play