好久不写技术文章了,越发的觉得单纯的讲技术没啥意思。怪不得知乎越来越火,因为大家都喜欢看故事,不喜欢硬生生的技术文章。笔者今天就来就给大家讲故事:)
最近网站压力突然增大,把带宽都占满了,访问网页发现非常的慢,打开页面的速度也奇慢大概要十几秒。这种情况还是第一次遇到,感觉不是被攻击了就是被攻击了!下面是网站的流量截图,一共1M的带宽在15点左右的时候瞬间慢了,然后就是持续的在峰值左右徘徊。
当时的想法是莫非网站的访问量到达了一定程度要增加带宽了?可是通过看网站的统计数据,访问的人数并没有明显的增加。这时自己更加坚定一定是被攻击了!
SSH连上服务器查看日志,居然连SSH都特别慢,这让我更加坚定自己的判断,妈蛋绝对被攻击了!但是后台日志没有什么明显的错误信息。可是网站还是特别卡,一直持续了两个小时。一定是自己忽略了什么东西。既然是变慢,首先看CPU,内存啥的。于是查看了一下服务器的CPU和内存,没有啥问题,就是带宽变满了。看来是大量的访问造成的,又一次认真的查看了日志,这次看的是tomcat的access日志,这下发现了问题。很多页面在同一时间,或者说基本上在同一时间被访问了多次。
如果说整个日志中有那么几条是这种重复的倒还可以理解,可能是用户打不开页面触发了浏览器的刷新操作,但是大面积的都是这种重复的访问请求肯定就不正常了。检查了一下自己的前台代码看看是否是自己的JS写错了,导致客户端同一时间发起多次请求。检查了半天未果。
到这里问题算是找到了:多次请求导致带宽不够用。但是原因是什么呢?继续讲故事……
想到自己在配置网站的时候用到了Nginx做反向代理,突然就感觉会不会是Nginx的配置有什么问题呢?检查了一遍Nginx的配置,没发现啥问题,简单的转向再写错就不活了。莫非重复的请求本身不是服务器配置的问题?于是检查了Nginx的accesslog,令人惊讶的是在Nginx的log当中同样的是重复的访问情况。这就证明了不是我配置的问题,因为Access log足以证明在请求到达服务器之前就是多次请求。难道真的有人攻击?于是开始查找Nginx的log当中重复的IP,果然让我找到了一些重复的IP,这些IP都是72.21.217.*这个网段的。到这里我知道真相距离我越来越近了。去网上搜索的了一下这个网段的IP更是让我大吃一惊。
原来这些IP都是来自于亚马逊的爬虫,顿时恍然大悟,这一切都是因为前几天在网页上加上了亚马逊的广告。联系了亚马逊的客服人员,仔细询问了亚马逊是否会索引广告所在的页面,得到的回答是肯定的,到此为止一切真相大白。原来亚马逊为了提供更好的广告质量,索引了有广告的页面,造成的后果就是每当用户访问一个带有广告的页面他的蜘蛛就会爬取这个页面,所以网站压力肯定增大喽。
知道了原因下面就是采取措施来避免了,修改Nginx配置很轻松的屏蔽掉亚马逊的IP。
location /{ if ($http_x_forwarded_for ~ "72.21.217.*"){ return 503; } index index.jsp; proxy_pass http://127.0.0.1:8080; }
然后reload Nginx的配置,网站一切恢复如初。
总结:一切都有因果,任何事情绝不是凭空产生的,只要追根溯源耐心寻找就一定能找出事实的真相。