电商网站服务器 CPU 打满排查:Nginx、PHP-FPM 与 MySQL 主机侧联调

电商网站服务器 CPU 打满排查封面

问题场景:CPU 突然打满,网站响应变慢

电商网站服务器 CPU 占用率过高怎么办?本指南帮助你快速定位 Nginx、PHP-FPM 和 MySQL 的性能瓶颈,并提供可落地的解决方案。如果你遇到 CPU 飙升到 90% 以上、网站响应变慢的问题,按照本文的排查流程可以高效解决。

第一步:快速确认 CPU 负载来源

当发现 CPU 占用率异常时,先确认负载的具体来源:

top -bn1 | head -20
ps aux --sort=-%cpu | head -20
uptime

通过 top 命令查看 %Cpu(s) 指标:
us(user):用户空间进程消耗的 CPU,通常是 PHP 等应用进程
sy(system):内核空间消耗的 CPU
wa(iowait):等待 I/O 的时间

关键判断:如果 us 过高(>70%),重点排查 PHP-FPM;如果 wa 过高(>40%),检查磁盘性能或数据库查询。

系统负载监控面板

第二步:Nginx 层排查与优化

Nginx 作为反向代理,通常 CPU 占用不高,但配置不当也可能成为瓶颈。

2.1 检查 Nginx 状态

ps aux | grep nginx
netstat -an | grep :80 | wc -l
tail -100 /var/log/nginx/error.log

2.2 优化 Nginx 配置

遭遇高并发攻击流量时,Nginx 优化和 WAF 防护需要配合进行,可参考 CC 攻击防护完整指南:WAF 规则、限速与源站应急配置 同步部署限速规则。

worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
    gzip on;
}

确保静态资源由 Nginx 直接处理:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 7d;
    access_log off;
}

第三步:PHP-FPM 深度排查与调优

对于 PHP 电商网站,PHP-FPM 通常是 CPU 占用的主要原因。

3.1 查看 PHP-FPM 状态

ps aux | grep php-fpm | wc -l
tail -100 /var/log/php-fpm/slow.log

慢日志显示哪个脚本执行慢、调用了哪些函数、数据库查询耗时。

3.2 优化 PHP-FPM 配置

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
request_terminate_timeout = 60s
request_slowlog_timeout = 5s

计算建议:8GB 内存服务器,单个进程约 80MB,pm.max_children 建议设置为 50-70。

3.3 代码层优化

  1. 减少数据库查询次数,使用缓存
  2. 避免在循环中查询数据库
  3. 开启 PHP OPcache 提升性能
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=10000

PHP-FPM 进程监控对比

第四步:MySQL 性能分析与优化

数据库查询往往是 CPU 打满的根本原因。

4.1 查看 MySQL 负载

mysql -e "SHOW PROCESSLIST;"
tail -100 /var/log/mysql/slow.log

4.2 开启慢查询日志

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

分析慢查询,添加索引优化:

ALTER TABLE orders ADD INDEX idx_customer_status (customer_id, status);

4.3 优化 MySQL 配置

[mysqld]
max_connections = 500
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 512M
tmp_table_size = 256M
max_heap_table_size = 256M

4.4 使用 EXPLAIN 分析

EXPLAIN SELECT * FROM orders WHERE customer_id = 12345;

重点关注:type 是否为 ALL(全表扫描)、key 是否使用索引、rows 扫描行数。

MySQL 查询优化流程

第五步:综合排查流程

  1. 监控告警:设置 CPU 阈值告警(80% 持续 5 分钟)
  2. 快速定位:使用 topps 确定占用 CPU 的进程
  3. 日志分析:查看 Nginx、PHP-FPM、MySQL 日志;若发现磁盘 IO 等待(wa)持续偏高,可参考 VPS 服务器磁盘 IO 抖动处理:存储基线测试与主机性能治理 做存储层排查
  4. 实施优化:调整配置或优化代码
  5. 验证效果:监控优化后的 CPU 使用率

推荐监控工具

  • htop:直观的进程监控
  • iotop:监控磁盘 I/O
  • nethogs:监控网络带宽(网络数据传输能力)
  • PMM:MySQL 性能监控

常见问题解决方案

问题 1:PHP-FPM 进程数过多

解决方案
1. 根据内存重新计算 pm.max_children
2. 检查慢请求
3. 使用 pm = ondemand 模式

问题 2:MySQL 查询导致高负载

解决方案
1. 分析慢查询日志,添加索引
2. 优化查询语句
3. 增加 innodb_buffer_pool_size

问题 3:Nginx 转发过多请求

解决方案
1. 确保静态资源直接处理
2. 开启 Nginx 缓存
3. 使用 CDN(内容分发网络)加速

总结与下一步行动建议

通过系统化的排查流程,你可以快速定位电商网站 CPU 打满的根因。本文涵盖了从 Nginx 到 PHP-FPM 再到 MySQL 的完整链路。

核心建议
1. 建立监控体系,设置实时告警(建议阈值:CPU 80% 持续 5 分钟)
2. 每周审查慢日志,识别性能瓶颈
3. 提前规划服务器扩容,避免高峰期资源不足;可参考 VPS 与独立服务器分层部署指南:数据库分离与缓存架构 制定分层扩容方案
4. 代码发布前进行性能审查,避免低效查询上线

推荐工具
– htop:直观的进程监控,支持颜色区分 CPU/内存占用
– iotop:监控磁盘 I/O,识别读写瓶颈
– PMM(Percona Monitoring and Management):MySQL 性能监控与可视化

如果你需要更深入的服务器优化服务,可以考虑专业的运维支持。对于稳定性要求较高的电商场景,建议选择配备完善监控工具的 VPS虚拟专用服务器)方案,确保能够实时掌握服务器状态。

总结:服务器 CPU 优化需要持续监控和迭代改进。建议先从监控告警入手,再针对瓶颈实施优化,最后验证效果。更多关于服务器性能优化的实践,可参考 CC 攻击防护完整指南:WAF 规则、限速与源站应急配置跨境业务 DNS(域名系统)解析慢优化:权威 DNS、TTL 与多线路服务器调度。如果你需要稳定的服务器环境,Hostease 提供的 VPS(虚拟专用服务器)方案配备完善的监控工具,适合电商等对稳定性要求较高的场景。

发表评论