Linux 服务器 CPU 占用率 100% 排查与解决:从发现问题到彻底修复

AI摘要

服务器CPU占用率持续100%,负载飙升。排查发现Nginx-UI站点检查器每30秒高频请求,导致作为phpMyAdmin依赖自动安装的Apache2进程被占满。通过卸载Apache2及phpMyAdmin或降低检查频率,CPU恢复正常。

问题现象

今天晚上发现服务器 CPU 占用率持续 100%,负载从正常的 1-2 飙升到 13-17,系统响应缓慢。

%Cpu(s): 99.3 us, 0.7 sy, 0.0 id
load average: 13.29, 10.42, 6.01

排查过程

1. 查看高 CPU 进程

使用 top 命令查看占用 CPU 最高的进程:

top -bn1 | head -20

# 或者按 CPU 排序
ps aux --sort=-%cpu | head -15

结果发现多个 apache2 进程占满 CPU:

www-data 4117589 98.9% apache2 -DFOREGROUND
www-data 4117590 98.7% apache2 -DFOREGROUND
www-data 4117566 67.6% apache2 -DFOREGROUND
...

2. 检查访问日志

查看 Nginx 访问日志,发现大量来自本地的请求:

tail -50 /var/log/nginx/access.log | grep "127.0.0.1"
127.0.0.1 "GET / HTTP/1.1" 200 "Nginx-UI Site Checker/1.0"
127.0.0.1 "GET / HTTP/1.1" 200 "Nginx-UI Enhanced Checker/2.0"
127.0.0.1 "GET / HTTP/1.1" 200 "Nginx-UI Site Checker/1.0"
...

同一秒内有 10+ 条请求,每 30 秒一次。

3. 分析原因

检查后发现:

  • Nginx-UI 站点检查器每 30 秒检查所有站点
  • 请求被代理到后端的 Apache2(端口 9080)
  • Apache2 进程数有限,被频繁请求占满

4. 追溯 Apache2 来源

检查 Apache2 安装历史:

# 检查安装时间
ls -la /var/log/apache2/

# 检查依赖关系
dpkg -l | grep apache

发现 Apache2 是安装 phpMyAdmin 时作为依赖自动安装的(libapache2-mod-php8.3)。

解决方案

方案一:停止 Apache2 服务

sudo systemctl stop apache2
sudo systemctl disable apache2

方案二:完全卸载(推荐)

如果不需要 phpMyAdmin 和 Apache2,可以完全卸载:

# 停止服务
sudo systemctl stop apache2
sudo systemctl disable apache2

# 卸载 phpMyAdmin
sudo apt remove --purge phpmyadmin -y

# 卸载 Apache2 PHP 模块
sudo apt remove --purge libapache2-mod-php8.3 -y

# 卸载 Apache2
sudo apt remove --purge apache2 apache2-bin apache2-data apache2-utils -y

# 清理残留
sudo apt autoremove --purge -y

# 删除链接
sudo rm -f /var/www/html/phpmyadmin

方案三:调整 Nginx-UI 检查频率

如果需要保留站点检查功能,可以在 Nginx-UI 界面中:

  1. 打开 Nginx-UI(默认端口 9000)
  2. 找到「站点监控」或「Site Checker」设置
  3. 将检查间隔从 30 秒改为 5-10 分钟

验证结果

卸载后 CPU 占用率恢复正常:

top -bn1 | head -5
%Cpu(s): 0.8 us, 0.8 sy, 98.5 id
load average: 0.81, 0.63, 1.59

总结

本次 CPU 100% 问题的根本原因是:

  1. 安装 phpMyAdmin 时自动安装了 Apache2
  2. Nginx-UI 站点检查频率过高(每 30 秒)
  3. Apache2 进程被大量本地请求占满

解决方法:卸载不需要的 phpMyAdmin 和 Apache2,或降低 Nginx-UI 检查频率。

排查 CPU 问题常用命令

命令 作用
top 实时查看 CPU 使用率
htop 更友好的进程查看(需安装)
ps aux --sort=-%cpu 按 CPU 排序显示进程
ss -tlnp 查看端口监听情况
tail -f /var/log/nginx/access.log 实时查看访问日志
systemctl status 服务名 查看服务状态

预防措施

  • 安装软件时注意依赖关系,避免安装不需要的服务
  • 定期检查系统运行的服务:systemctl list-units --type=service --state=running
  • 监控工具的检查频率不要设置太高
  • 使用 nginx + php-fpm 替代 Apache 处理 PHP

Saiita

我还没有学会写个人说明!

相关推荐

Umami API 完全指南:自托管网站分析接口详解

Umami是一款开源、隐私优先的网站分析工具,其自托管版提供完整的REST API。使用前需通过登录获取Token进行认证。API涵盖网站管理(如创建、查询、更新网站)、会话统计(获取访问量、访客详情等数据)以及自定义事件追踪等功能,支持程序化获取和管理分析数据。

Umami v3.0.3 版本更新:Next.js 安全补丁

Umami v3.0.3 作为补丁版本发布,主要修复了与 Next.js 相关的安全问题。该版本是针对 Next.js 官方安全公告的紧急更新。Umami 是一个开源、隐私友好、轻量级的网站分析平台,支持自主托管和多站点管理。用户可通过 Docker 或 GitHub Releases 页面下载更新。

Docker 设置网络代理

Docker Compose因网络超时更新失败,错误为请求Docker仓库时连接被取消。解决方法是在`/etc/docker/daemon.json`中配置HTTP和HTTPS代理为`http://127.0.0.1:7897`,并重启Docker服务。

暂无评论