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