如果你想搭建自己的直播平台,或者需要在内网部署一套私有视频分发系统,Nginx + nginx-rtmp-module 是最经济高效的方案之一。本文将手把手教你从零开始搭建一套支持 RTMP 推流、HLS 切片和在线播放的完整流媒体服务器。
环境准备与 Nginx 编译安装
由于 nginx-rtmp-module 不是 Nginx 官方内置模块,需要从源码编译安装。系统环境:Ubuntu 22.04 LTS。
安装依赖
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev
下载源码并编译
# 下载 Nginx 源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
# 下载 nginx-rtmp-module
git clone https://github.com/arut/nginx-rtmp-module.git
# 编译安装
cd nginx-1.24.0
./configure --add-module=../nginx-rtmp-module --with-http_ssl_module
make
sudo make install
Nginx 配置文件详解
编辑 /usr/local/nginx/conf/nginx.conf,在 http 块外添加 rtmp 块,在 http 块内添加 hls 定位:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
# 启用 HLS 切片
hls on;
hls_path /var/www/hls;
hls_fragment 3s;
hls_playlist_length 60s;
# 允许多个客户端播放
allow play all;
}
}
}
http {
server {
listen 80;
server_name your-domain.com;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /var/www;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
}
💡 关键参数说明:hls_fragment 3s 每个切片 3 秒,hls_playlist_length 60s 播放列表保留最近 60 秒内容。切片越短延迟越低,但会增加 HTTP 请求数量和 CDN 回源压力。
FFmpeg 推流与 OBS 推流
使用 FFmpeg 推流
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset fast -b:v 2000k \
-c:a aac -b:a 128k \
-f flv rtmp://your-server/live/stream
使用 OBS 推流
在 OBS 设置中配置:
- 服务器:
rtmp://your-server/live - 串流密钥:
stream
播放测试与参数调优
推流成功后,M3U8 播放地址为:http://your-domain/hls/stream.m3u8
你可以在我们的 M3U8 在线播放器 中直接测试。注意服务器需开启 CORS:add_header Access-Control-Allow-Origin *;
性能调优建议
- 使用
hls_fragment 2s降低延迟到 6-10 秒 - 配合
worker_processes auto;充分利用多核 CPU - 将
/var/www/hls挂载到 tmpfs 内存盘,大幅提升 I/O 性能 - 使用
exec_push同时推送多码率版本
对接 CDN 实现大规模分发
单台 Nginx 服务器可支撑数百到数千并发(取决于带宽和 CPU)。当规模扩大时,需要对接 CDN:
- Nginx 作为源站,只接受推流和 CDN 回源
- CDN 配置回源地址为你的 Nginx 服务器
- 播放端使用 CDN 域名访问 M3U8,如
https://cdn.your-domain.com/hls/stream.m3u8 - 配置 CDN 缓存策略:.m3u8 不缓存(或缓存 1 秒),.ts 缓存 1 小时
✅ 部署检查清单:防火墙放行 1935(RTMP) 和 80/443(HTTP) 端口;/var/www/hls 目录权限设为 755;Nginx 配置测试通过 nginx -t;ts 切片文件正常生成;CDN 回源 CORS 头正确返回。