Debian 上定位与优化 Nginx 资源占用的系统化方法
一 快速定位资源占用
- 服务与端口
- 查看运行状态与最近日志:systemctl status nginx
- 语法校验与热重载:nginx -t && nginx -s reload
- 监听端口检查:ss -tulpen | grep ‘:80|:443’(确认 80/443 正常监听)
- 资源监控
- 进程级:top/htop(关注 %CPU、%MEM、RES 与负载)
- 容器/分组:systemd-cgtop(若使用 systemd 资源控制组)
- 连接与状态
- 内置状态页(需启用模块):curl http://127.0.0.1/nginx_status,关注 Active connections / Reading / Writing / Waiting
- 日志线索
- 访问日志:/var/log/nginx/access.log(请求量、耗时、UA、状态码)
- 错误日志:/var/log/nginx/error.log(超时、连接拒绝、上游异常等)
以上命令覆盖服务状态、端口连通、资源占用与日志定位,适合作为第一步排查清单。
二 关键指标与瓶颈判断
- 连接与并发
- 关注 Active connections 与 Waiting(长连接场景 Waiting 高属正常)
- 估算并发能力:worker_processes × worker_connections × 2(反向代理常见为“客户端↔Nginx”和“Nginx↔上游”两条连接)
- 吞吐与延迟
- 通过 access.log 的 $request_time / $upstream_response_time 统计 P50/P95/P99 延迟与慢请求比例
- 错误率:5xx/4xx 占比升高常指示后端或限流问题
- 资源维度
- CPU:持续接近 100% 多为计算密集(压缩、SSL、复杂路由/重写)
- 内存:单个 worker 常驻内存随 worker_connections、proxy_buffers 等上升
- 文件描述符:连接数上不去时检查 ulimit -n 与 worker_rlimit_nofile
这些指标与判断方法可快速指向“连接瓶颈 / 上游瓶颈 / CPU瓶颈 / 内存瓶颈”。
三 日志与指标驱动的排查流程
- 高并发但吞吐低
- 检查 worker_connections 与系统 ulimit -n / worker_rlimit_nofile
- 查看 error.log 是否出现 accept() failed、too many open files
- 适当增大 listen … backlog(如 4096)以缓解突发排队
- 响应慢或超时
- 对比 $request_time 与 $upstream_response_time:上游耗时主导则排查 PHP-FPM/uWSGI/数据库 与网络
- 反向代理开启 keepalive 复用连接,减少握手开销
- 启用 proxy_buffering 平滑突发,设置合理 proxy_read_timeout
- 502/504 增多
- 确认后端存活与端口连通:systemctl status php-fpm / uwsgi,必要时 curl 直连后端
- 检查 upstream 健康与超时配置,必要时调整 max_fails / fail_timeout
- 带宽与 CPU 高
- 开启 gzip(建议 gzip_comp_level=6),压缩文本类资源
- 静态资源设置 Cache-Control / Expires 减少重复传输
- 日志过大影响 I/O
- 使用 条件日志 与 缓冲写入,对静态资源可关闭访问日志
以上流程结合状态页、日志与网络连通性检查,可系统化缩小问题范围。
四 配置优化要点与示例
- 进程与连接
- 设置 worker_processes auto(通常等于 CPU 核心数)
- 合理提升 worker_connections(配合系统 ulimit 与内存容量)
- 静态文件
- 启用 sendfile on; tcp_nopush on; tcp_nodelay on;
- 设置 expires 1y; add_header Cache-Control “public, immutable”;(对长期不变的静态资源)
- 反向代理
- 复用连接:proxy_http_version 1.1; proxy_set_header Connection “”; keepalive 32;
- 缓冲与超时:proxy_buffering on; proxy_read_timeout 10s; proxy_connect_timeout 5s;
- 压缩与缓存
- gzip on; gzip_comp_level 6; gzip_types text/css application/javascript application/json;
- 反向代理缓存示例:
- proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
- proxy_cache my_cache; proxy_cache_valid 200 1h;
- 限流与防护
- limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
- limit_conn_zone $binary_remote_addr zone=conn:10m; limit_conn conn 10;
以上为常见且高收益的优化项,建议逐项验证并保留基线对比。
五 监控与压测闭环
- 实时监控
- 内置状态页:stub_status(Active/Accepted/Handled/Requests、Reading/Writing/Waiting)
- 可视化:Prometheus + Grafana(配合 nginx-vts-exporter 获取更丰富指标)
- 日志分析:GoAccess / ELK(实时/离线分析访问与错误日志)
- 压测验证
- 基准测试:wrk -t12 -c400 -d30s --latency http://your-domain/
- 复测对比:每次调参后重复压测,观察 P95/P99 延迟、吞吐、错误率、CPU/内存 变化
- 变更管控
- 配置变更遵循:nginx -t && nginx -s reload,保留回滚方案与变更记录
通过“监控 → 假设 → 调整 → 压测 → 复盘”的闭环,可稳步提升稳定性与性能上限。