如何通过nginx日志找出慢查询

如何通过nginx日志找出慢查询
最新回答
;單人旁┍

2023-12-12 21:08:35

通过Nginx日志找出慢查询的核心步骤包括配置日志格式、使用命令行工具分析、编写自动化脚本或引入ELK Stack进行高级分析。以下是具体操作方法:

一、配置Nginx日志格式

需确保日志包含request_time字段(记录请求处理时长),修改Nginx配置文件(通常位于/etc/nginx/nginx.conf或站点配置文件):

http { log_format mylog '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$http_x_forwarded_for" ' '$request_time'; # 关键字段:记录请求耗时(秒) access_log /var/log/nginx/access.log mylog;}
  • 关键点:$request_time字段表示从接收请求到完成响应的总时间(单位:秒),是识别慢查询的核心依据。
  • 生效方式:修改后需重启Nginx(systemctl restart nginx)。
二、使用命令行工具分析慢查询

通过awk、sort、uniq等命令快速筛选耗时请求:

  1. 基础筛选:查找处理时间超过5秒的请求

    awk '$NF > 5 {print $0}' /var/log/nginx/access.log

    $NF表示最后一列(即request_time),>5筛选耗时超过5秒的请求。

    输出结果包含完整日志行,可直接定位问题URL。

  2. 排序与去重:统计慢查询出现频率

    awk '$NF > 5 {print $0}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

    uniq -c统计重复行次数,sort -nr按出现次数降序排列。

    典型输出:12 192.168.1.1 - - [10/Oct/2023:14:30:00] "GET /api/data HTTP/1.1" 200 1024 "-" "Mozilla/5.0" "-" 6.28 192.168.1.2 - - [10/Oct/2023:14:31:00] "POST /upload HTTP/1.1" 200 2048 "-" "Mozilla/5.0" "-" 7.5可快速识别高频慢查询接口。

  3. 按耗时排序:找出最耗时的请求

    awk '{print $NF, $0}' /var/log/nginx/access.log | sort -nr | head -20 | awk '{$1=""; print $0}'

    先提取request_time并排序,再截取前20条最慢请求。

三、编写自动化脚本

创建slow.sh脚本(需赋予执行权限chmod +x slow.sh):

#!/bin/shLOG_FILE=$1THRESHOLD=${2:-5} # 默认阈值5秒echo "=== 慢查询统计(耗时>${THRESHOLD}秒) ==="awk -v th="$THRESHOLD" '$NF > th {print $0}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -20echo "=== 最耗时请求TOP 10 ==="awk '{print $NF, $0}' "$LOG_FILE" | sort -nr | head -10 | awk '{$1=""; print $0}'
  • 使用方式:./slow.sh /var/log/nginx/access.log 3 # 筛选耗时>3秒的请求
  • 功能

    自动统计高频慢查询(按出现次数降序)。

    列出最耗时的10个请求。

四、高级分析:ELK Stack

对于大规模日志或复杂分析需求,可部署ELK Stack:

  1. Elasticsearch:存储和索引日志数据。
  2. Logstash:采集Nginx日志并解析request_time字段。
  3. Kibana:可视化分析,例如:

    绘制慢查询趋势图。

    按URL、客户端IP等维度聚合分析。

    设置告警规则(如持续出现耗时>10秒的请求)。

五、优化建议
  1. 针对性优化

    对高频慢查询接口进行代码优化(如减少数据库查询、启用缓存)。

    检查慢查询对应的后端服务(如PHP-FPM、Node.js)是否存在性能瓶颈。

  2. 日志轮转

    配置logrotate避免日志文件过大,例如:/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload nginx endscript}

通过以上方法,可系统化地识别Nginx日志中的慢查询,为性能优化提供数据支持。