使用Keepalived+Nginx實現Nginx高可用的負載均衡

接上一文章<<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: /etc/init.d/keepalived start
  • 在主服務器上查看是否已經綁定了虛擬IP: ip addr
  • 中止主服務器上的keepalived: /etc/init.d/keepalived stop 而後在從服務器上查看是否已經綁定了虛擬IP:
  • 啓動主服務器上的keepalived,看看主服務器可否從新接管虛擬IP

讓keepalived監控NginX的狀態

通過前面的配置,若是主服務器的keepalived中止服務,從服務器會自動接管VIP對外服務;一旦主服務器的keepalived恢復,會從新接管VIP。 但這並非咱們須要的,咱們須要的是當NginX中止服務的時候可以自動切換。

keepalived支持配置監控腳本,咱們能夠經過腳本監控NginX的狀態,若是狀態不正常則進行一系列的操做,最終仍不能恢復NginX則殺掉keepalived,使得從服務器可以接管服務。

  • 如何監控NginX的狀態

最簡單的作法是監控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

相關文章
相關標籤/搜索