Loading
0

Linux下通过Nginx访问日志统计网站访问IP/PV/URL/UV量等

技术小学生微信公众号
腾讯云服务器大促销。
华为服务器
前言:在网站的日常维护中,我们经常需要收集网站页面访问的情况,比如访问量或者请求的URL地址,以便排查是否有异常或者通过分析访问记录优化网站提高质量。
说明:统计网站访问情况的方法有很多。
1、最常见的是添加站长统计代码实现,比如:cnzz站长统计:http://www.cnzz.com/  51la站长统计:https://www.51.la/  百度站长统计:https://tongji.baidu.com/等
2、本次将介绍在通过linux shell命令查看Nginx访问日志中的访问情况,比如访问IP、统计UV、统计PV、访问最多的URL页面、访问最频繁的IP等情况。
之前也有类似教程可参考:https://blog.tag.gg/showinfo-3-36165-0.html
常见说明:
什么是UV:
即:独立访客(Unique Visitor)可以理解成访问某网站的电脑的数量,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
什么是PV:
即:访问量(Page View)页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,所以同一个页面每刷新一次也算一次。PV并不是页面的来访者数量,而是网站被访问的页面数量。
什么是访问者IP:
即:指独立IP数(Internet Protocol)是指1天内多少个独立的IP浏览了页面,即统计不同的IP浏览用户数量。同一IP不管访问了几个页面,独立IP数均为1;不同的IP浏览页面,计数会加1。 同一个局域网下的多台电脑访问,则被记录为一个独立IP访问者。如果用户不断更换IP,则有被多次统计。
1、通过IP统计UV:

awk '{print $1}' blog.tag.gg.log | sort | uniq -c | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# awk '{print $1}' blog.tag.gg.log | sort | uniq -c | wc -l
3566377

2、通过访问URL统计PV:

awk '{print $7}' blog.tag.gg.log | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# awk '{print $7}' blog.tag.gg.log | wc -l
6521565

3、获取访问最多的URL

awk '{print $7}' blog.tag.gg.log | sort | uniq -c | sort -n -k 1 -r | more

输出结果:

[root@blog_tag_gg wwwlogs]# awk '{print $7}' blog.tag.gg.log | sort | uniq -c | sort -n -k 1 -r | more
     561235 /favicon.ico
     454656 /css/iconfont.ttf
     468465 /d/file/p/2019/11-18/e8e397189f8b1d40212a634c1042b711.jpg
     498456 /robots.txt
     54651 /showinfo-7-36256-0.html
     44612  /showinfo-36-33717-0.html
     44610 /showinfo-36-2985-0.html
......

4、获取访问最频繁的前20个IP地址。

awk '{print $1}' blog.tag.gg.log | sort | uniq -c | sort -n -k 1 -r | head -20

输出结果:

[root@blog_tag_gg wwwlogs]# awk '{print $1}' blog.tag.gg.log | sort | uniq -c | sort -n -k 1 -r | head -20
   1037 152.32.185.190
    251 219.234.4.52
    165 61.52.132.188
    164 203.119.160.27
    140 66.249.69.214
    134 3.223.183.74
    131 182.119.163.19
    112 171.8.171.84
    110 54.156.8.33
    106 1.192.241.172

5、通过时间段统计查看日志:
方法1:用sed命令:

cat  blog.tag.gg.log | sed -n '/31\/Dec\/2022:[01-23]/p' | more

输出结果:

[root@blog_tag_gg wwwlogs]# cat  blog.tag.gg.log | sed -n '/31\/Dec\/2022:[01-23]/p' | more
152.32.185.190 - - [31/Dec/2022:10:00:03 +0800] "GET //showinfo-36-30805-0.html HTTP/1.0" 200 72707 "https://blog.tag.gg" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.115 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
1.192.246.143 - - [31/Dec/2022:10:00:04 +0800] "GET /showinfo-36-28050-0.html HTTP/1.1" 200 14895 "https://blog.tag.gg/tags-%E8%80%81%E5%AD%97%E5%8F%B7-0.html" "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36"

方法2:用grep命令:

grep '31\/Dec\/2022:[01-23]' blog.tag.gg.log |more

输出结果:
[root@blog_tag_gg wwwlogs]# grep '31\/Dec\/2022:[01-23]' blog.tag.gg.log |more
66.249.69.214 - - [31/Dec/2022:00:00:04 +0800] "GET /tags-%E8%B0%B7%E7%99%BE%E4%BC%98-0.html HTTP/1.1" 200 12078 "-" "Mo
zilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.115 Mob
ile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.69.218 - - [31/Dec/2022:00:00:05 +0800] "GET /e/tags/?tagid=4471 HTTP/1.1" 200 11579 "-" "Mozilla/5.0 (Linux; And
roid 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.115 Mobile Safari/537.36 (co
mpatible; Googlebot/2.1; +http://www.google.com/bot.html)"
6、获取当日的PV和UV
PV:

cat blog.tag.gg.log | sed -n /`date "+%d\/%b\/%Y"`/p | awk '{print $7}' | sort | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# cat blog.tag.gg.log | sed -n /`date "+%d\/%b\/%Y"`/p | awk '{print $7}' | sort | wc -l
55803

UV:

cat blog.tag.gg.log | sed -n /`date "+%d\/%b\/%Y"`/p |awk '{print $1}' | sort|uniq -c | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# cat blog.tag.gg.log | sed -n /`date "+%d\/%b\/%Y"`/p |awk '{print $1}' | sort|uniq -c | wc -l
3773

如果使用以上这两个命令发现统计不出来任何数据时,就要检查一下,系统的语言变量LANG是否配置成中文,如果是则需要配置成英文,这时在执行pv和uv命令就可以统计出来了。

exportLANG="en_US.UTF-8"

7、获取最耗时的请求时间、url
获取前十个,若是全部,可以将| head -10去掉。

cat blog.tag.gg.log | awk '{print $4,$7,$NF}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10

输出结果:

[root@blog_tag_gg wwwlogs]# cat blog.tag.gg.log | awk '{print $4,$7,$NF}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10
[31/Dec/2022:00:02:00 /showinfo-36-20609-0.html 360SE)
[31/Dec/2022:10:34:08 /css/fontawesome-webfont.woff2?v=4.7.0 7
[31/Dec/2022:10:34:06 /e/tags/?tagid=12231 7
[31/Dec/2022:10:34:06 /e/member/login/loginjs.php 7
[31/Dec/2022:03:13:45 /showinfo-36-21260-0.html 6.0)
[31/Dec/2022:02:01:39 / 3.5.21022)
[31/Dec/2022:11:56:03 /favicon.ico 1.0
[31/Dec/2022:10:48:27 /e/member/login/loginjs.php 1.0
[31/Dec/2022:10:48:27 / 1.0
[31/Dec/2022:10:47:58 /e/member/login/loginjs.php 1.0

8、获取每分钟的请求数量

cat blog.tag.gg.log  | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}'

输出结果:
[root@blog_tag_gg wwwlogs]# cat access.log  | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' |more
19:06,1
19:10,6
19:11,2
20:54,1
02:38,2
02:54,1
03:20,1
04:52,1
05:17,4
09:08,1
10:40,1
可以输出到csv格式文件中

cat blog.tag.gg.log| awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > blog.tag.gg.csv

输出结果:

[root@blog_tag_gg wwwlogs]# cat blog.tag.gg.log| awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > acces
s.csv
[root@blog_tag_gg wwwlogs]# ll
total 207748
-rw-r--r-- 1 root root     8843 Dec 31 14:42 access.csv

9、查看某个时间段之间的ip访问个数
例如查看10点到19点的访问ip数

grep "2022:1[0-9]" blog.tag.gg.log | awk '{ips[$1]+=1} END{for(ip in ips) print ips[ip],ip}' | sort -nr | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# grep "2022:1[0-9]" blog.tag.gg.log | awk '{ips[$1]+=1} END{for(ip in ips) print ips[ip],ip}' | sort -nr | wc -l
1604

查看10点到19点之间的ip访问数>=50的ip

grep '2022:1[0-19]' blog.tag.gg.log | awk '{ips[$1]+=1}END{for(ip in ips) if(ips[ip]>=50) print ips[ip],ip}' | sort -nr

输出结果:

[root@blog_tag_gg wwwlogs]# grep '2022:1[0-19]' blog.tag.gg.log | awk '{ips[$1]+=1}END{for(ip in ips) if(ips[ip]>=50) print ips[ip],ip}' | sort -nr
195 203.119.160.27
89 66.249.69.214
83 152.32.185.190
51 66.249.69.216

10、查看某一个IP访问了哪些页面:

grep ^66.249.69.216 blog.tag.gg.log| awk '{print $1,$7}'

输出结果:

[root@blog_tag_gg wwwlogs]# grep ^66.249.69.216 blog.tag.gg.log| awk '{print $1,$7}'
66.249.69.216 /showinfo-36-16942-0.html
66.249.69.216 /e/extend/lgyPl2.0/api/record.php?orderby=0&id=29118&classid=36
66.249.69.216 /tags-%E5%B9%BF%E5%91%8A%E6%B4%BB%E5%8A%A8%E8%B7%9F%E8%B8%AA-0.html
66.249.69.216 /showinfo-3-36243-0.html
66.249.69.216 /tags-%E5%8A%A0%E6%B9%BF%E5%99%A8-0.html
66.249.69.216 /tags-etagid13860-5.html
66.249.69.216 /tags-%E7%BD%91%E7%AB%99-37.html
66.249.69.216 /showinfo-36-23525-0.html
66.249.69.216 /showinfo-36-21804-0.html
66.249.69.216 /showinfo-8-35798-0.html

11、查看某一个页面被访问的次数:

grep "/index.php" blog.tag.gg.log | wc -l

输出结果:

[root@blog_tag_gg wwwlogs]# grep "/index.php" blog.tag.gg.log | wc -l
46546

12、统计网站流量(G)

cat blog.tag.gg.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'

输出结果:

[root@blog_tag_gg wwwlogs]# cat blog.tag.gg.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
0.799466




 
技术小学生微信公众号
华为服务器
腾讯云服务器大促销。

声明:站长码字很辛苦啊,转载时请保留本声明及附带文章链接:https://blog.tag.gg/showinfo-7-36256-0.html
亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢?
上一篇:Nginx禁止http/https及IP被恶意解析以及https窜站方法
下一篇:解决Nginx报error while loading shared libraries: libjemalloc.so.2: cannot open