背景描述:9.28號中午網站突然打不開了,后台打不開了,app登錄不上了,用戶的各種反饋都來了 ,各個部門的同事 都找到技術反應問題了!一打開網頁就502了;
(心里有一萬頭羊駝奔騰而過,快放假了,這是不讓我過好這個假期了?)
根據經驗 肯定是服務器或者數據庫運行不正常導致的,首先登錄服務器一切參數正常,沒有問題,登錄數據庫 發現 cpu 占用了100% ;
問題找到了,數據庫的問題,但是現在也不是旺季為什么cpu占用這么高,而iops幾乎為0;
目測應該是高並發為處理完成,造成數據長久連接太多導致的,發現有1300多的連接數,太多了,並且發現了大量的待執行的 sql命令那就是 update app_sms set status=1 where ......
這個數據表是 發送短信的 接口才會調用的;難道是發送短信的接口有問題了,后來又去查看nginx日志分析 發現有大量的高並發 去訪問 發送短信的 鏈接;
這個時候立刻停止對短信接口的訪問,只能暴利接口把短信接口更改一個名字;如果再次訪問時 就會返回404;同樣正常用戶也不能訪問了;但是也么有特別好的方法,只能先這么處理
接下來就把數據庫為執行的sql全部kill掉;一切恢復正常了;接下來就是在發送短信的接口上做了一個ip的限制,每天每個ip最多只能發送10個驗證碼;目測安然無恙,但是我心里知道這並沒有結束;
10.8日假期結束恢復正常上班了,上班的第一件事情就是 打開服務器,打開數據庫 查看參數正常;妥妥的沒問題;
但是好日子到頭了,在10.15號時候,我手機上連續發來6條服務器cpu占用資源過高的 提醒;我心里一想壞了,肯定又是那個接口出問題了;
打開電腦直奔數據庫服務器查看后 一切正常,接下來打開服務器發現運行參數也正常,cpu趙勇60%左右也不算過高,在正常范圍之內;查來查來都沒有問題,但是打開網站時總是提示502 要么就是打開很慢;
這時候我就懵逼了,為啥各個運行參數正常,就是打開這么慢呢,到底是什么地方出現了問題呢,無意中我發現,帶寬;被占用滿了;典型的 ddos攻擊;沒辦法了還是老樣子 又把短信接口改了,立刻就恢復正常了;
10.16日,領導來了召開緊急會議要立刻修復;網上也搜過好多方法大概是以下幾種方法
1.添加防火牆;(由於價格太貴放棄了)
2.更換域名,發現被攻擊后,立刻解析到其他域名上,把被攻擊的域名停止解析(由於需要人工操作,且dns解析與停止不是實時的需要時間)
3.在nginx中攔截cc攻擊
最終討論方法是在nginx中攔截
下面說一下原理
由ios,android端 寫一個對稱加密算法且吧時間戳也加密進去;作為 user-agent 來訪問 服務器的接口,然后在nginx中 去解密這個user-agent來檢驗這個加密字符串是否合法或者是否過期;如果是合法的則去調用php-fpm運行程序,如果不合法則直接返回403;
那么問題了來了 如何在nginx攔截cc攻擊了,也就說如何在nginx中編程了,我一個php程序員肯定不會;這個時候需要引入一個lua控件;
單獨安裝lua插件太麻煩了,后來直接安裝了 openresty 直接在openresty中 編寫lua腳本,成功防御了cc攻擊