Nginx 访问日志统计与分析

Nginx 访问日志统计与分析

access.log 是 nginx 访问日志,通过 awk/sort/uniq 组合可以快速统计请求量、来源、TOP IP 等。下面以字段方式说明常用统计命令。

1 日志格式

nginx 默认 log_format main 大致为:

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

各字段按空格/"分隔,awk 默认以空白字符为分隔符({print $N} 取第 N 列)。

2 统计 client 请求数,按请求量从高到低排列

cat access.log | awk '{print $17}' | sort | uniq -c | sort -r | head

$17 需按你的 log_format 调整,例如统计 IP 时取 $1(remote_addr)。

2.1 按 IP 统计请求量 TOP N

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 20

字段:$1 → 客户端 IP;uniq -c 计数;sort -rn 按次数降序。

2.2 统计请求的域名(Host)分布

tail access.log -n 100000 | awk '{print $17}' | sort | uniq -c | head -n 10

2.3 统计 URL 请求量

awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -n 20 # $7 为 URL

2.4 统计 HTTP 状态码分布

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

2.5 统计 TOP 来源 IP 的最小/最大响应时间

如果 log_format 里加了 request_time,可以按 IP 聚合并求平均耗时:

awk '{t[$1]+=$NF; n[$1]++} END{for(ip in t) printf "%d %d %s\n", n[ip], t[ip]/n[ip], ip}' \ access.log | sort -rn | head -n 20

3 时间窗口统计

统计某时间段内的请求量:

# 统计 9 点到 10 点之间的请求 awk '$4 >= "[09/Jan/2026:09:00:00" && $4 <= "[09/Jan/2026:10:00:00"' access.log | wc -l

4 常用命令组合说明

命令 作用
awk '{print $N}' 取第 N 列
sort 排序(需在 uniq 前)
uniq -c 去重并计数
sort -rn 按数值降序
head 取前 N 条,得到 TOP 排行

提示:统计前注意日志时间与 log_format 的列定义,字段序号以实际配置为准。

阅读 — · 全站 —
🎸 我的歌单 0 首