当前位置:首页 > 云服务器 > 正文

如何搭建http流媒体服务器?搭建流媒体服务器需要哪些配置

搭建 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。

如何搭建http流媒体服务器?搭建流媒体服务器需要哪些配置 第1张

配置 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:

如何搭建http流媒体服务器?搭建流媒体服务器需要哪些配置 第2张

防火墙配置:

确保服务器防火墙允许 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):

  1. 打开 OBS,在“设置” -> “推流”中,服务选择“自定义”。
  2. URL 填写:rtmp://你的服务器IP/live
  3. 流密钥 填写:test_stream
  4. 点击“开始推流”。

播放端(使用 VLC 或 Web 播放器):

  • HTTP HLS 播放(推荐,兼容性好):

    在浏览器或 VLC 中打开地址:

    http://你的服务器IP/hls/test_stream.m3u8

    如何搭建http流媒体服务器?搭建流媒体服务器需要哪些配置 第3张

  • 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)和缓冲机制,降低延迟的方法包括:

  1. 减小切片时长: 在 Nginx 配置中,将 hls_fragment 从默认的 3-5 秒降低到 1-2 秒,但这会增加服务器 I/O 压力和客户端解码负担。
  2. 使用低延迟 HLS (LL-HLS): 标准 HLS 有 10-30 秒延迟,LL-HLS 通过分片传输和预取机制,可将延迟控制在 3-5 秒,这需要客户端支持 LL-HLS 协议(如新版 Safari、Chrome 或特定播放器 SDK)。
  3. 切换协议: 如果业务场景允许,考虑使用 WebRTC 协议(延迟可低至 500ms 以内),但这需要搭建支持 WebRTC 的服务器(如 SRS 或 ZLMediaKit),而非单纯的 Nginx RTMP 模块。
  4. 优化网络: 确保服务器带宽充足,并使用 CDN 分发静态切片文件,减少用户端到服务器的传输延迟。

问题 2:为什么通过 HTTP 访问 m3u8 文件时,浏览器控制台报错 CORS 跨域问题?

解答:

CORS(跨域资源共享)错误通常发生在 Web 播放器(如 Video.js, HLS.js)尝试从不同域名的服务器加载 m3u8 或 ts 文件时,解决方法如下:

  1. 配置 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';
  2. 处理 OPTIONS 请求: 浏览器在发送实际请求前可能会发送 OPTIONS 预检请求,确保 Nginx 能正确处理并返回 200 状态码。
  3. 同源策略: 最简单的办法是将 Web 前端页面部署在与流媒体服务器相同的域名和端口下,或者将前端静态文件也托管在 Nginx 的同一 Server 块中,确保协议、域名和端口完全一致。

0