问题:宝塔上一个网站,但负载和cpu经常100%。怎么解决呢?
在宝塔面板(BT Panel)上部署的网站若频繁出现负载和CPU占用率飙升至100%,通常由代码性能、资源配置、流量异常或外部攻击等因素导致。以下从问题定位到解决方案的系统化排查与优化步骤:
一、快速定位问题根源
1. 实时监控进程
- 通过SSH/宝塔终端执行命令:
top # 按CPU排序进程(按P键)
htop # 更直观的进程监控(需安装)
- 观察占用高的进程(如PHP-FPM、MySQL、Java等)。
2. 检查宝塔资源监控
- 登录宝塔面板 → “监控” → 查看历史CPU、内存、磁盘IO、网络流量趋势。
- “计划任务” → 检查是否有高负载的定时任务(如日志切割、备份)。
3. 分析网站日志
- 宝塔面板 → “网站” → 对应站点 → “日志” → 查看访问日志(access.log)和错误日志(error.log)。
- 关键排查点:
- 高频重复请求(如爬虫、CC攻击)。
- 大量5xx/4xx错误(如数据库连接失败、PHP脚本超时)。
- 慢请求(响应时间>1秒)。
二、针对性优化方案
1. PHP类程序优化
- 调整PHP-FPM配置:
- 宝塔面板 → “PHP” → 对应版本 → “性能调整”:
ini pm = dynamic # 进程管理方式 pm.max_children = 50 # 根据内存调整(每个进程约30MB内存) pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 request_terminate_timeout = 30 # 防止PHP脚本长时间挂起
- 启用 OPcache(宝塔PHP设置 → “安装扩展” → 安装OPcache)。
- 优化代码:
- 避免循环内执行SQL查询、减少文件实时读写。
- 使用缓存(如Redis/Memcached缓存数据库查询结果)。
2. MySQL数据库优化
- 开启慢查询日志:
- 宝塔面板 → “数据库” → “管理” → “慢查询日志” → 开启并分析。
- 使用
EXPLAIN
优化SQL语句,添加缺失索引。 - 调整InnoDB参数(宝塔MySQL配置 → “配置文件”):
innodb_buffer_pool_size = 1G # 设置为物理内存的60%-70%
innodb_log_file_size = 256M
query_cache_type = 0 # 高并发场景建议关闭查询缓存
3. Nginx配置优化
- 限制并发与频率:
- 宝塔面板 → “网站” → 对应站点 → “配置文件”:
# 限制单IP并发连接数 limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 20; # 限制请求速率 limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=10r/s; location / { limit_req zone=reqlimit burst=20 nodelay; }
- 启用静态缓存:
- 宝塔 → “网站” → “反向代理” 或 “缓存配置” → 启用Nginx缓存:
nginx location ~* \.(jpg|css|js)$ { expires 30d; access_log off; }
4. 防御异常流量
- 安装宝塔防火墙插件:
- 在宝塔应用商店安装 “Nginx防火墙” 或 “Apache防火墙”。
- 配置规则:
- 拦截恶意User-Agent(如Scanner、Bot)。
- 设置CC防御(默认5秒内10次请求触发拦截)。
- 屏蔽攻击IP:
- 通过防火墙日志(
/www/wwwlogs/btwaf.log
)提取攻击IP。 - 在宝塔防火墙 → “IP黑名单” 中添加。
三、服务器级优化
1. 升级硬件资源
- 垂直扩容:升级CPU核心数、内存(适用于突发流量)。
- 水平扩展:部署负载均衡(如Nginx反向代理多台后端服务器)。
2. 调整内核参数
- 编辑
/etc/sysctl.conf
(需SSH执行):
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_fin_timeout = 30
- 生效配置:
sysctl -p
3. 启用Swap分区
- 避免内存耗尽导致进程崩溃(1GB内存建议设置2GB Swap):
dd if=/dev/zero of=/swapfile bs=1M count=2048
mkswap /swapfile
swapon /swapfile
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
四、高级排查工具
1. 性能剖析工具
- PHP性能分析:安装Xdebug或Blackfire定位代码瓶颈。
- MySQL诊断:使用
pt-query-digest
分析慢查询日志。 - 系统级监控:安装
netdata
或Prometheus
+Grafana
可视化监控。
2. 应急降级策略
- 静态化降级:攻击期间返回静态页(宝塔面板 → “网站” → 关闭PHP/MySQL)。
- 临时限制访问:通过iptables限制非关键地区IP访问。
总结
通过以下优先级逐步解决问题:
- 定位进程 → 确认是PHP、MySQL还是外部攻击导致。
- 优化配置 → 调整PHP-FPM、MySQL、Nginx参数。
- 防御流量 → 启用防火墙,限制异常请求。
- 硬件升级 → 资源不足时扩容。
若问题仍存在,可使用 strace
追踪进程系统调用,或通过 perf top
分析CPU热点函数。宝塔环境推荐结合日志分析与防火墙插件快速止血,再逐步深入优化代码和架构。