上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-07-28 19:47 阅读量:860


几个月前,我们团队接到一个突如其来的直播项目需求:客户希望在香港部署一套支持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缓存分流以及系统内核参数调优三方面联动。

目录结构
全文