香港服务器如何搭建可支持10万并发用户的HLS直播系统?FFmpeg+Nginx配置细节分享

几个月前,我们团队接到一个突如其来的直播项目需求:客户希望在香港部署一套支持10万并发用户观看的直播系统,要求低延迟、高稳定性,并兼容移动端和网页播放。起初我们犹豫是否使用RTMP或WebRTC,但考虑到广泛的设备兼容性和CDN分发优化,最终我们决定采用**HLS(HTTP Live Streaming)**协议。
本文将完整分享我们从零搭建整个系统的过程,包括FFmpeg推流、Nginx配置、负载优化,以及在香港服务器上的部署实战经验。希望本文不仅能作为参考模板,也能为你在构建高并发直播架构时提供实用解决方案。
一、架构设计概览
首先,我们需要明确整个系统的架构目标:
- 支持 10万级别并发用户观看
- 使用 FFmpeg 作为推流编码工具
- 使用 Nginx + ngx_http_hls_module(或第三方模块) 提供HLS服务
- 支持 多节点部署+CDN缓存优化
- 香港节点部署,网络链路优化国际访问
架构图:
[FFmpeg推流端]
│
▼
[HLS切片服务器(Nginx)]
│
▼
[CDN节点 / 负载均衡反向代理]
│
▼
[终端用户播放设备]
二、服务器选型与网络优化
1. 香港服务器配置建议:
- CPU:8核以上(推荐Intel Xeon)
- 内存:16GB以上
- 带宽:专线带宽至少1Gbps(出网不限流)
- 磁盘:NVMe SSD,读写能力强
- 操作系统:Ubuntu 20.04 LTS
2. 网络优化建议:
- 优选电信中港直连线路(CN2-GIA)服务器,减少内地用户访问延迟
- 配合Cloudflare、Akamai或腾讯云海外CDN节点缓存HLS切片
- Nginx启用Gzip压缩与Keep-Alive
三、FFmpeg推流配置
我们使用FFmpeg将原始RTMP流转码为HLS切片:
安装FFmpeg:
sudo apt update
sudo apt install ffmpeg
FFmpeg推流命令示例:
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset veryfast -tune zerolatency -c:a aac -b:a 128k \
-f hls -hls_time 4 -hls_list_size 5 -hls_flags delete_segments+program_date_time \
-hls_segment_filename "/var/www/hls/stream_%03d.ts" /var/www/hls/stream.m3u8
参数解释:
- -hls_time 4:每个TS片段4秒
- -hls_list_size 5:M3U8列表最多保留5个TS
- -hls_flags delete_segments:删除旧切片,节省磁盘空间
- -program_date_time:加入时间戳,便于同步
四、Nginx配置HLS服务
1. 安装Nginx与模块:
我们建议编译Nginx并引入第三方模块 nginx-http-flv-module,用于增强HLS服务:
# 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev
# 下载源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
git clone https://github.com/winshining/nginx-http-flv-module.git
# 编译安装
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx \
--add-module=../nginx-http-flv-module \
--with-http_ssl_module
make && sudo make install
2. 配置 nginx.conf:
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
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 *;
add_header Access-Control-Expose-Headers Content-Length;
}
}
}
3. 权限设置:
sudo mkdir -p /var/www/hls
sudo chown -R www-data:www-data /var/www/hls
五、支持10万并发的性能优化
1. Nginx参数调优:
修改 /usr/local/nginx/conf/nginx.conf 中以下参数:
worker_processes auto;
worker_connections 65535;
use epoll;
events {
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
}
2. 内核参数调优 /etc/sysctl.conf:
fs.file-max = 1000000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_tw_reuse = 1
然后执行:
sudo sysctl -p
3. ulimit 调整:
ulimit -n 1048576
六、HLS CDN 缓存策略(可选)
为了缓解源站压力,我们采用CDN缓存HLS切片。注意以下几点:
- M3U8文件设置 no-cache(防止缓存播放列表)
TS片段设置长缓存头(如1小时):
location ~ \.ts$ {
add_header Cache-Control "public, max-age=3600";
}
CDN配置中设置“忽略参数缓存”,避免过多重复请求
七、播放器适配与测试
我们使用 hls.js 和 video.js 作为前端播放引擎,兼容性好:
<video id="video" controls autoplay width="640" height="360"></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
if(Hls.isSupported()) {
var hls = new Hls();
hls.loadSource('/hls/stream.m3u8');
hls.attachMedia(document.getElementById('video'));
}
</script>
八、压力测试与上线
我们使用 wrk 和 ab 工具进行压力测试,也模拟多端拉流行为,发现瓶颈主要在:
- CPU过载时TS生成速度下降
- M3U8请求频繁时产生I/O阻塞
最终解决方案是:多FFmpeg进程+多个Nginx服务节点 + CDN前置缓存 + 反向代理负载均衡。
本次在香港服务器上搭建的HLS直播系统,经过精心调优后,成功支撑了最高12.8万并发连接的峰值访问量,平均延迟控制在4~6秒之间。实践中我们也发现,FFmpeg+Nginx虽然简洁,但要想支撑高并发,必须靠网络架构优化、CDN缓存分流以及系统内核参数调优三方面联动。