標題:Nginx+Keepalived高可用負載均衡雙機熱備
(圖畫的有點難看....)
- #添加運行nginx的用戶和組www
- groupadd www
- useradd -g www www
- wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz
- tar zxvf pcre-7.8.tar.gz
- cd pcre-7.8/
- ./configure
- make && make install
- wget http://sysoev.ru/nginx/nginx-0.7.51.tar.gz
- tar zxvf nginx-0.7.51.tar.gz
- cd nginx-0.7.51/
- ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
- make && make install
三:安裝keepalived
- wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
- tar zxvf keepalived-1.1.15.tar.gz
- cd keepalived-1.1.15
- ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux(這裏爲什麼做軟鏈接後面說!)
- ./configure --prefix=/usr --exec-prefix=/usr \
--bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \
--includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec \
--localstatedir=/var --mandir=/usr/share/man --infodir=/usr/share/info \
--sharedstatedir=/usr/com \
--with-kernel-dir=/usr/src/linux(這裏指定的是軟鏈接路徑!!) - make
- make install
- 啓動nginx!/usr/local/nginx/sbin/nginx
四:配置keepalived.conf
1,MASTER 的keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #發送email 的地址
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port { #執行監控的服務
script "/tmp/dd.sh" #監控的腳本(腳本在下文寫,詳情見下文)
interval 2 #監控的時間
weight 2
}
vrrp_instance VI_1 {
state MASTER #設置爲主
interface eth0 #監控的網卡
virtual_router_id 51i #暫時不知道什麼,但是這個兩臺服務器必須一樣!!!
mcast_src_ip 192.168.126.173 #主nginx地址
priority 150 #優先級,優先級MASTRE一定要高於BAUCKUP(其實叫權重值)
advert_int 1
authentication {
auth_type PASS #加密
auth_pass 1111 #加密的密碼,兩臺服務器一定要一樣!!!
}
virtual_ipaddress {
192.168.200.16 #VIP地址,就是本對應的虛擬IP,ip addr可以查看到
}
}
2,BACKUP keepalived.conf(這裏我就不解釋參數了!)
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/tmp/dd.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 192.168.126.176
priority 100 # 記住keepalived是根據這裏來判斷MASTER還是BACKUP!
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
}
}
/etc/init.d/keepalived start !
爲什麼我編譯keepalived之前要做一個內核的軟鏈接呢?因爲之前我編譯的時候指定系統默認的內核文件,結果最後安裝完畢之後ps -ef | grep keepalived ,顯示只有兩個進程,但是正常情況下應該有3個keepalived的進程纔對!
查閱相關資料,是因爲當前linux系統未指定內核文件,可是我係統有啊,我就做了一個軟鏈接,ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux,重新編譯一下。有3個進程在跑了!
[root@localhost tmp]# ps -ef | grep keepalived
root 17708 1 0 12:18 ? 00:00:00 keepalived -D
root 17709 17708 0 12:18 ? 00:00:00 keepalived -D
root 17710 17708 0 12:18 ? 00:00:00 keepalived -D
root 17756 2490 0 15:51 pts/2 00:00:00 grep keepalived
關鍵:
!爲什麼這裏要 指定監控的腳本呢?script "/tmp/dd.sh" !! 監控的腳本非常的關鍵!!!
keepalived本身的不足,只有服務器當keepalived down了的時候,BACKUP纔會去接管,但是當nginx死了之後,keepalived是不知道nginx死了,所以寫一個腳本讓keepalived去檢測nginx的存活狀態然後去停掉自己的主keepalived!這樣BACKUP纔會去接管!
cat /tmp/dd.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
then
/usr/local/nginx/sbin/nginx
sleep 1
if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
then
killall keepalived
fi
fi
五,監控一下Nginx Mastaer 的日誌
監控一下Nginx Backup 正常,就不貼出來了。
六。測試
現在停掉Nginx Mastaer上的nginx...Nginx Backup腳本檢測到nginx死了,就接管了Nginx Mastaer。我們來看一看日誌~ tail -f /var/log/messages
很顯然可以看出backup已經變成master!!
現在再啓動原來master的nginx,再查看backup的日誌
很顯然可以看出backup 自動叫交出了老大的權利,重現變爲backup了!