使用 Nginx 搭建 HLS 流媒体服务器:从推流到播放完整教程

如果你想搭建自己的直播平台,或者需要在内网部署一套私有视频分发系统,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:

  1. Nginx 作为源站,只接受推流和 CDN 回源
  2. CDN 配置回源地址为你的 Nginx 服务器
  3. 播放端使用 CDN 域名访问 M3U8,如 https://cdn.your-domain.com/hls/stream.m3u8
  4. 配置 CDN 缓存策略:.m3u8 不缓存(或缓存 1 秒),.ts 缓存 1 小时

✅ 部署检查清单:防火墙放行 1935(RTMP) 和 80/443(HTTP) 端口;/var/www/hls 目录权限设为 755;Nginx 配置测试通过 nginx -t;ts 切片文件正常生成;CDN 回源 CORS 头正确返回。

测试您搭建的 HLS 直播流

推流完成后,使用我们的在线播放器验证效果

前往 M3U8 在线播放器 →

相关文章: