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;}通过awk、sort、uniq等命令快速筛选耗时请求:
基础筛选:查找处理时间超过5秒的请求
awk '$NF > 5 {print $0}' /var/log/nginx/access.log$NF表示最后一列(即request_time),>5筛选耗时超过5秒的请求。
输出结果包含完整日志行,可直接定位问题URL。
排序与去重:统计慢查询出现频率
awk '$NF > 5 {print $0}' /var/log/nginx/access.log | sort | uniq -c | sort -nruniq -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可快速识别高频慢查询接口。
按耗时排序:找出最耗时的请求
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}'自动统计高频慢查询(按出现次数降序)。
列出最耗时的10个请求。
对于大规模日志或复杂分析需求,可部署ELK Stack:
绘制慢查询趋势图。
按URL、客户端IP等维度聚合分析。
设置告警规则(如持续出现耗时>10秒的请求)。
对高频慢查询接口进行代码优化(如减少数据库查询、启用缓存)。
检查慢查询对应的后端服务(如PHP-FPM、Node.js)是否存在性能瓶颈。
配置logrotate避免日志文件过大,例如:/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload nginx endscript}
通过以上方法,可系统化地识别Nginx日志中的慢查询,为性能优化提供数据支持。