初识服务器访问日志

2018年5月5日10:17:17 发表评论 阅读(3,192)
摘要

服务器访问日志,顾名思义,所有ip访问你服务器留下的记录。就像人一样,你只有了解了自己,一方面你可以更好的驾驭自己的情绪,一方面这是对自己负责的表现。同理,了解一下服务器日志,你可以知道,该怎样规避一些漏洞,使网站获得更大的安全保障,这是一件有意义的事情。

为了了解自己网站的访问情况,我所了解到的有两种办法,一种是使用cnzz等第三方服务商提供的代码,放置在网站通用位置,通过用户访问的时候触发js,记录访问请求。另一种就是通过分析服务器日志文件,从数据中挖掘出有用的信息。但是,第一种方法中只能记录页面的访问请求,像ajax之类的请求是无法记录的,还有爬虫信息也不会记录,这就发挥了日志的作用,这些信息都在日志里面有所体现(日志文件一般在服务器文件夹下,名字是access.log)。

正常的日志长这样:

初识服务器访问日志

这样看起来很乱有木有?不易于阅读,因此在今天网上冲浪时٩(๑´0`๑)۶,发现了一个好用的日志格式化工具,日志格式化后长这样( ´´ิ∀´ ):

初识服务器访问日志

格式化工具地址:https://www.ludou.org/tool/logreader/index.php

是不是,更容易阅读了 (..•˘_˘•..)

如图中所示:

  1. 用户IP地址。如图中:192.144.130.41
  2. 访问时间。如图中:[04/May/2018:07:58:52 +0800]
  3. 请求方式。如图中:GET
  4. 请求url地址。如图中:/phpmyadmin2/index.php
  5. 请求状态码。如图中:404(找不到资源)301(重定向)
  6. 请求页面大小,默认为byte。如图中:5
  7. 用户系统信息。如图中:windows NT 5.1 就是 Windows xp,因为 Windows xp 的内核是 NT5.1,所以又称Windows xp为windows NT 5.1
  8. 来源页面,即从哪个页面转到本页,专业名称叫做“Referer”。如图中: "http://site.ru"(有的日志没有这个,我也不知道为什么)
  9. 用户浏览器语言。如:上例中的 "en-Us"
  10. 用户浏览器其他信息。如图中:"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天之前的日志。

代码参考军哥的代码,具体代码如下:

  1. #!/bin/bash
  2. #function:cut nginx log files for lnmp v0.5 and v0.6
  3. #author: https://lnmp.org
  4. #设置nginx日志文件目录路径
  5. log_files_path="/home/wwwlogs/"
  6. #日志文件将会存放到/home/wwwlogs/年/月/日志文件名_年月日.log
  7. log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
  8. #设置要切割的日志的名字,如果日志目录下面的日志文件名为vpser.net.log,则填写vpser.net,每个日志名用空格分隔
  9. log_files_name=(access)
  10. #设置nginx文件的位置.
  11. nginx_sbin="/usr/local/nginx/sbin/nginx"
  12. #设置日志保存的时间,单位为天
  13. save_days=30
  14. ############################################
  15. #Please do not modify the following script #
  16. ############################################
  17. mkdir -p $log_files_dir
  18. log_files_num=${#log_files_name[@]}
  19. #cut nginx log files
  20. for((i=0;i<$log_files_num;i++));do
  21. mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
  22. done
  23. #delete 30 days ago nginx log files
  24. find $log_files_path -mtime +$save_days -exec rm -rf {} \;
  25. $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点整开始切割脚本。

可以先测试一下脚本

  1. 服务器输入脚本地址执行脚本,看是否按预期结果运行(可能会提示你无权限执行此脚本,输入chmod +x /etc/nginx_access_log.sh// +x赋予执行权限
  2. crontab --l //查看所有任务脚本
  3. chkconfig //查看开机自启动服务
  4. systemctl is-enabled crond.service //查看crond服务自启动状态
  5. systemctl enable crond.service//开启crond.service自启动
  6. systemctl disable crond.service//关闭crond.service自启动
  7. systemctl status crond.service//查看crond.service状态
  8. systemctl start crond.service//开启服务

最后需要注意的是:

1)注意被频繁访问的资源,如果返回状态码是200,可能那个资源就被盗用了。

2)注意返回状态码是404,403的请求,因为他可能在扫描你的网站漏洞。

3)出于SEO的话,可以留意一下蜘蛛的访问情况,在上面的格式化工具中会显示蜘蛛ip的备注名字,比如:Baiduspider 备注:百度蜘蛛。

扩展:

  1. 资源被盗用,可以做防盗链处理。
  2. 扫描网站漏洞,可以封禁其IP地址段,也可以封杀其来源页面。

 

完。


 

weinxin
微信小程序
互联网开发,终身学习者,欢迎您的关注!
舍得

发表评论

不高兴 彩虹 吃瓜 丢翔 乖 滑稽 花心 惊哭 惊讶 挤眼 酷 伤心 帅吗? 礼物 玫瑰 怒 生气 喷 睡觉 太开心 小九九 啊
太阳 吐舌 委屈 笑眼 星星月亮 心碎 咦 阴险 疑问 真棒 偷笑 斜眼笑 震惊 略 哈欠 无奈哭 抠鼻 哼 期待 懒得理你 爱心 蜡烛