Ubuntu 下基于 Nginx 日志定位与优化慢请求
一 准备可度量与可复现的数据
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 生效。二 快速定位慢请求
tail -n0 -f /var/log/nginx/access.log | \
awk '$NF > 1 {print $NF, $7}' | sort -nr | head -n 20
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
三 配置层面的优化动作
四 建立可持续的监控与告警
/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
}