查询并禁止apache中异常访问量的用户
授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/331)的形式标明文章原始出处和作者信息及本声明。Apache中的异常访问,通常指的是频繁、大量访问的用户,通过apache的log,结合linux下的几个命令,可以分析这些用户,并通过apache的配置文件来禁止他们访问。
首先,更改apache的log方式,不记录一些图像、css等文件,这样在log中每一行基本上都能对应一次访问,如果不去除图像等文件的记录,正常用户访问一个页面,同时也会下载页面上的图像、css等文件,会产生多条log记录,影响计数的结果。在apache的conf文件中增加如下配置:
SetEnvIfNoCase Request_URI \.css$ useless-file
SetEnvIfNoCase Request_URI \.gif$ useless-file
SetEnvIfNoCase Request_URI \.ico$ useless-file
SetEnvIfNoCase Request_URI \.jpg$ useless-file
SetEnvIfNoCase Request_URI \.js$ useless-file
CustomLog logs/hebgc.com/access.log combined env=!useless-file
这样就可以了,关于SetEnvIf的其他用法,可以参见Apache文档中SetEnvIf和Environment Variables in Apache部分。
接下来,经过一段时间的运行,我们就可以分析log文件中访问量最大的用户了,只需要一条命令:
cat access.log |awk '{print $1}'| sort | uniq -c |sort -n
一点点的来看:
- cat就不用说了;
- awk的作用,就是把第一列,也就是客户端ip地址分拣出来;
- 第一个sort,是把分拣出来的ip地址排序,这样相同的ip地址会排在一起
- uniq是一个去除重复值的工具,但是带上-c参数,就可以统计出每个值出现了多少次
- 最后的sort,把uniq产生的结果进行排序,按照-n这个参数的默认设置,最大的排在最下面。
所以,我们得到的结果应该是这样的:
......
2040 219.148.106.198
2047 218.12.78.14
2149 218.12.26.233
2205 121.28.4.34
第一列就是访问次数,第二列是ip地址,再回去对照log文件中的详细内容,如果发现哪个访问量大户是某某机器人的话,就可以禁止掉了,还是修改apache的conf文件:
<Directory />
Order Deny,Allow
Deny from 219.143.69.2
Deny from 218.12.26.233
Deny from 61.135.162.51
Allow from all
</Directory>
如此反复监测、设置,直到没有人捣乱为止。
同理,如果想查看反复刷新查看某一页面的用户,可以用如下命令:
grep "GET /url/to/some/file" access.log |awk '{print $1}' |sort |uniq -c |sort -n
No tags for this post.

Save to Browser Favorites
Ask
backflip
blinklist
BlogBookmark
Bloglines
BlogMarks
Blogsvine
BUMPzee!
CiteULike
co.mments
Connotea
del.icio.us
DotNetKicks
Digg
diigo
dropjack.com
dzone
Facebook
Fark
Faves
Feed Me Links
Friendsite
folkd.com
Furl
Google
Hugg
Jeqq
Kaboodle
linkaGoGo
LinksMarker
Ma.gnolia
Mister Wong
Mixx
MySpace
MyWeb
Netvouz
Newsvine
PlugIM
popcurrent
Propeller
Reddit
Rojo
Segnalo
Shoutwire
Simpy
sk*rt
Slashdot
Sphere
Sphinn
Spurl.net
Squidoo
StumbleUpon
Technorati
ThisNext
Webride
Windows Live
Yahoo!
Email This to a Friend
If you like this then please subscribe to the
June 15th, 2007 at 9:20:46
没又是一篇让我受益而且尝试之后确实有用的文章。谢谢
我建议最后的 sort用 sort -nr 这样访问最大的网站排在前面。配合 |less ,使用起来更方便。
在man sort中说了 -n 是以数字顺序排列,-r是反向排列(reverse)
特别喜欢你对awk的解释。一直没明白
推荐你看看 howtoforge.com 有些对你会有帮助。
希望你坚持。将来也有个中文的howtoforge。hehe
[Reply]
June 16th, 2007 at 1:23:32
谢谢补充,
howtoforge我也看过,
里面的文章还是非常浅显的,不错的网站。
[Reply]
July 11th, 2007 at 17:48:55
很好的方法,转了,非常感谢
[Reply]
September 13th, 2007 at 14:34:33
小站的话我就直接用限制并发和带宽的模块和Apache一起工作,
如果是扫描等大流量的话 可以用Portsentry等方式
而大网站的话 程序解决,而awstats等来做数据分析再解决也简单.
如果在apache上做Deny的话,效率很大折扣
[Reply]
February 28th, 2008 at 0:37:31
SetEnvIfNoCase Request_URI “.(gif)|(jpg)|(png)|(css)|(js)|(ico)$” uselessfile
[Reply]