手把手教你搭建 Nginx-RTMP 流媒体服务器(Ubuntu/Windows)
作者简介
👋Hi,我是 EZ 在线工具网的站长,专注于多媒体在线视频技术与浏览器端工具开发。
EZ 在线工具网 是一个以 在线视频处理 为核心的工具平台,提供包括 M3U8 在线播放、M3U8 转 MP4、RTMP / HLS 流测试、FFmpeg 在线转码 等功能,全部可直接在浏览器中使用,无需安装客户端。
引言
随着直播行业的爆发,B站、抖音、视频号已经成为我们生活的一部分。但你是否想过,这些光鲜亮丽的直播背后,技术原理是什么?如果我们想自己做一个私服,或者在内网搭建一个监控推流服务器,该怎么做?本文将从零开始,超详细地教你在 Ubuntu 和 Windows 两大主流平台上,手把手编译、配置、并跑通 Nginx-RTMP 流媒体服务器。让你不仅“知其然”,更“知其所以然”。
为什么选择 Nginx-RTMP?
在流媒体领域,协议繁多,列如:RTMP、 HLS,、FLV, WebRTC等,服务器也有 SRS, ZLMediaKit, Nginx-RTMP 等。为什么偏偏选 Nginx-RTMP?
我总结了概括以下优点:
- 高性能 : 众所周知,Nginx 的高并发能力天下闻名。
- 极度轻量:资源占用极低,一台 1H1G 的云服务器就能扛住几百路推流。
- 配置简单:一个 nginx.conf 走天下。
- 功能强大:支持 RTMP 推流,同时支持 HTTP-FLV 和 HLS 播放,完美兼容 PC 和移动端。
本文目标:搭建一台服务器,实现 OBS 推流 -> 服务器 -> VLC/浏览器 播放 的完整闭环。
前期准备
工欲善其事,必先利其器。请准备好以下环境:
- 一台服务器/电脑:云服务器(推荐 Ubuntu 20.04/22.04)或者本地 Windows 电脑。
- 推流工具: OBS Studio(开源免费,推流界的瑞士军刀)。
- 播放工具: VLC Media Player(万能播放器)。
- 代码编辑器: VS Code、Notepad++ 或 Vim。
Ubuntu 平台搭建
为了方便演示,这里使用的是Ubuntu,这里不用 apt install,因为官方源里的 Nginx 不带 RTMP 模块,所以需要从源码编译,听起来很吓人?其实就是复制粘贴几行命令的事。😎
安装编译依赖
打开终端,依次执行以下命令:
# 更新软件源
sudo apt-get update
# 安装编译工具和依赖库
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev unzip wget
下载 Nginx 和 RTMP 模块
我们需要两个压缩包:Nginx 源码包、Nginx-RTMP-Module 模块包。
# 创建一个工作目录
mkdir ~/nginx-build && cd ~/nginx-build
# 下载 Nginx (推荐 1.20.x 版本,稳定)
wget http://nginx.org/download/nginx-1.20.2.tar.gz
# 下载 RTMP 模块 (作者 arut 的原版)
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
解压与配置
# 解压
tar -zxvf nginx-1.20.2.tar.gz
unzip master.zip
# 进入 Nginx 目录
cd nginx-1.20.2
最关键的一步来了:配置编译参数。
我们要告诉 Nginx:除了自带的功能,把旁边那个 nginx-rtmp-module 也打包进去。
./configure \
--prefix=/usr/local/nginx \
--add-module=../nginx-rtmp-module-master \
--with-http_ssl_module \
--with-http_v2_module
参数解释:
--prefix:指定安装目录,方便管理。--add-module:指定 RTMP 模块源码路径,注意是上一级目录的 master 文件夹。--with-http_ssl_module:开启 SSL 支持,注意:HLS 必须用 HTTPS。
如果没有报错,最后会显示 "configured successfully"。
编译与安装
# 编译(make),-j4 表示用 4 个核心编译,速度快,可以根据机器配置设置核心数
make -j4
sudo make install
安装完成后,你的 Nginx 就在 /usr/local/nginx 目录下了。

Ubuntu 系统服务配置
创建 systemd 服务文件:
sudo vim /etc/systemd/system/nginx-rtmp.service
添加以下内容:
[Unit]
Description=nginx-rtmp server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl enable nginx-rtmp
sudo systemctl start nginx-rtmp
Windows 平台搭建
Windows 编译环境太麻烦,好在有大神做了编译好的二进制包。
下载解压
- 访问 GitHub 仓库:illuspas/nginx-rtmp-win32。
- 下载最新的
nginx-rtmp-win32-1.2.1.zip。 - 解压到非中文路径,例如
D:\nginx-rtmp。

看到 nginx.exe 了吗?这就是我们的主角。
核心配置:nginx.conf 详解
无论 Ubuntu 还是 Windows,灵魂都在 conf/nginx.conf 文件里。
用编辑器打开它,找到 http { ... } 部分,在它的外面同级位置,添加以下 rtmp 配置:
rtmp {
server {
listen 1935; # RTMP 默认端口
chunk_size 4096;
application live {
live on; # 开启直播模式
record off; # 关闭录制(节省硬盘)
allow publish 127.0.0.1; # 允许推流的客户端 IP,生产环境建议改成内网 IP 或密码验证
# 开启 HLS 切片
hls on;
hls_path /tmp/hls; # Ubuntu 路径
# hls_path D:/nginx-rtmp/temp/hls; # Windows 路径,注意反斜杠
hls_fragment 3s; # 每个切片 3 秒
hls_playlist_length 10s; # 播放列表长度 10 秒
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80; # HTTP 默认端口,用于播放 HLS
server_name localhost;
# HLS 播放配置
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp; # Ubuntu
# root D:/nginx-rtmp/temp; # Windows
add_header Cache-Control no-cache;
}
}
}
配置保存后:
- Ubuntu:
sudo /usr/local/nginx/sbin/nginx启动。 - Windows:双击
nginx.exe启动(会闪一个黑窗口)。
防火墙注意:务必开放 1935 (推流) 和 80 (播放) 端口!
- Ubuntu:
sudo ufw allow 1935 && sudo ufw allow 80- Windows: 防火墙高级设置 -> 入站规则 -> 新建规则 -> 端口 -> TCP 1935, 80。

