- 步骤1:远程登录并确认影响范围:ssh root@服务器IP;查看CPU/内存和网络使用:top、free -m、sar -n DEV 1 3。
- 步骤2:即时流量检测:sudo iftop -i eth0 或 sudo nload eth0,观察是否满速接近10.0Mbit/s。记录时间点与上下行方向。
- 步骤3:服务日志核查:查看 /var/log/nginx/access.log(或apache)、/var/log/messages、应用日志,按时间窗口筛选大量请求来源IP。
- 检查长连接与并发:ss -s、netstat -anp | grep :80 | wc -l,确认是否为大量短请求或少数大流量连接。
- 定位高流量IP:sudo ip -s neigh; sudo iptables -vnL --line-numbers 或使用 awk 分析 access.log:awk '{print $1}' access.log | sort | uniq -c | sort -nr | head。
- 使用 mtr 或 traceroute 到关键客户端,确认是否为运营商链路问题或本地出口拥塞。
- 使用 iptables 限制并发:安装并启用 connlimit 模块,示例:iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT。
- 使用 tc 做总带宽控制,示例将网口限制为10M并按流量分类:tc qdisc add dev eth0 root handle 1: htb default 12;tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit ceil 10mbit。
- 记录命令与时间,确保能回滚:iptables-save > /root/iptables.backup; tc qdisc show dev eth0 > /root/tc.backup。
- 用 tc + iptables mark 区分流量:iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 10(SSH优先),再用 tc filter 将 mark 映射到更高带宽的 class。
- 示例命令(简化):tc class add dev eth0 parent 1:1 classid 1:10 htb rate 6mbit;tc class add dev eth0 parent 1:1 classid 1:11 htb rate 3mbit;然后按 mark 分配。
- 临时拉黑高频IP:iptables -I INPUT 1 -s 1.2.3.4 -j DROP(谨慎,仅对确认恶意IP)。
- 启用 fail2ban 或自定义脚本定期扫描 access.log,自动将触发阈值的IP加入 iptables 黑名单并记录到 /root/ban-list.log。示例脚本可用 cron 每5分钟运行。
- 对Nginx启用 limit_conn 和 limit_req:在 server 或 location 中添加 limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10; limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s。然后 reload nginx。
- 对文件下载、视频等大流量资源启用断点续传限制或临时维护页,减少并发大流量请求。
- 若有备用机房或云节点,临时将静态内容迁移到 CDN 或备用服务器,修改 DNS(降低 TTL)或使用反向代理转发至备用节点。
- 使用 nginx proxy_pass 将部分路径代理到带宽较大的服务器:编辑 upstream 并 reload,注意会增加代理端带宽消耗。
- 建议启用 CDN、压缩(gzip/ brotli)、图片懒加载与资源合并,减少带宽占用。
- 考虑购买备用带宽、BGP 多线或启用链路备份与负载均衡策略。
- 保存当前配置与日志快照:cp /etc/nginx/nginx.conf /root/nginx.conf.bak;iptables-save >/root/iptables.bak;tcpdump -w /root/cap.pcap -s 0 -c 10000。
- 在工单中记录每一步操作、时间、命令与回滚命令,便于事后分析与保险合规。
- 回退 tc:tc qdisc del dev eth0 root(若已备份,先比对备份)。
- 回退 iptables:iptables-restore < /root/iptables.backup 或逐条删除:iptables -D INPUT 1(按行号)。
- 回退应用限速:恢复 nginx 配置:cp /root/nginx.conf.bak /etc/nginx/nginx.conf && nginx -t && systemctl reload nginx。确认服务恢复后继续监控30分钟。
- 使用 iftop、nload、sar 持续观察流量是否回落;用 uptime、systemctl status 检查服务健康。
- 在回退后观察用户体验与错误率:检查 5xx/4xx 请求比例,确保没有误封正常客户。
- 制定带宽拥塞应急手册并定期演练(包括回退流程、备份恢复、DNS切换),每次变更都写入变更单并留存快照。
- 自动化脚本模板:封堵脚本、tc 配置脚本与回滚脚本都放在 /root/ops-scripts,并设置可执行权限与版本控制。
问:如果短时间内无法降低流量,有没有临时替代办法?
答:有。可临时启用“维护页”或禁止大文件下载,使用 nginx return 503 或 redirect 大流量路径到静态低带宽页面;同时把静态资源切到 CDN/第三方存储,并尽快和带宽提供商沟通临时提速或流量清洗。
问:回退操作失败怎么办,如何安全恢复?
答:立即停止进一步变更,恢复最近的配置备份(iptables、tc、nginx),并重启核心服务:systemctl restart nginx;如果仍异常,切换到备用节点或回滚到DNS备份IP,最后联系机房/带宽商排查链路问题。
问:如何在10Mbps限制下做到最优用户体验?
答:优先保障关键业务(用 tc/iptables 标记并给更高带宽),启用压缩与缓存、减少非必要资源加载、使用 CDN 分担静态内容,并对大流量IP实施并发限制与速率限制,配合监控动态调整策略。