接上一文章<<CentOS 6.5高可用集羣LVS+Keepalived>>html
本文主要是配置Nginx、Keeplive,至於Nginx的配置就省略了nginx
一、服務器規劃bash
服務器IP 服務服務器
192.168.80.77 VIPtcp
192.168.80.188 Keepalived(Master)、Nginx(Backup)oop
192.168.80.189 Keepalived(Slave)、Nginx(Backup)url
二、目標spa
全部的請求都經過1.77虛擬服務轉發給1.188服務器,而189做爲188的備份,當188服務掛掉了,自動切換到189.net
三、Nginx配置code
安裝省略......,Nginx 安裝目錄:/usr/local/nginx
1) 18八、189配置index.html來區分是哪臺nginx工做:
在188上配置:
echo "192.168.80.188" > /usr/local/nginx/html/index.html
在189上配置
echo "192.168.80.189" > /usr/local/nginx/html/index.html
驗證方法:
1)、首先用IP訪問各自的nginx,看index.html頁面內容是否爲當前服務器的IP地址
二、 配置keepalived
按照上面的安裝方法,keepalived的配置文件在/etc/keepalived/keepalived.conf。主、從服務器的配置相關聯但有所不一樣。以下:
Master:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_MASTER } 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.80.77 } } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
Backup:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
驗證:
通過前面的配置,若是主服務器的keepalived中止服務,從服務器會自動接管VIP對外服務;一旦主服務器的keepalived恢復,會從新接管VIP。 但這並非咱們須要的,咱們須要的是當NginX中止服務的時候可以自動切換。
keepalived支持配置監控腳本,咱們能夠經過腳本監控NginX的狀態,若是狀態不正常則進行一系列的操做,最終仍不能恢復NginX則殺掉keepalived,使得從服務器可以接管服務。
最簡單的作法是監控NginX進程,更靠譜的作法是檢查NginX端口,最靠譜的作法是檢查多個url可否獲取到頁面。
若是發現NginX不正常,重啓之。等待3秒再次校驗,仍然失敗則再也不嘗試。
根據上述策略很容易寫出監控腳本。這裏使用nmap檢查nginx端口來判斷nginx的狀態,記得要首先安裝nmap。監控腳本以下:
#!/bin/sh # check nginx server status NGINX=/usr/local/nginx/sbin/nginx PORT=80 nmap 127.0.0.1 -p $PORT | grep "$PORT/tcp open" #echo $? if [ $? -ne 0 ];then #$NGINX -s stop $NGINX sleep 3 nmap 127.0.0.1 -p $PORT | grep "$PORT/tcp open" #[ $? -ne 0 ] && /etc/init.d/keepalived stop [ $? -ne 0 ] && killall keepalived fi
不要忘了設置腳本的執行權限,不然不起做用。
假設上述腳本放在/usr/local/nginx/chk_nginx.sh,則keepalived.conf中增長以下配置:
vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } track_script { chk_http_port }
增長完成後的配置以下:
Master:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_MASTER } 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.80.77 } track_script { chk_http_port } } vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
Backup:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.80.77 } track_script { chk_http_port } } vrrp_script chk_http_port { script "/usr/local/nginx/chk_nginx.sh" interval 2 weight 2 } virtual_server 192.168.80.77 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.80.188 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.80.189 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
更進一步,爲了不啓動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 }
參考:http://www.cnblogs.com/holbrook/archive/2012/10/25/2738475.html#sec-5