CentOS 7+Nginx高带宽流媒体服务器FTP连接失败及带宽分配需求求助
CentOS 7+Nginx高带宽流媒体服务器FTP连接失败及带宽分配需求求助
嗨,我完全懂你现在的糟心处境——1Gbps端口被流媒体跑满后,连FTP都没法正常连接,根本传不了新文件,而且之前给Nginx设的连接/下载限速完全没起作用,又没法用CDN,确实头疼。别慌,咱们可以通过**Linux内核自带的流量控制工具(TC)**来给SSH和FTP强制预留固定带宽,这是最直接有效的解决方案,不需要额外花钱。
核心思路
Nginx的限速是针对单个连接的,当大量用户同时访问流媒体时,总带宽还是会吃满整个端口;而TC是在网卡层面做全局流量管控,能给特定服务(比如SSH、FTP)锁定专属带宽,哪怕其他服务跑满剩余带宽,这部分预留资源也不会被占用。
具体操作步骤
1. 先确认关键信息
- 你的服务器网卡名称:用
ip addr命令查看,通常是eth0、ens33这类,记下来后面要用 - FTP的端口配置:默认主动模式是20、21端口;如果是被动模式(大部分FTP客户端默认用这个),要查看你FTP服务器的配置(比如vsftpd的
pasv_min_port和pasv_max_port,假设是30000-30099)
2. 安装TC工具
CentOS里TC属于iproute包,直接安装:
sudo yum install iproute -y
3. 配置带宽管控规则
我把步骤拆成命令,你直接替换网卡名和端口范围就行:
# 替换成你的网卡名 INTERFACE="eth0" # 先清理旧的流量规则(如果有的话) sudo tc qdisc del dev $INTERFACE root 2>/dev/null # 初始化HTB(分层令牌桶)根队列,这是TC里最常用的带宽管控方案 sudo tc qdisc add dev $INTERFACE root handle 1: htb default 20 # 定义总带宽(1Gbps = 1000000kbit) sudo tc class add dev $INTERFACE parent 1: classid 1:1 htb rate 1000000kbit # 给SSH/FTP创建专属带宽类,预留5Mbps(5000kbit),rate是保证带宽,ceil是最大带宽,这里直接锁死5M sudo tc class add dev $INTERFACE parent 1:1 classid 1:10 htb rate 5000kbit ceil 5000kbit # 给其他服务(比如Nginx流媒体)分配剩余带宽(1000M-5M=995M),没用到的预留带宽也可以被它占用 sudo tc class add dev $INTERFACE parent 1:1 classid 1:20 htb rate 995000kbit ceil 1000000kbit # 用iptables给SSH/FTP的流量打标记,方便TC识别 sudo iptables -t mangle -F PREROUTING 2>/dev/null # SSH端口22 sudo iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1 sudo iptables -t mangle -A PREROUTING -p tcp --sport 22 -j MARK --set-mark 1 # FTP主动模式端口20-21 sudo iptables -t mangle -A PREROUTING -p tcp --dport 20:21 -j MARK --set-mark 1 sudo iptables -t mangle -A PREROUTING -p tcp --sport 20:21 -j MARK --set-mark 1 # FTP被动模式端口范围(根据你的实际配置修改) sudo iptables -t mangle -A PREROUTING -p tcp --dport 30000:30099 -j MARK --set-mark 1 sudo iptables -t mangle -A PREROUTING -p tcp --sport 30000:30099 -j MARK --set-mark 1 # 让TC把打了标记的流量导向预留带宽类 sudo tc filter add dev $INTERFACE parent 1:0 protocol ip prio 1 handle 1 fw flowid 1:10
4. 验证配置是否生效
- 查看队列规则:
sudo tc qdisc show dev $INTERFACE - 查看带宽类:
sudo tc class show dev $INTERFACE - 测试:先跑满流媒体带宽(比如用多客户端拉流),再尝试FTP上传/下载,这时应该能正常操作,不会再被带宽占满阻断。
5. 让配置重启后生效
上面的命令重启服务器就会失效,你可以把它做成脚本,再设置开机自启:
- 创建脚本文件
/usr/local/bin/bandwidth-reserve.sh,把上面的命令复制进去,修改好网卡名和端口范围 - 给脚本加执行权限:
sudo chmod +x /usr/local/bin/bandwidth-reserve.sh - 创建systemd服务文件
/etc/systemd/system/bandwidth-reserve.service:
[Unit] Description=Reserve Bandwidth for SSH and FTP After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/bandwidth-reserve.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
- 启用服务:
sudo systemctl daemon-reload && sudo systemctl enable --now bandwidth-reserve.service
注意事项
- 如果你的FTP服务器不是vsftpd,要对应调整被动模式的端口范围
- 测试时尽量模拟真实的满带宽场景,确保预留的5Mbps足够FTP使用
- 要是遇到规则不生效,先检查网卡名、端口号有没有写错,或者重启一下network服务
备注:内容来源于stack exchange,提问作者Adonai
相关产品推荐
相关产品推荐