实战推流:OBS 连接服务器
根据实际情况替换掉下方的服务器,我这里的IP是 192.168.1.3。
OBS 设置
-
来源:添加“显示器采集”或“视频捕获设备”。
-
设置 -> 直播:
- 服务:自定义
- 服务器:
rtmp://192.168.1.3/live - 推流码:
test这个可以自定义,相当于房间号
-
设置 -> 输出:
- 码率:2000 Kbps (2Mbps) 足够清晰。
- 输出模式->关键帧间隔:2 秒。

点击“开始推流”
如果 OBS 右下角显示“正在推流”,且码率不是 0,恭喜你!数据已经发出去了!
实战拉流:三种方式看直播
推上去了,怎么看?有三种主流协议。
| 协议 | URL 格式 | 延迟 | 优点 | 缺点 |
|---|---|---|---|---|
| RTMP | rtmp://ip/live/test |
1-3 秒 | 极低延迟 | 浏览器不支持,需播放器 |
| HTTP-FLV | http://ip/live/test.flv |
2-5 秒 | 低延迟,网页可播 | 需 flv.js 支持 |
| HLS | http://ip/hls/test.m3u8 |
10-30 秒 | 兼容性最好 | 延迟高 |
方式一:VLC 播放
- 打开 VLC -> 媒体 -> 打开网络串流。
- 输入:
rtmp://你的IP/live/test - 回车,画面出来了!

方式二:浏览器播放 HLS(Safari/Edge)
直接在地址栏输入:http://你的IP/hls/test.m3u8
Safari 和 Edge 原生支持 HLS,直接就能看。Chrome 需要插件。
方式三:网页播放 HTTP-FLV
这里推荐EZ在线工具网的FLV/RTMP在线播放器,免去开发的麻烦。非常适合RTMP直播流测试,支持RTMP和FLV格式,实时直播流信息、截图等功能。
如果想自己编写,可以参考B站开源的flv.js。
创建一个 index.html 文件,贴入以下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nginx-RTMP 直播</title>
<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
</head>
<body>
<h1>我的直播间</h1>
<video id="videoElement" controls width="800" height="450"></video>
<script>
if (flvjs.isSupported()) {
var videoElement = document.getElementById('videoElement');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://你的IP/live/test.flv' // 注意这里是 flv
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
</script>
</body>
</html>
注意:上面的
nginx.conf默认没开 flv,要开的话在rtmp -> application live里加一句allow publish 127.0.0.1;然后在http server里加:location /live { flv_live on; chunked_transfer_encoding on; add_header 'Access-Control-Allow-Origin' '*'; }

进阶:内网穿透,让外网访问
如果你是在自己电脑上搭的(Windows),朋友想看怎么办?你没有公网 IP。
有三种方案:
- 花生壳/Frp:简单,但免费版限速。
- Zerotier/Hamachi:组建虚拟局域网,朋友装个客户端,用内网 IP 访问。
- Ngrok:国外工具,稳定但要钱。
最傻瓜的方法(路由器端口映射):
如果你有光猫拨号的公网 IP:
- 登录路由器(192.168.1.1)。
- 找到“虚拟服务器”或“端口转发”。
- 添加两条:
- 外部端口 1935 -> 内部 IP(你电脑IP) -> 内部端口 1935
- 外部端口 80 -> 内部 IP(你电脑IP) -> 内部端口 80
- 推流地址填你的公网 IP 即可。
常见问题排查
| 现象 | 原因 | 解决方法 |
|---|---|---|
OBS 推流报错 connection refused |
防火墙挡了 / Nginx没开 | 检查防火墙,`ps -ef |
| OBS 推流成功,VLC 黑屏 | 编码格式不对 | OBS 视频编码改为 H.264,音频改为 AAC |
| 公网无法访问,内网可以 | 没做端口映射 / 没公网IP | 去路由器做映射,或用 Frp |
| HLS 播放 404 | Nginx 配置路径不对 | 检查 hls_path 和 location /hls 的 root 是否对应 |
查看日志是个好习惯!
- Ubuntu:
tail -f /usr/local/nginx/logs/error.log - Windows:
logs/error.log
总结与展望
恭喜你!你已经掌握了流媒体服务器最核心的搭建技术。
回顾一下我们做了什么:
- 搞定了Ubuntu / Windows Nginx-RTMP模块的环境搭建。
- 对配置文件
nginx.conf进行了RTMP推流的配置。 - 打通了 OBS -> Nginx -> VLC 的链路。
下一步可以玩什么?
- 录制回放:配置
record all;和exec_record_done脚本,实现直播自动录制并上传到点播系统。 - 多码率:配置
ffmpeg转码,让用户根据网速选择 720P/1080P。 - 鉴权:防止别人乱推流,配置
on_publish接口回调验证密钥。 - WebRTC:Nginx-RTMP 延迟还是有点高,想做连麦互动?去研究 ZLMediaKit 或 SRS,它们原生支持 WebRTC,延迟能到 500ms 以内。

浙公网安备 33010602011771号