如何實現(xiàn)Nginx+Keepalived中Nginx進程的高可用
此架構我簡單說明下:
一般為了維護方便,企業(yè)網(wǎng)站的服務器都在自己的內部機房里,只開放了Keepalived的VIP地址的兩個端口80、443,通過Juniper SSG550防火墻映射出去,外網(wǎng)DNS對應映射后的公網(wǎng)IP。此架構的防火墻及網(wǎng)絡安全說明如下:此系統(tǒng)架構僅映射內網(wǎng)VIP的80及443端口于外網(wǎng)的Juniper SSG550防火墻下,其他端口均關閉,內網(wǎng)所有機器均關閉iptables及ipfw防火墻;外網(wǎng)DNS指向即通過Juniper或華賽USG5000映射出來的外網(wǎng)地址。本節(jié)內容出自我的項目方案,這種負載均衡方式同時也應用于我公司的電子商務網(wǎng)站中,目前已穩(wěn)定上線一年多了。通過下面的內容,大家可以迅速架構一個企業(yè)級 的負載均衡高可用的Web環(huán)境。在負載均衡高可用技術上,我一直主力推崇以Nginx+Keepalived作Web的負載均衡高可用架構,并積極將其應 用于真實項目中,此架構極適合靈活穩(wěn)定的環(huán)境。Nginx負載均衡作服務器遇到的故障一般有:服務器網(wǎng)線松動等網(wǎng)絡故障;服務器硬件故障發(fā)生損壞現(xiàn)象而crash;Nginx服務進程死掉(這種情況理論上會遇到,但事實上我線上的服務器沒有出現(xiàn)過這種情況,足以證明了Nginx作為負載均衡器/反向代理服務器的穩(wěn)定性,我們可以通過技術手段來解決這一問題);
具體實施步驟如下:
一、安裝和配置Nginx及Keepalived,沒什么技術含量,大家可以參考我的專題系列的文章,如下地址http://network.51cto.com/art/201007/209823.htm。
while :
do
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 5
nginxpid=`ps -C nginx --no-header | wc -l`
echo $nginxpid
if [ $nginxpid -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
sleep 5
done
我稍為解釋一下,這是一個無限循環(huán)的腳本,放在主Nginx機器上(因為目前主要 是由它提供服務),每隔5秒執(zhí)行一次,用ps -C 命令來收集nginx的PID值到底是否為0,如果是0的話(即Nginx進程死掉了),嘗試啟動nginx進程;如果繼續(xù)為0,即nginx啟動失改, 則關閉本機的Keeplaived進程,VIP地址則會由備機接管,當然了,整個網(wǎng)站就會由備機的Nginx來提供服務了,這樣保證Nginx進程的高可用。
當然還有別的辦法,比如我們可以寫另外的SHELL腳本,每隔5秒wget首頁的index.php或index.jsp文件或ping網(wǎng)站的VIP地 址,如果$?返回碼為非零值(即錯誤),我們也可以關閉主Nginx機器,由備機接管,有興趣的朋友可以自行編寫這些腳本。