为了了解自己网站的访问情况,我所了解到的有两种办法,一种是使用cnzz等第三方服务商提供的代码,放置在网站通用位置,通过用户访问的时候触发js,记录访问请求。另一种就是通过分析服务器日志文件,从数据中挖掘出有用的信息。但是,第一种方法中只能记录页面的访问请求,像ajax之类的请求是无法记录的,还有爬虫信息也不会记录,这就发挥了日志的作用,这些信息都在日志里面有所体现(日志文件一般在服务器文件夹下,名字是access.log)。
正常的日志长这样:
这样看起来很乱有木有?不易于阅读,因此在今天网上冲浪时٩(๑´0`๑)۶,发现了一个好用的日志格式化工具,日志格式化后长这样( ´´ิ∀´ ):
格式化工具地址:https://www.ludou.org/tool/logreader/index.php
是不是,更容易阅读了 (..•˘_˘•..)
如图中所示:
- 用户IP地址。如图中:192.144.130.41
- 访问时间。如图中:[04/May/2018:07:58:52 +0800]
- 请求方式。如图中:GET
- 请求url地址。如图中:/phpmyadmin2/index.php
- 请求状态码。如图中:404(找不到资源)301(重定向)
- 请求页面大小,默认为byte。如图中:5
- 用户系统信息。如图中:windows NT 5.1 就是 Windows xp,因为 Windows xp 的内核是 NT5.1,所以又称Windows xp为windows NT 5.1
- 来源页面,即从哪个页面转到本页,专业名称叫做“Referer”。如图中: "http://site.ru"(有的日志没有这个,我也不知道为什么)
- 用户浏览器语言。如:上例中的 "en-Us"
- 用户浏览器其他信息。如图中:"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4"
说明:access.log日志的格式不是一成不变的,是可以自定义的,本文不做赘述。
今天,在服务器查看了一下访问100次以上的ip,发现排行第一名的一个IP,竟然访问了我1W+次,哇塞,不是闲的没事干,就肯定是坏人!在扫描我的服务器漏洞。
用过的一些日志统计命令:
统计IP访问量(独立IP访问量):
awk '{print $1}' access.log | sort -n | uniq | wc -l
查看某一时间段的IP访问量(2-8点):
grep "03/May/2018:0[2-8]" 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.01' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100
查看访问最频的页面(前100):
awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100
查看访问最频的页面([排除php页面】(TOP100):
grep -v ".php" access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100
查看页面访问次数超过100次的页面:
cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
这几个主要用了awk(文本处理),sort(排序),grep(过滤文本),cat(输入文件内容)命令,命令组合使用,单个命令可以使用多次,来达到多重过滤的效果,前面一个命令的输出就是后一个命令的输入。
日志分割
随着天数的一天天增加,日志也会海量增长,所以为了方便管理,我们可以写一个脚本来帮助我们分担,具体功能是,每天0点切割日志,并以年月日命名日志文件并且删除30天之前的日志。
代码参考军哥的代码,具体代码如下:
- #!/bin/bash
- #function:cut nginx log files for lnmp v0.5 and v0.6
- #author: https://lnmp.org
- #设置nginx日志文件目录路径
- log_files_path="/home/wwwlogs/"
- #日志文件将会存放到/home/wwwlogs/年/月/日志文件名_年月日.log
- log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
- #设置要切割的日志的名字,如果日志目录下面的日志文件名为vpser.net.log,则填写vpser.net,每个日志名用空格分隔
- log_files_name=(access)
- #设置nginx文件的位置.
- nginx_sbin="/usr/local/nginx/sbin/nginx"
- #设置日志保存的时间,单位为天
- save_days=30
- ############################################
- #Please do not modify the following script #
- ############################################
- mkdir -p $log_files_dir
- log_files_num=${#log_files_name[@]}
- #cut nginx log files
- for((i=0;i<$log_files_num;i++));do
- mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
- done
- #delete 30 days ago nginx log files
- find $log_files_path -mtime +$save_days -exec rm -rf {} \;
- $nginx_sbin -s reload
脚本下载地址:http://soft.vpser.net/lnmp/ext/cut_nginx_logs.sh
首先要确保服务器上有crondtab(Crontab是一个Unix/Linux系统下的常用的定时执行工具,可以在无需人工干预的情况下运行指定作业。)
CentOS下面安装Crontab
yum install vixie-cron crontabs
//安装Crontab
chkconfig crond on
//设为开机自启动
service crond start
//启动
将nginx日志切割脚本下载到/root/下面。再添加自动执行,执行:crontab -e(进入vi编辑模式,编辑完成后,输入:wq保存退出)
输入:0 0 * * * /bin/bash /root/cut_nginx_logs.sh 每天0点整开始切割脚本。
可以先测试一下脚本
- 服务器输入脚本地址执行脚本,看是否按预期结果运行(可能会提示你无权限执行此脚本,输入
chmod +x /etc/nginx_access_log.sh
// +x赋予执行权限) crontab --l
//查看所有任务脚本chkconfig
//查看开机自启动服务systemctl is-enabled crond.service
//查看crond服务自启动状态systemctl enable crond.service
//开启crond.service自启动systemctl disable crond.service
//关闭crond.service自启动systemctl status crond.service
//查看crond.service状态systemctl start crond.service
//开启服务
最后需要注意的是:
1)注意被频繁访问的资源,如果返回状态码是200,可能那个资源就被盗用了。
2)注意返回状态码是404,403的请求,因为他可能在扫描你的网站漏洞。
3)出于SEO的话,可以留意一下蜘蛛的访问情况,在上面的格式化工具中会显示蜘蛛ip的备注名字,比如:Baiduspider 备注:百度蜘蛛。
扩展:
- 资源被盗用,可以做防盗链处理。
- 扫描网站漏洞,可以封禁其IP地址段,也可以封杀其来源页面。
完。