【负载均衡系列】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. 架构升级:引入缓存、队列、分布式架构。
相关推荐
先知后行。几秒前
进程间通信(IPC)
linux·运维·服务器
weixin_5716674142 分钟前
Windows 通过 SSH 反向隧道向 Ubuntu 转发代理
linux·运维·windows·代理
乔旭伟1 小时前
CentOS 停更迁移实战:vault 源配置、目标选型与迁移工程清单
linux·运维·centos
遇印记1 小时前
应用层,网络管理
运维·网络·windows·学习·安全
EterNity_TiMe_1 小时前
Docker服务越装越多记不住端口?我用Fenrus把NAS里的常用入口整理成一个导航页
运维·人工智能·docker·ai·容器·cpolar
IT大白鼠2 小时前
AI SSH 运维助手 V13.0内部版七项私有新特性全解
运维·人工智能·ssh
天蓝蓝的本我3 小时前
ollama外部无法访问.ollama.service 文件无法写入.ollama外部无法访问.
运维·网络
帷幕落秋3 小时前
经典命令场景与软硬链接
linux·运维
Sayai4 小时前
Java 进程 Unable to create new native thread 排查实战:Linux 线程数五层限制与 JVM -Xss 调优
java·linux·运维·jvm·性能优化