VPS其實和一般的獨立Linux伺服器,在使用上基本沒有區別,因為現在的虛擬化技術以及很成熟了,不過VPS和獨服還是有一個很大的差異,那就是系統資源和效能上。通常,VPS都是由一個獨立伺服器劃分出來的,所以在資源和效能優勢上,遠比不上獨服。
就拿前段時間本VPS受到的DDOS攻擊來說,其實DDOS也是利用大量發起的請求,導致被攻擊VPS(或伺服器)記憶體資源被耗盡,系統負載過高,而導致80連接埠的Http服務無響應,從而達到最終的攻擊目的。DDOS雖然防不勝防,不過總還是有一些辦法,能把DDOS的影響減小的。比如定時監控系統狀態,然後自動重啟Web服務,這也是本文要介紹的一種方法。
在VPS被攻擊的時候,有一些系統指標能反應出系統是否處於被攻擊狀態,一個就是查看記憶體剩餘量,當然,這並不是最準確的方法,另外一種,就是查看Linux的系統平均負載值。
Linux系統負載介紹
系統平均負載被定義為在特定時間間隔內運行隊列中的平均進程樹。如果一個進程滿足以下條件則其就會位於運行隊列中:
- 它沒有在等待I/O操作的結果
- 它沒有主動進入等待狀態(也就是沒有調用’wait’)
- 沒有被停止(例如:等待終止)
Linux系統中,通過很多命令都可以查看當前的系統平均負載值,比如:w,top或者uptime命令
命令輸出的內容表示在過去的1、5、15分鐘內運行隊列中的平均進程數量。
通常情況下,這些值會根據系統的CPU個數有一些區別,對於單核CPU來說,如果負載值達到了1,表明系統負載已經達到了100%,不過對於雙核系統來說,1隻表示系統負載值只達到50%左右。
以此類推,在多處理器系統中,負載均值是基於核心的數量決定的。以 100% 負載計算,1.00 表示單個處理器,而 2.00 則說明有兩個雙處理器,那麼 4.00 就說明主機具有四個處理器。
根據系統負載值自動重啟Web服務
下面的指令碼,以裝有Apache伺服器的VPS為例,定時判斷系統負載值,當達到5時,認為系統已經超負荷運轉,這時,指令碼會自動重啟Apache服務,釋放系統資源,以達到讓VPS伺服器平穩啟動並執行目的。
*註:指令碼來自網路,非原創,出處不明,本人做了少許改動。
#!/bin/sh #usage: */2 * * * * root /root/checkload.sh >>/root/checkload.log TOP_SYS_LOAD_NUM=5 SYS_LOAD_NUM=`uptime | awk ‘{print $(NF-2)}’ | sed ‘s/,//’` echo $(date +”%y-%m-%d”) `uptime` if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ] then echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “pkill httpd” `ps -ef | grep httpd | wc -l` pkill httpd sleep 10 for i in 1 2 3 do if [ `pgrep httpd | wc -l` -le 0 ] then service httpd start sleep 15 echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start httpd” `ps -ef | grep httpd | wc -l` fi done else if [ `pgrep httpd | wc -l` -le 0 ] then service httpd start sleep 15 echo “AutoStart:” $(date +”%y-%m-%d %H:%M:%S”) “start httpd” `ps -ef | grep httpd | wc -l` fi fi |
指令碼中TOP_SYS_LOAD_NUM表示最大允許的系統平均負載值,當超過這一值的時候,指令碼就開始重啟apache服務。指令碼的使用也挺簡便,直接到/etc/cron.d/ 建立一個定時執行檔案,填入如下內容即可:
| */2 * * * * root /root/checkload.sh >>/root/checkload.log |
這裡*/2,表示每兩分鐘執行一次指定的指令碼,並將執行結果輸出到/root/checkload.log檔案中。
你也可以根據自己的需要,來修改執行頻率。
小結
此指令碼已經部署到我的VPS上一段時間,從使用的情況來看,效果還比較不錯