日常工作中收集的可快速根据NGINX的access.log日志统计各类访问信息命令:
访问IP相关统计
统计IP访问量(PV):
awk '{print $1}' access.log | wc -l
独立IP访问统计(UV):
awk '{print $1}' access.log | sort -n | uniq | wc -l
查看某一时间段的IP访问量(8-9点): grep "05/Oct/2022:0[8-9]" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | wc -l
查看访问最频繁的前100个IP:
awk '{print $1}' access.log | sort -n | uniq -c | sort -rn | head -n 100
查看访问次数在100次以上的IP:
awk '{print $1}' access.log | sort -n | uniq -c | awk '{if($1>100)print $0}' | sort -rn
查看某个IP的详细访问情况,按访问频率排序:
grep '127.0.0.1' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 100
页面访问统计
查看访问最频繁的页面(top 100):
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -n 100
查看访问最频繁的页面(排除php页面)(top 100):
grep -v '.php' access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 100
查看页面访问次数超过100次的页面:
cat access.php | cut -d ' ' -f 7 | sort | uniq -c | awk '{if($1>100)print $0}' | less
查看最近1000条记录中访问量最高的页面:
tail -1000 access.php | awk '{print $7}' | sort | uniq -c | sort -nr | less
请求量统计
统计每秒的请求数,top100的时间点(精确到秒):
awk '{print $4}' access.log | cut -c 14-21 | sort | uniq -c | sort -nr | head -n 100
统计每分钟的请求数,top100的时间点(精确到分钟):
awk '{print $4}' access.log | cut -c 14-18 | sort | uniq -c | sort -nr | head -n 100
统计每小时的请求数,top100的时间点(精确到小时):
awk '{print $4}' access.log | cut -c 14-15 | sort | uniq -c | sort -nr | head -n 100
性能分析
前置:在nginx的log中最后一个字段加入$request_time
列出传输时间超过3秒的页面,显示前20条:
cat access.php | awk '($NF > 3){print $7}' | sort -n | uniq -c | sort -nr | head -20
列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条:
cat access.php | awk '($NF > 1 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -100
TCP链接统计
查看当前TCP连接数
netstat -tan | grep "ESTABISHED" | grep ":80" | wc -l
【参数说明】
CLOSED:无连接是活动的或正在进行
ESTABLISHED:正常数据传输状态
TIME_WAIT:处理完毕,等待超时结束的请求数
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
用tcpdump嗅探80端口的最高访问
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr