温馨提示×

怎样通过日志优化nginx性能

小樊
35
2026-10-11 12:24:02
栏目: 编程语言

通过日志来优化 Nginx 性能,核心思路是:用日志发现问题 → 定位瓶颈 → 调整配置或架构 → 验证效果。下面按“可操作步骤 + 实战要点”来说明。


一、先确保日志“有用且可控”

1. 合理设置 log_format

默认日志信息太少,建议自定义:

log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '$request_time $upstream_response_time $upstream_addr';

关键字段:

  • request_time:整体请求耗时
  • upstream_response_time:后端耗时(反向代理场景)
  • upstream_addr:后端地址

2. 控制日志量,避免“日志拖慢性能”

  • 高并发场景不要记录静态资源
  • 使用 access_log off;
location ~* \.(jpg|css|js|png)$ {
    access_log off;
}
  • 或按条件记录:
map $status $loggable {
    default 1;
    200 0;
}
access_log /var/log/nginx/access.log main if=$loggable;

二、通过日志发现性能问题

1. 慢请求分析(最重要)

awk '{print $NF, $7}' access.log | sort -rn | head

或专门看 request_time:

awk '{print $request_time, $request}' access.log | sort -rn | head

判断标准(经验值):

  • < 0.1s:正常
  • 0.1–0.5s:需注意
  • > 1s:明显问题

2. 区分“Nginx 慢”还是“后端慢”

对比:

  • request_time
  • upstream_response_time
情况 说明
request_time 大,upstream 小 Nginx 或网络问题
两者都大 后端慢
upstream 为空 静态或缓存命中

3. 状态码分析

awk '{print $9}' access.log | sort | uniq -c | sort -rn

常见问题:

  • 大量 499:客户端超时(Nginx 太快 or 后端太慢)
  • 大量 502/504:后端不稳定
  • 大量 404:资源配置错误

三、常见性能优化方向(由日志驱动)

1. 后端响应慢 → 加缓存

如果 upstream_response_time 高:

proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:10m;
location /api/ {
    proxy_cache mycache;
    proxy_cache_valid 200 10m;
}

2. 静态资源请求多 → 开启本地缓存

location ~* \.(js|css|png)$ {
    expires 7d;
    access_log off;
}

3. 连接数过高 → 调整 worker

日志中出现大量并发或 502:

worker_processes auto;
worker_connections 10240;

4. 请求体过大 → 限制

日志中 POST 大请求慢:

client_max_body_size 10m;

四、进阶:日志 + 工具

1. GoAccess(实时可视化)

goaccess access.log -o report.html

2. ELK / Loki

  • 慢请求告警
  • 按 URL、IP、状态码聚合

五、一个典型优化闭环示例

  1. 日志发现 /api/user 平均 1.2s
  2. upstream_response_time = 1.1s
  3. 后端加 Redis 缓存
  4. Nginx 开启 proxy_cache
  5. 再次分析日志:0.05s ✅

如果你愿意,可以:

  • 发一段 真实 access log
  • 或说明 Nginx 使用场景(静态 / 反向代理 / 高并发)

我可以直接帮你“看日志 + 给优化方案”。

0 踩