废话不多说,直接上这个实例:
一. 统计apache日志单ip访问请求数排名:
假设apache日志内容access.log内容为:
1 10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 2 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 3 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 4 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 5 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 6 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 7 10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 8 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 9 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 - 10 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
一般的做法是:
1 [root@localhost /]# awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1 2 3 10.0.0.41 3 2 10.0.0.47 4 2 10.0.0.46 5 2 10.0.0.42 6 1 10.0.0.43
一直在思考 统计IP最多的数的意义何在?
其实,一般单个IP访问数量过百,就值得怀疑了,如果短时间内上万PV访问,说明就不正常了,可以采取相应的处理手段,比如封掉此IP,此法要慎重,否则,可能会有误封问
题,因为,国内的大多数公司还是NAT上网的,出口一个IP。
二. 统计服务器当前单IP连接数最大的IP地址前十
使用netstat -an >>test.log 可以将连接到服务器的一些基本信息重定向到文本文件中,假设内容如下:
1 Active Internet connections (w/o servers) 2 Proto Recv-Q Send-Q Local AddressForeign AddressState 3 tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV 4 tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV 5 tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV 6 tcp00 124.123.3.77:80121.31.42.148:2338TIME_WAIT 7 tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1 8 tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT 9 tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1 10 tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT 11 tcp01 124.123.3.77:8059.49.174.176:26913CLOSING 12 tcp00 124.123.3.77:80121.31.42.148:1787TIME_WAIT 13 tcp0174 124.123.3.77:80183.8.74.57:1165CLOSING
使用awk可以统计出ESTABLISHED的一些IP的链接信息:
netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2 注意,这里过滤的是已经建立连接的的连接,即状态ESTABLISHED。
两种案例的反思:
对于命令结果中,单IP结尾的数大的,可以认为是不正常的访问。如 121.31.42.148 100 ,表示一个IP有100个连接
一般来说可以怀疑不正常,当网站压力大时,可以考虑限制或封掉这些冒似非法IP,当然,也不排除,企业里多个用户用一个出口IP访问。
壮士扼腕,有时也是必须的,否则,可能网站整体影响更大,甚至瘫痪。有时,各种搜索引擎的爬虫是很疯狂的,通过本例及上面的案例,我们可以再负载IO高时,能够进行临
时应对,当然,这不是长久的方法,优化网络和服务器,部署大规模集群服务器才是较好的解决之道。
我们可以使用awk进行简单地统计线上服务器的一些负载,保证服务器的高效运行。