【负载均衡系列】nginx负载高怎么排查

一、快速定位问题方向

  1. 现象确认 :
    • 服务器响应变慢、超时或返回 5xx 错误。
    • 系统监控显示 CPU、内存、磁盘 I/O 或网络带宽使用率飙升。
  2. 初步判断 :
    • Nginx 自身瓶颈:配置不当、连接数超限、日志写入阻塞。
    • 后端服务问题:应用处理慢、数据库阻塞、缓存失效。
    • 外部攻击/异常流量:DDoS、爬虫、API 滥用。

二、系统资源分析

​1. 查看全局资源占用
复制代码
# 查看整体资源使用(按 CPU 排序)
top
htop

# 检查内存使用
free -h

# 磁盘 I/O 分析
iostat -x 1
iotop

# 网络流量监控
nload          # 实时流量
iftop -i eth0  # 按连接排序
​2. 定位高负载进程
复制代码
# 按 CPU 使用率排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

# 按内存使用排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

​三、Nginx 自身诊断

​1. 检查 Nginx 状态
复制代码
# 查看工作进程状态
ps aux | grep nginx

# 检查活跃连接数
netstat -ant | grep :80 | wc -l

# 使用 Nginx 状态模块(需提前配置)
curl http://localhost/nginx_status

输出示例:

复制代码
Active connections: 291 
server accepts handled requests
 16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106 
​2. 分析连接数配置
复制代码
# 检查配置文件中的核心参数
worker_processes auto;         # 应与 CPU 核心数匹配
worker_connections 10240;     # 单进程最大连接数
worker_rlimit_nofile 100000;  # 文件描述符限制
​3. 日志分析
复制代码
# 实时监控错误日志
tail -f /var/log/nginx/error.log

# 高频错误统计
grep "error" /var/log/nginx/error.log | awk '{print $8}' | sort | uniq -c | sort -nr

# 慢请求分析(需配置 $request_time)
awk '{if ($10 > 1) print $7, $10}' /var/log/nginx/access.log | sort -k2 -nr

​四、后端服务排查

​1. 检查代理超时配置
复制代码
location / {
    proxy_pass http://backend;
    proxy_connect_timeout 5s;   # 连接后端超时
    proxy_read_timeout 60s;     # 读取响应超时
    proxy_send_timeout 30s;     # 发送请求超时
}
​2. 后端服务健康状态
复制代码
# 手动测试后端响应
curl -v -o /dev/null -s -w "HTTP Code: %{http_code}\nTotal Time: %{time_total}\n" http://backend

# 检查负载均衡状态(需配置 upstream_status)
curl http://localhost/upstream_status
​3. 数据库与缓存
复制代码
# MySQL 进程列表
mysql -u root -p -e "SHOW FULL PROCESSLIST;"

# Redis 监控
redis-cli info stats | grep instantaneous_ops_per_sec

​五、网络层排查

​1. 连接跟踪
复制代码
# 查看 TCP 连接状态
ss -s          # 全局统计
ss -tn sport = :80 | awk '{print $1}' | sort | uniq -c  # 按状态分类

# 检查 TIME_WAIT 堆积
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
​2. 防火墙与带宽
复制代码
# 检查防火墙规则
iptables -L -n -v

# 测试带宽瓶颈
iperf3 -c <target_ip> -p 5201

六、攻击与异常流量识别

​1. 高频 IP 统计
复制代码
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
​2. 封禁恶意 IP
复制代码
# 动态黑名单(需安装 ngx_http_geoip_module)
geo $block_ip {
    default 0;
    1.2.3.4 1;   # 手动封禁
}

server {
    if ($block_ip) {
        return 403;
    }
}
​3. 限流配置
复制代码
# 请求速率限制
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;

location /api {
    limit_req zone=api_limit burst=200;
}

​

七、性能优化措施

​1. 静态资源优化
复制代码
location ~* \.(jpg|css|js)$ {
    expires 365d;
    add_header Cache-Control "public";
    access_log off;
}
​2. 启用 Gzip/Brotli 压缩
复制代码
gzip on;
gzip_types text/plain text/css application/json application/javascript;
​3. 调整内核参数
复制代码
# 增加端口复用范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"

# 快速回收 TIME_WAIT 连接
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1

​总结排查流程

  1. 监控定位:确定是 CPU、内存、I/O 还是网络问题。
  2. 日志溯源:分析 error.log 和 access.log 找异常模式。
  3. 链路压测 :使用 ab 或 wrk 模拟请求,逐步隔离瓶颈点。
  4. 配置调优:调整 Nginx、系统内核、后端服务参数。
  5. 架构升级:引入缓存、队列、分布式架构。
相关推荐
judezh7 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
春天花会开1318 小时前
内网 HTTPS 部署实战:私有 CA + Nginx 反向代理全流程复盘
运维·nginx·https
AllFiles8 小时前
K8s Node Exporter 异常 Write 超时排查实录
运维·后端·kubernetes
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特6 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站6 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏6 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing6 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅6 天前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren6 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github