想搭个直播?用 nginx-rtmp-module 推流拉流
点播(把文件放服务器上让人看)和直播(实时推流)是两码事。如果你有自己的内容想实时播——比如讲课、活动、游戏——最省钱的方案之一就是 nginx + rtmp-module:一台普通服务器就能当推流端和分发端。这篇文章走一遍最小可用配置。
为什么是 nginx-rtmp
- 免费、轻量,几 MB 内存就能跑;
- 支持 RTMP 推流,也能转成 HLS 让浏览器直接看;
- 配置直观,社区资料多。
安装
很多发行版自带带 rtmp 模块的 nginx(比如某些第三方仓库)。想自己编也行:
# Ubuntu 示例:装带 rtmp 模块的版本
sudo apt install libnginx-mod-rtmp
确认 nginx -V 输出里包含 --add-module=.../nginx-rtmp-module。
配置 nginx.conf
在 http 块外面(rtmp 是独立协议)加一段:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
# 转 HLS,方便浏览器播放
hls on;
hls_path /tmp/hls;
hls_fragment 3s;
}
}
}
然后在 http 块里加一个 location 把 HLS 暴露出来:
location /hls {
types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; }
root /tmp;
add_header Cache-Control no-cache;
}
推流
用 OBS:设置 → 推流 → 服务选"自定义",服务器填 rtmp://你的IP/live,串流密钥随便起个名比如 room1。点开始推流,nginx 就开始收流并生成 /hls/room1.m3u8。
也可以用 ffmpeg 直接推一个本地文件测通:
ffmpeg -re -i test.mp4 -c copy -f flv rtmp://你的IP/live/room1
拉流观看
- 播放器(VLC)直接开
rtmp://你的IP/live/room1; - 浏览器用 hls.js 或原生 HLS 播
http://你的IP/hls/room1.m3u8。
加点鉴权
裸奔的推流地址谁都能推,生产环境加个 on_publish 校验:
application live {
live on;
on_publish http://你的后端/check; # 后端返回 200 才允许推
}
常见问题
Q:延迟太高? RTMP 本身几百毫秒,HLS 切片会到几秒。要低延迟用 LL-HLS 或换 WebRTC(之前写过)。
Q:多人同时看卡? nginx-rtmp 是单点,量大得上 CDN 或多机。
Q:能录播吗? 把 record off; 改成 record on; 并指定 record_path,推流同时落盘。