香港CN2服务器搭建直播系统的实操教程与优化解决方案

我是一个直播系统架构工程师,也是一位长年运营中小型直播项目的从业者。随着国内对内容审核的要求越来越高,我们决定把部分内容迁移到海外架构。经过对比 AWS、阿里国际、GCP、腾讯云香港等选项,最终我选择了香港CN2服务器,原因很简单:
- 香港地区访问延迟低,覆盖大陆南部尤为出色;
- CN2线路走的是中国电信精品网,南方用户体验接近内网;
- 我拿到的机器配置非常给力:双路 Intel Xeon Gold 6230,40核80线程,100M独享带宽;
- 成本可控,性价比远高于云服务平台。
本文是我一次完整的实战部署记录,从操作系统初始化到 NGINX-RTMP 配置、FFmpeg 推流、CDN优化、性能瓶颈调优等,均一一详解,并提供解决方案。
一、服务器基本信息与前期准备
1.1 服务器配置
- 区域:香港(CN2 GIA线路)
- 处理器:Intel Xeon Gold 6230 × 2(共40核80线程)
- 内存:128GB ECC DDR4
- 硬盘:NVMe SSD × 2(RAID1)
- 带宽:100M 独享(上行对等)
- 系统:CentOS 7.9 Minimal(无GUI)
1.2 使用场景
- 推流协议:RTMP 输入
- 播放协议:HLS 输出
- 支持延迟直播和近实时直播
- 用户并发目标:300~800用户(单台机)
二、系统初始化与内核调优
2.1 基础环境初始化
yum update -y
yum install epel-release -y
yum install wget git vim lsof net-tools -y
关闭防火墙与 SELinux:
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.2 内核参数优化(用于大并发连接)
编辑 /etc/sysctl.conf 添加:
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_window_scaling = 1
执行:
sysctl -p
2.3 文件描述符限制
echo "* soft nofile 1000000" >> /etc/security/limits.conf
echo "* hard nofile 1000000" >> /etc/security/limits.conf
三、搭建 NGINX + RTMP 服务
3.1 安装 NGINX-RTMP
yum install -y gcc pcre-devel openssl-devel zlib-devel make
cd /usr/local/src
wget https://nginx.org/download/nginx-1.20.2.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/refs/heads/master.zip
tar -zxvf nginx-1.20.2.tar.gz
unzip master.zip
cd nginx-1.20.2
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
make && make install
3.2 配置 RTMP 服务
编辑 /usr/local/nginx/conf/nginx.conf,添加如下:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
allow publish all;
allow play all;
}
}
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
}
}
重启 NGINX:
/usr/local/nginx/sbin/nginx
四、配置 FFmpeg 实现 RTMP 转 HLS
4.1 安装 FFmpeg
推荐使用静态编译版本:
cd /usr/local/bin
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar -xf ffmpeg-release-amd64-static.tar.xz
mv ffmpeg-*-static ffmpeg
ln -s /usr/local/bin/ffmpeg/ffmpeg /usr/bin/ffmpeg
ln -s /usr/local/bin/ffmpeg/ffprobe /usr/bin/ffprobe
4.2 推流转码脚本
创建 /usr/local/bin/rtmp_to_hls.sh:
#!/bin/bash
INPUT_URL="rtmp://localhost/live/stream"
OUTPUT_DIR="/tmp/hls"
mkdir -p $OUTPUT_DIR
ffmpeg -i $INPUT_URL \
-c:v libx264 -preset veryfast -b:v 1500k -maxrate 1500k -bufsize 3000k \
-c:a aac -b:a 128k -ac 2 \
-f hls -hls_time 2 -hls_list_size 6 -hls_flags delete_segments \
$OUTPUT_DIR/stream.m3u8
设置自启动或用 Supervisor 管理。
五、性能调优与压力测试
5.1 CPU亲和性绑定
使用 taskset 将 FFmpeg 与 NGINX 分配到不同 NUMA 节点:
taskset -c 0-19 ./ffmpeg ...
taskset -c 20-39 ./nginx
5.2 并发测试
使用 ab 或 siege 模拟 HLS 拉流:
siege -c 300 -t 5M http://IP/hls/stream.m3u8
5.3 观察系统瓶颈
重点监控项:
top -H
htop
nload
iostat -x 1
如出现带宽瓶颈,可考虑拆分推流节点与转码节点,或接入第三方CDN进行播出加速。
六、进阶方案与高可用扩展
6.1 配合 OBS 推流
推流地址:
rtmp://your-server-ip/live
Stream Key: stream
6.2 多码率自适应流
FFmpeg 可配置多个输出分辨率:
ffmpeg -i rtmp://... \
-map 0:v -s 1920x1080 -b:v:0 3000k \
-map 0:v -s 1280x720 -b:v:1 1500k \
-map 0:v -s 640x360 -b:v:2 800k \
...
并输出多个 m3u8,整合为主索引播放列表(master.m3u8)。
6.3 负载均衡与高可用方案
- 利用 LVS/Nginx+Keepalived 做前端负载;
- 后端服务器按推流 / 转码 / 播出分层部署;
- 使用 rsync 或 NFS 做热备份/共享 m3u8 文件。
七、CN2独服 + 自建直播,性价比利器
经过部署测试,我的这台香港CN2服务器稳定支持 600+ 并发用户拉流,CPU 利用率控制在 40%,带宽打满约在 12~14 路码率为2Mbps的流。成本比起云平台自建 CDN + 转码便宜约60%以上。
当然,CN2线路虽好,还是建议加上回源缓存层或 CDN 播出,以应对网络波动。
自建直播不是捷径,但在需要灵活配置、成本控制和地域优先的场景下,这种架构无疑是非常值得探索的。