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上一段時間,從使用的情況來看,效果還比較不錯。