上个月凌晨2点,客户电话炸过来:“老K,我们官网打不开了,宝塔后台显示带宽跑满100M,但流量才几个G!”我远程一看,好家伙,网卡曲线跟心电图似的,一抽一抽跳满,第一反应不是加带宽,而是先查是不是被CC攻击了。
第一个踩坑点:宝塔自带防火墙的“误伤”
我打开宝塔面板的“安全”页,点开防火墙日志,发现Nginx的access.log里,同一个IP每秒钟请求同一个图片300多次,但这IP是阿里云的CDN节点,当时我脑子一热,把CDN的IP段拉黑了,结果网站直接崩了——静态资源全挂在自家服务器上,排查到最后,是宝塔的“网站监控报表”插件在凌晨自动执行日志切割,和CDN回源请求撞在一起,触发了CC防御规则。报错截图我至今存着:红色的“403 Forbidden”刷了整整一屏,下面跟着一串nginx -t的警告。
第二个隐形黑洞:PHP-FPM的僵尸进程
带宽满了但CPU不高,这种“假死”最容易迷惑人,我当时用top看负载只有0.5,但网卡TX/RX都打满,最后用ss -s一看,TCP连接数飙到8000多,全是TIME_WAIT,这是典型的PHP-FPM没开进程复用,每个请求都重新握手,宝塔默认的pm.max_children是5,并发一上来就直接“堵车”,我改成动态模式,pm.start_servers = 10,pm.max_spare_servers = 30,再配合pm.status_path开启监控页面,才把连接数压回200以内。
第三个坑,也是最多人忽略的:Mysql的慢查询拖垮网卡
你以为带宽是流量撑大的?错,我遇到过最阴的:一个WordPress站,某个插件每天凌晨4点全表扫描用户表,一次查询30秒,但产生300MB的binlog日志,宝塔的“数据库备份”默认在凌晨3点跑,两个任务撞车,磁盘IO卡死,网络堆积,最后排查是SHOW PROCESSLIST;里看到Copying to tmp table,慢查询日志里同一个SELECT * FROM wp_options刷了2000次。解决方案很土:把插件换成缓存对象,关闭binlog(开发环境),备份时间错开到6点。
宝塔面板网站带宽跑满?别急着加钱,先揪出这3个隐形黑洞
报错截图描述必须提一嘴:那次我截了宝塔“监控”页面的网卡图,波形像锯齿,旁边是/var/log/bt_www里的报错:[error] recv() failed (104: Connection reset by peer) while reading response header,这个报错十有八九是后端进程崩了,不是带宽问题。
最终排查思路:
- 先看
iftop -i eth0定位谁在狂发包(公网IP还是内网)。 - 再到宝塔“安全”里看拦截记录,排除攻击。
- 然后
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n看连接状态分布。 - 最后查慢查询和日志切割计划。
预防建议(省你三小时折腾):
- 宝塔面板的“计划任务”里,把备份、日志切割、证书续期全错开半小时。
- PHP-FPM别用静态模式,动态模式调好
max_children上限,再加个php-fpm -t的定时巡检脚本。 - 每天凌晨跑一次
mysqlcheck -o --all-databases,别让碎片拖慢查询。 - 如果带宽真不够,先抓包确认是下行(下载)还是上行(回源),再决定加CDN还是升级带宽,别一上来就向老板申请加钱,那钱花得冤。
最后送你一句:宝塔是个好工具,但默认配置只是“能跑”,不是“扛得住”,出问题先冷静看连接数,比啥都强。



发表评论