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