网站跑在阿里云的ECS上面,分析分析网站服务器日志,看看网站的访问量。
本文是查看nginx的访问日志
1 查看有多少个IP访问
]# awk '{print $1}' access.log | sort | uniq | wc -l
13866
2 查看某一个页面被访问的次数
]# grep "/wealth/index.php" access.log | wc -l
3 查看每一个IP访问了多少个页面
]# awk '{++S[$1]} END {for (a in S) print a,S[a]}' access.log > log.txt
]# sort -n -t '' -k 2 log.txt
4 将每个IP访问的页面数进行从小到大的排序
]# awk '{++S[$1]} END {for (a in S) print S[a],a}' access.log | sort -n
5 查看某一个IP访问了哪些页面
]# grep ^120.229.161.198 access.log | awk '{print $1,$7}'
6 去掉搜索引擎统计的页面
]# awk '{print $12,$1}' access.log | grep ^\"Mozilla | awk '{print $2}' | sort | uniq | wc -l
7 查看2019年5月10日15时,这一个小时内有多少IP访问
]# awk '{print $4,$1}' access.log | grep 10/May/2019:15 | awk '{print $2}' | sort | uniq | wc -l
8 查看访问前十个IP地址
]# awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
或
]# cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
uniq -c : 分组统计并把统计数放在最前面
]# cat access.log | awk '{counts[$(11)]+=1}; END {for(url in counts) print counts [url],url}'
9 访问次数最多的10个文件或页面
]# cat access.log | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
10 访问子域名访问次数,依据referer来计算,稍有不准
]# cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn | head -10
11 列出传输大小最大的几个文件
]# cat access.log | awk '($7~/\.php/){print $10 " " $1 " " $4 " " $7 }' | sort -nr |head -10
12 列出输出大于200000byte(约200kb)的页面以及对应页面发生次数
]# cat access.log | awk '($10 > 200000 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -10
13 如果日志最后一列记录的是页面文件传输时间,则有列出客户端最耗时的页面
]# cat access.log | awk '($7~/\.php/){print $NF "" $1 "" $4 "" $7}' | sort -nr | head -10
14 列出最耗时的页面(超过60秒的),以及对应页面发生的次数
]# cat access.log | awk '($NF > 60 && $7~/\.php/){print $7}' | sort -n | uniq -c | sort -nr | head -10
15 列出传输时间超过30秒的文件
]# cat access.log | awk '($NF > 30){print $7}' | sort -n | uniq -c |sort -nr | head -10
16 列出当前服务器每一进程运行的数量,倒序排序
]# ps -ef | awk -F ' ' '{print $8 " " $9}' | sort | uniq -c | sort -nr | head -20
17 查看apache当前并发访问数
对比httpd.conf中MaxClients的数字差距多少
]# netstat -an | grep ESTABLISHED | wc -l
18 可以使用如下参数查看数据
]# ps -ef | grep httpd | wc -l
统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器.
表示Apache能够处理n个并发请求,这个值Apache可根据负载情况自动调整
]# netstat -nat | grep -i "80" | wc -l
netstat -an 会打印系统当前网络链接状态,而grep -i “80” 是用来提取与80端口有关的连接的,
wc -l 进行统计连接数
最终返回的数字就是当前所有80端口的请求总数
]# netstat -na | grep ESTABLISHED | wc -l
netstat -an 会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立链接的信息
再wc -l 统计
最后返回的数字就是当前所有80端口已经建立的总数
]# netstat -na | grep ESTABLISHED | wc
可查看所有建立链接的详细记录
19 输出每个ip的连接数,以及总的各个状态的连接数
]# netstat -n | awk '/^tcp/ {n=split($ (NF-1),array,":");if(n<2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){print("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'
%-20s %s
49
TOTAL_IP 1
CLOSE_WAIT 1
ESTABLISHED 16
FIN_WAIT2 4
TIME_WAIT 28
TOTAL_LINK 49
20 其他
分析日志文件下,20195月10日访问页面最高的前20个URL并排序
]# cat access.log | grep '10/May/2019' | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
查询受访问页面的URL地址中,含有www.aaa.com网址的ip地址
]# cat access.log | awk '($11~/\www.aaa.com/){print $1}' | sort | uniq -c | sort -nr | head -10
获取访问最高的10个IP地址,同时也可以按时间来查询
]# cat access.log | awk '{print $1}' |sort | uniq -c | sort -nr | head -10
时间段查询日志时间段的情况
]# cat access.log | egrep '01/May/2019|10/May/2019' | awk '{print $1}' |sort | uniq -c | sort -nr | head -10
分析2019-05-01到2019-05-10访问""/index.php?g=Member&m=Public&a=sendValidCode"" 的IP倒序排序
]# cat access.log | egrep '01/May/2019|10/May/2019' | awk '{if($7 == "/index.php?g=Member&m=Public&a=sendValidCode") print $1,$7}' | sort | uniq -c | sort -nr
$7~/\.php/ $7里面包含.php的就输出,本句的意思是最耗时的是个PHP页面
]# cat access.log |awk '($7~/\.php/){print $NF "" $1 "" $4 "" $7}' | sort -nr | head -10
统计网站访问流量(G)
]# cat access.log | awk '{sum+=$10} END {print sun/2014/1024/1024}'
统计404的连接
]# awk '($9 ~/404/)' access.log | awk '{print $9 ,$7}' | sort
统计http status
]# cat access.log | awk '{counts[$(9)]+=1};END {for(code in counts) print code,counts[code]}'
]# cat access.log | awk '{print $9}' | sort | uniq -c | sort -rn
每秒并发
]# watch "awk '{if($9~/200|30|404/)COUNT[$4]++}END{for (a in COUNT) print a,COUNT[a]}' access.log | sort -k 2 -nr | head -n10"
带宽统计
]# cat access.log | awk '{if($7~/GET/) count++} END{print "client_request="count} '
]# cat access.log | awk '{BYTE+=$11}END {print "client_kbyte_out="BYTE/1024"KB"}'
找出某天访问次数最多的10个IP
]# cat access.log | grep "10/May/2019" | awk '{print $3}' | sort | uniq -c | sort -nr | head -10
当天IP连接数最高的IP都在干什么
]# cat access.log | grep "80.211.113.47" | awk '{print $8}' |sort | uniq -c | sort -nr | head -n 10
小时单位里ip连接数最多的10个时段
]# awk -vFS="[:]" '{gsub("-.*","",$1);num[$2""$1]++}END{for(i in num)print i,num[i]}' access.log | sort -n -k 3 -r | head -10
找出访问次数最多的几分钟
]# awk '{print $1}' access.log | grep "10/May/2019" | cut -c 14-18 | sort | uniq -c | sort -nr | head
取5分钟日志
if [ $DATE_MINUTE != $DATE_END_MINUTE ] ;then
#判断开始时间戳与结束时间戳是否相等
START_LINE=sed -n "/$DATE_MINUTE/=" $APACHE_LOG| head -n1
#如果不相等,则取出开始时间戳的行号,与结束时间戳的行号
查看tcp的连接状态
]# netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
]# netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
]# netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
]# netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k, "\t",arr[k]}'
]# netstat -n | awk '/^tcp/ {print $NF}' | sort | uniq -c | sort -rn
]# netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c |awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -n
]# netstat -ant | awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' | sort -rn | head -n 10
查找请求数前20个IP(常用于查找攻击来源)
]# netstat -antulp | grep 80 | grep tcp | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -10
]# netstat -ant | awk '/:80/{split ($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' | sort -rn | head -10
用tcpdump抓包,查看80端口的访问,看谁最高
]# tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{pritn $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -10
查找较多time_wait连接
]# netstat -n | grep TIME_WAIT| awk '{print $5}' | sort | uniq -c | sort -rn | head -10
查找较多的SYN连接
]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
根据端口列出进程
]# netstat -antulp | grep 80 | awk '{print $7}' | cut -d/ -f1
查看连接数和当前的连接数
]# netstat -antulp | grep $ip:80 | wc -l
]# netstat -antulp | grep $ip:80 | grep EST | wc -l
查看IP访问次数
]# netstat -antulp | grep ":80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -n
Linux命令分析当前的连接状况
]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
]# watch "netstat -n | awk '/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}'"
# 通过watch可以一直监控
LAST_ACK 5 #关闭一个TCP连接需要从两个方向上分别进行关闭,双方都是通过发送FIN来表示单方向数据的关闭,当通信双方发送了最后一个FIN的时候,发送方此时处于LAST_ACK状态,当发送方收到对方的确认(Fin的Ack确认)后才真正关闭整个TCP连接;
SYN_RECV 30 # 表示正在等待处理的请求数;
ESTABLISHED 1597 # 表示正常数据传输状态;
FIN_WAIT1 51 # 表示server端主动要求关闭tcp连接;
FIN_WAIT2 504 # 表示客户端中断连接;
TIME_WAIT 1057 # 表示处理完毕,等待超时结束的请求数;