好久不写技术文章了,越发的认为单纯的讲技术没啥意思。怪不得知乎越来越火。由于大家都喜欢看故事。不喜欢硬生生的技术文章。笔者今天就来就给大家讲故事:)
近期站点压力突然增大,把带宽都占满了,訪问网页发现非常的慢。打开页面的速度也奇慢大概要十几秒。
这样的情况还是第一次遇到。感觉不是被攻击了就是被攻击了!以下是站点的流量截图,一共1M的带宽在15点左右的时候瞬间慢了。然后就是持续的在峰值左右徘徊。
当时的想法是莫非站点的訪问量到达了一定程度要添加带宽了?可是通过看站点的统计数据,訪问的人数并没有明显的添加。这时自己更加坚定一定是被攻击了!
SSH连上server查看日志,竟然连SSH都特别慢。这让我更加坚定自己的推断,妈蛋绝对被攻击了。可是后台日志没有什么明显的错误信息。可是站点还是特别卡,一直持续了两个小时。一定是自己忽略了什么东西。既然是变慢。首先看CPU,内存啥的。于是查看了一下server的CPU和内存,没有啥问题,就是带宽变满了。
看来是大量的訪问造成的。重新认真的查看了日志,这次看的是tomcat的access日志,这下发现了问题。非常多页面在同一时间。或者说基本上在同一时间被訪问了多次。
假设说整个日志中有那么几条是这样的反复的倒还能够理解,可能是用户打不开页面触发了浏览器的刷新操作,可是大面积的都是这样的反复的訪问请求肯定就不正常了。
检查了一下自己的前台代码看看是否是自己的JS写错了,导致client同一时间发起多次请求。
检查了半天未果。
到这里问题算是找到了:多次请求导致带宽不够用。可是原因是什么呢?继续讲故事……
想到自己在配置站点的时候用到了Nginx做反向代理,突然就感觉会不会是Nginx的配置有什么问题呢?检查了一遍Nginx的配置,没发现啥问题。简单的转向再写错就不活了。莫非反复的请求本身不是server配置的问题?于是检查了Nginx的accesslog,令人吃惊的是在Nginx的log其中相同的是反复的訪问情况。
这就证明了不是我配置的问题,由于Access log足以证明在请求到达server之前就是多次请求。难道真的有人攻击?于是開始查找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的配置,站点一切恢复如初。
总结:一切都有因果,不论什么事情绝不是凭空产生的,仅仅要追根溯源耐心寻找就一定能找出事实的真相。