🗣 Wd提问: nginx100%
🤖 Ai回答: 当 Nginx 的 CPU 使用率持续达到 100% 时,通常意味着 Nginx 无法高效处理请求,可能由配置问题、高并发压力、恶意攻击或资源不足导致。以下是系统化的排查和解决步骤:
1、确认问题现象
检查实时 CPU 使用率:
bash
top -c 按 P 排序,找到 Nginx 进程
或
htop 更直观的界面
观察 `PID` 和 `%CPU`,确认是 `nginx: worker process` 进程占用过高。
2、常见原因及解决方案
(1) 配置不当(最常见)
问题:`worker_processes` 未合理设置,或 `worker_connections` 过小。
解决:
检查配置:
nginx
/etc/nginx/nginx.conf
worker_processes auto; 自动匹配 CPU 核心数(推荐)
worker_connections 1024; 根据服务器性能调整(默认 1024)
验证配置:
bash
nginx -t 检查配置语法
nginx -s reload 重载配置
(2) 高并发请求或攻击
问题:DDoS 攻击、爬虫滥用、恶意脚本。
解决:
限制请求速率(使用 `limit_req` 模块):
nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; 每秒 10 请求
server {
location / {
limit_req zone=one burst=5; 允许突发 5 个请求
}
}
}
封禁恶意 IP(使用 `fail2ban` 或 Nginx 自带模块):
nginx
阻止频繁访问的 IP
http {
map $http_user_agent $bad_bot {
default 0;
~*bot 1;
~*spider 1;
}
server {
if ($bad_bot) {
return 403;
}
}
}
(3) SSL/TLS 加密开销大
问题:使用弱加密协议(如 TLS 1.0)或未启用硬件加速。
解决:
优化 SSL 配置(`/etc/nginx/conf.d/ssl.conf`):
nginx
ssl_protocols TLSv1.2 TLSv1.3; 禁用旧协议
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
启用硬件加速(如 CPU 支持):
nginx
ssl_engine on; 确保 OpenSSL 支持硬件加速
(4) 缓存未配置或配置错误
问题:静态资源未缓存,导致重复请求后端。
解决:
配置静态文件缓存:
nginx
location /static/ {
expires 1y;
add_header Cache-Control public, immutable;
}
启用反向代理缓存(如果使用 `proxy_pass`):
nginx
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=backend:10m;
location / {
proxy_cache backend;
proxy_cache_valid 200 302 1h;
proxy_pass http://backend;
}
(5) 后端服务响应慢
问题:Nginx 代理到后端(如 PHP-FPM、Node.js),后端响应过慢。
解决:
检查后端日志(如 `/var/log/php-fpm.log`)。
调整超时时间:
nginx
location / {
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
}
3、快速诊断工具
分析 Nginx 请求模式:
bash
统计高频请求路径
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
检查慢请求:
bash
查看超时日志
grep timeout /var/log/nginx/error.log
4、紧急处理(临时缓解)
重启 Nginx(仅当配置已修复):
bash
nginx -s stop && nginx 安全重启
临时限制并发(如果无法立即修复配置):
nginx
在 server 块中添加
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 10; 每个 IP 最多 10 连接
5、预防措施
1、监控系统:使用 `Prometheus + Grafana` 或 `Nginx Status Module` 实时监控。
2、定期优化:每季度检查 Nginx 配置和日志。
3、硬件升级:如果长期高负载,考虑增加 CPU 核心数或使用负载均衡。
示例:完整优化配置片段
nginx
http {
核心优化
worker_processes auto;
worker_connections 4096;
keepalive_timeout 65;
SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
请求限流
limit_req_zone $binary_remote_addr zone=one:10m rate=50r/s;
server {
listen 443 ssl;
server_name 65.hk;
缓存静态资源
location /static/ {
expires 1y;
add_header Cache-Control public, immutable;
}
限制请求速率
location / {
limit_req zone=one burst=10;
proxy_pass http://backend;
}
}
}
总结
优先检查配置(`worker_processes`、`worker_connections`)。
排除攻击(限流、封禁 IP)。
优化 SSL 和缓存。
确保后端服务响应正常。
通过以上步骤,90% 以上的 Nginx 高 CPU 问题可以解决。如果问题持续,请提供 `nginx -T` 输出和 `top` 截图,以便进一步分析。
📣 商家广告:





0
IP地址: 121.43.108.156
搜索次数: 14
提问时间: 2025-11-03 16:59:59
本站所有
❓
问答
均由Ai自动分析整理,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
本站由
🟢
豌豆Ai
提供技术支持,使用的最新版:
豌豆Ai站群搜索引擎系统 V.25.10.25
搭建本站。