温馨提示×

nginx日志中的慢查询Ubuntu如何优化

小樊
46
2026-01-08 09:51:56
栏目: 智能运维

Ubuntu 下基于 Nginx 日志定位与优化慢请求

一 准备可度量与可复现的数据

  • /etc/nginx/nginx.confhttp 段定义包含耗时字段的日志格式,并在 server 中应用;同时建议开启 gzipHTTP/2 减少传输与连接开销。示例:
    http {
      log_format  main_ext  '$remote_addr - $remote_user [$time_local] "$request" '
                           '$status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" '
                           'rt=$request_time uct=$upstream_connect_time '
                           'uht=$upstream_header_time urt=$upstream_response_time '
                           'cs=$sent_http_content_encoding';
    
      access_log /var/log/nginx/access.log main_ext buffer=512k flush=1m;
      gzip on;
      gzip_types text/plain text/css application/javascript application/json;
    
      server {
        listen 443 ssl http2;
        # ... 其他配置
      }
    }
    
    说明:关键字段含义为 $request_time(总耗时)、$upstream_connect_time(与上游建立连接耗时)、$upstream_header_time(等待上游响应头耗时)、$upstream_response_time(上游响应体耗时)。修改后执行 sudo nginx -t && sudo systemctl reload nginx 生效。

二 快速定位慢请求

  • 实时查看 Top N 慢请求(基于 $request_time):
    tail -n0 -f /var/log/nginx/access.log | \
      awk '$NF > 1 {print $NF, $7}' | sort -nr | head -n 20
    
  • 统计一段时间内最耗时的 URL(先归一化:去查询串、去后缀、将数字替换为 *):
    zcat -f /var/log/nginx/access.log* | \
      awk '{url=$7; gsub(/\?.*/,"",url); gsub(/\.(html|json)$/,"",url); gsub(/\/[0-9]+/,"/*",url);
            sum[url]+=$NF; cnt[url]++}
           END {for(u in sum) printf "%.3f %d %s\n", sum[u]/cnt[u], cnt[u], u}' | \
      sort -nr | head
    
  • 使用可视化与实时监控工具:
    • goaccess:生成 HTML 报表,直观查看慢 URL、状态码分布等。
    • ngxtop:类 top 的实时分析。
    • 大规模场景可接入 ELK/Fluentd/Graylog 做集中分析与告警。

三 配置层面的优化动作

  • 动静分离与浏览器缓存:对静态资源设置长 Cache-Control/Expires,减少重复请求与回源。
  • 反向代理缓存:对可缓存的接口/页面启用 proxy_cache,命中后直接返回,大幅降低后端压力。
  • 长连接复用:合理设置 keepalive_timeout,减少频繁 TCP 握手带来的额外时延。
  • 压缩传输:开启 gzip 对文本资源压缩,显著降低传输体积与时延。
  • 协议升级:启用 HTTP/2(通常需同时启用 TLS),利用多路复用与头部压缩提升并发与首包速度。
  • 日志减负:对命中强缓存或静态资源的请求可减少或不记录访问日志,并开启访问日志缓冲(如 buffer=512k flush=1m)以降低 I/O 压力。

四 建立可持续的监控与告警

  • 日志轮转与保留:使用 logrotate 按日/大小切分并压缩,控制磁盘占用,便于长期分析。
    /var/log/nginx/*.log {
      daily
      missingok
      rotate 14
      compress
      delaycompress
      notifempty
      create 0640 www-data adm
      sharedscripts
      postrotate
        systemctl reload nginx >/dev/null 2>&1 || true
      endscript
    }
    
  • 指标与可视化:将 $request_time / $upstream_response_time 的上报至 Prometheus(如 nginx-exporter),设置 P95/P99 阈值告警;结合 Grafana 面板观察趋势与异常。
  • 深入瓶颈定位:对持续慢的上游接口,结合应用日志与 strace/perf 等工具排查数据库、外部依赖或代码路径问题。

0