如何搭建http流媒体服务器?搭建流媒体服务器需要哪些配置
- 云服务器
- 2026-07-10
- 5
搭建 HTTP 流媒体服务器通常涉及两个核心层面:一是提供静态文件(如 MP4、MP3)的 Web 服务器,二是支持动态切片(如 HLS、DASH)的动态流媒体服务器,对于大多数应用场景,尤其是需要低延迟或实时直播的场景,基于 Nginx 配合 nginx-rtmp-module 或专门的流媒体引擎(如 SRS、ZLMediaKit)是业界主流方案,以下将以最通用且高效的 Nginx + RTMP 模块 方案为例,详细阐述搭建过程,并补充说明如何将其转换为 HTTP 流媒体(HLS/DASH)。
环境准备与依赖安装
在开始之前,请确保你拥有一台运行 Linux 系统(推荐 Ubuntu 20.04/22.04 或 CentOS 7/8)的服务器,并具备 root 权限,HTTP 流媒体通常依赖于底层的 RTMP 推流协议,然后通过 Nginx 将其转换为 HTTP 协议供客户端播放。
更新系统包并安装编译所需的工具:
# Ubuntu/Debian 示例 sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev wget git # CentOS/RHEL 示例 sudo yum groupinstall "Development Tools" sudo yum install -y pcre-devel zlib-devel openssl-devel wget git
获取并编译 Nginx 与 RTMP 模块
为了支持流媒体功能,我们需要从源码编译 Nginx,并集成 nginx-rtmp-module。
步骤 2.1:下载源码
cd /usr/local/src # 下载 Nginx 稳定版 wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz # 下载 RTMP 模块 git clone https://github.com/arut/nginx-rtmp-module.git
步骤 2.2:配置与编译
进入 Nginx 目录,配置编译选项,将 RTMP 模块包含在内:
cd nginx-1.24.0 ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --with-http_ssl_module --with-pcre --add-module=/usr/local/src/nginx-rtmp-module make sudo make install
注意:如果编译成功,Nginx 将被安装在 /usr/sbin/nginx,配置文件位于 /etc/nginx/nginx.conf。

配置 Nginx 流媒体服务
编辑 Nginx 配置文件,添加 RTMP 和 HTTP 流媒体相关的配置。
sudo nano /etc/nginx/nginx.conf
在 http 块之外,添加 rtmp 块;在 http 块内部,添加用于 HLS 生成的 location,以下是关键配置片段:
# 全局配置 worker_processes 1; events { worker_connections 1024; } # RTMP 服务配置 rtmp { server { listen 1935; # RTMP 默认端口 # 直播应用配置 application live { live on; record off; # 关键:启用 HLS 输出,将 RTMP 流转换为 HTTP 可访问的 m3u8/ts 文件 hls on; hls_path /tmp/hls; hls_fragment 3s; hls_playlist_length 60s; } # 点播应用配置(可选) application vod { play /var/www/vod; } } } http { # ... 其他 http 配置 ... server { listen 80; # 提供 HLS 播放列表和切片文件的 HTTP 服务 location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } # 提供 RTMP 推流地址的访问控制(可选) location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } } }
配置说明表:
| 配置项 | 说明 |
|---|---|
| listen 1935 | 监听 RTMP 推流端口,客户端通过 rtmp://ip:1935/live/stream_key 推流 |
| hls on | 开启 HLS 功能,将 RTMP 流切片 |
| hls_path | HLS 切片文件(.ts)和播放列表(.m3u8)的存储目录 |
| hls_fragment | 每个切片文件的时长,通常设为 2-4 秒,平衡延迟与缓冲 |
| location /hls | 通过 HTTP 协议暴露 HLS 文件,供浏览器或播放器访问 |
启动服务与防火墙设置
启动 Nginx:

防火墙配置:
确保服务器防火墙允许 80(HTTP)和 1935(RTMP)端口:
# Ubuntu (UFW) sudo ufw allow 80/tcp sudo ufw allow 1935/tcp # CentOS (Firewalld) sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=1935/tcp sudo firewall-cmd --reload
推流与播放测试
推流端(使用 OBS Studio):
- 打开 OBS,在“设置” -> “推流”中,服务选择“自定义”。
- URL 填写:rtmp://你的服务器IP/live
- 流密钥 填写:test_stream
- 点击“开始推流”。
播放端(使用 VLC 或 Web 播放器):
-
HTTP HLS 播放(推荐,兼容性好):
在浏览器或 VLC 中打开地址:
http://你的服务器IP/hls/test_stream.m3u8

-
RTMP 原生播放:
在 VLC 中打开网络串流:
rtmp://你的服务器IP/live/test_stream
性能优化与安全建议
- 静态资源缓存: 如果流量较大,建议在 Nginx 的 location /hls 中增加 expires 指令,但需注意 HLS 播放列表(.m3u8)不应缓存,切片文件(.ts)可适当缓存。
- HTTPS 支持: 现代浏览器对 HTTP 流媒体支持良好,但为了安全,建议配置 SSL 证书,将 listen 80 改为 listen 443 ssl,并在 location 中提供 HTTPS 地址。
- 防盗链: 可以通过 Nginx 的 valid_referers 模块限制只有特定域名才能访问流媒体文件。
相关问题与解答
问题 1:搭建好的 HTTP 流媒体服务器延迟较高,如何降低延迟?
解答:
HTTP 流媒体(特别是 HLS)的延迟主要来源于切片时长(Fragment Duration)和缓冲机制,降低延迟的方法包括:
- 减小切片时长: 在 Nginx 配置中,将 hls_fragment 从默认的 3-5 秒降低到 1-2 秒,但这会增加服务器 I/O 压力和客户端解码负担。
- 使用低延迟 HLS (LL-HLS): 标准 HLS 有 10-30 秒延迟,LL-HLS 通过分片传输和预取机制,可将延迟控制在 3-5 秒,这需要客户端支持 LL-HLS 协议(如新版 Safari、Chrome 或特定播放器 SDK)。
- 切换协议: 如果业务场景允许,考虑使用 WebRTC 协议(延迟可低至 500ms 以内),但这需要搭建支持 WebRTC 的服务器(如 SRS 或 ZLMediaKit),而非单纯的 Nginx RTMP 模块。
- 优化网络: 确保服务器带宽充足,并使用 CDN 分发静态切片文件,减少用户端到服务器的传输延迟。
问题 2:为什么通过 HTTP 访问 m3u8 文件时,浏览器控制台报错 CORS 跨域问题?
解答:
CORS(跨域资源共享)错误通常发生在 Web 播放器(如 Video.js, HLS.js)尝试从不同域名的服务器加载 m3u8 或 ts 文件时,解决方法如下:
- 配置 Nginx 响应头: 在 Nginx 的 location /hls 块中添加以下指令,允许所有来源访问: add_header Access-Control-Allow-Origin ; add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
- 处理 OPTIONS 请求: 浏览器在发送实际请求前可能会发送 OPTIONS 预检请求,确保 Nginx 能正确处理并返回 200 状态码。
- 同源策略: 最简单的办法是将 Web 前端页面部署在与流媒体服务器相同的域名和端口下,或者将前端静态文件也托管在 Nginx 的同一 Server 块中,确保协议、域名和端口完全一致。