經過前面的配置,如果主服務器的keepalived停止服務,從服務器會自動接管VIP對外服務;一旦主服務器的keepalived恢復,會重新接管VIP。 但這並不是我們需要的,我們需要的是當NginX停止服務的時候能夠自動切換。
keepalived支持配置監控腳本,我們可以通過腳本監控NginX的狀態,如果狀態不正常則進行一系列的操作,最終仍不能恢復NginX則殺掉keepalived,使得從服務器能夠接管服務。
如何監控NginX的狀態
最簡單的做法是監控NginX進程,更靠譜的做法是檢查NginX端口,最靠譜的做法是檢查多個url能否獲取到頁面。
如何嘗試恢復服務
如果發現NginX不正常,重啟之。等待3秒再次校驗,仍然失敗則不再嘗試。
根據上述策略很容易寫出監控腳本。這里使用nmap檢查nginx端口來判斷nginx的狀態,記得要首先安裝nmap。監控腳本如下:
#!/bin/bash
# check nginx server status
NGINX=/usr/local/nginx/sbin/nginx
PORT=8080
nmap localhost -p $PORT | grep "$PORT/tcp open"
#echo $?
if [ $? -ne 0 ];then
$NGINX -s stop
$NGINX
sleep 3
nmap localhost -p $PORT | grep "$PORT/tcp open"
[ $? -ne 0 ] && /etc/init.d/keepalived stop
fi
不要忘了設置腳本的執行權限,否則不起作用。
假設上述腳本放在/opt/chk_nginx.sh,則keepalived.conf中增加如下配置:
主keepalived
vrrp_script chk_http_port {
script "/opt/chk_nginx.sh"
interval 1
weight -2
}
track_script {
chk_http_port
}
例子:
! Configuration File for keepalived
global_defs {
router_id NGINX_UPSTEAM
}
vrrp_script chk_http_port {
script "/opt/chk_nginx.sh"
interval 1
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_http_port
}
}
更進一步,為了避免啟動keepalived之前沒有啟動nginx , 可以在/etc/init.d/keepalived的start中首先啟動nginx:
start() {
/usr/local/nginx/sbin/nginx
sleep 3
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
}