天天看點

nginx+keepalived主輔切換

環境

Server 1  :  ubuntu-server 8.04.4          192.168.6.162

Server 2  :  userver-server 8.04.4          192.168.6.188

軟體

Keepalived 1.1.15

nginx-0.8.35

pcre-8.02

1.分别在兩台伺服器上安裝nginx

tar jxvf pcre-8.02.tar.bz2 

cd pcre-8.02 

./configure --prefix=/usr --enable-utf8 --enable-pcregrep-libbz2 --enable-pcregrep-libz 

make 

make install 

tar zxvf nginx-0.8.35.tar.gz 

cd nginx-0.8.35 

--prefix=/usr/local/nginx --with-pcre --user=www --group=www --with-file-aio --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-cc-opt=' -O3' 

make install

2.分别在兩台伺服器編寫配置檔案

vim /usr/local/nginx/conf/nginx.conf 

user    www www; 

worker_processes    1; 

error_log    logs/error.log    notice; 

pid                logs/nginx.pid; 

events { 

        worker_connections    1024; 

http { 

        include             mime.types; 

        default_type    application/octet-stream; 

        sendfile                on; 

        tcp_nopush         on; 

        keepalive_timeout    65; 

        gzip    on; 

        server { 

                listen             80; 

                server_name    localhost; 

                index     index.html index.htm; 

                root        /var/www; 

                error_page     500 502 503 504    /50x.html; 

                location = /50x.html { 

                        root     html; 

                } 

        } 

3.分别在兩台機器建立測試檔案

echo "192.168.6.162" > /var/www/index.html 

echo "192.168.6.188" > /var/www/index.html

4.安裝 keepalived 

apt-get install keepalived

5.在server 1伺服器編寫配置檔案

vrrp_script chk_http_port { 

                script "/opt/nginx_pid.sh"         ###監控腳本 

                interval 2                             ###監控時間 

                weight 2                                ###目前搞不清楚 

vrrp_instance VI_1 { 

        state MASTER                            ### 設定為 主 

        interface eth0                             ### 監控網卡    

        virtual_router_id 51                    ### 這個兩台伺服器必須一樣 

        priority 101                                 ### 權重值 MASTRE 一定要高于 BAUCKUP 

        authentication { 

                     auth_type PASS             ### 加密 

                     auth_pass eric                ### 加密的密碼,兩台伺服器一定要一樣,不然會出錯 

        track_script { 

                chk_http_port                     ### 執行監控的服務 

        virtual_ipaddress { 

             192.168.6.7                            ###    VIP 位址 

6.在 server 2 伺服器 keepalived 配置

                script "/opt/nginx_pid.sh" 

                interval 2 

                weight 2 

        state BACKUP                                ### 設定為 輔機 

        interface eth0 

        virtual_router_id 51                        ### 與 MASTRE 設定 值一樣 

        priority 100                                     ### 比 MASTRE權重值 低 

                     auth_type PASS 

                     auth_pass eric                    ### 密碼 與 MASTRE 一樣 

                chk_http_port 

                 192.168.6.7 

}

7.編寫監控nginx監控腳本

vim /opt/nginx_pid.sh 

#!/bin/bash

# varsion 0.0.2

# 根據一網友說這樣做不科學,如果nginx服務起來了,但是我把keepalived 殺掉了,我的理由是,如果nginx死掉了,我覺得就很難在起來,再有就是nagios 當然要給你報警了啊。不過這位同學說的有道理,是以就稍加改了一下腳本

A=`ps -C nginx --no-header |wc -l`                ## 檢視是否有 nginx程序 把值賦給變量A 

if [ $A -eq 0 ];then                                         ## 如果沒有程序值得為 零

                /usr/local/nginx/sbin/nginx

                sleep 3

                if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

                       killall keepalived                        ## 則結束 keepalived 程序

                fi

fi 

8、測試,分别在兩個伺服器 啟動 nginx 和 keepalived

/usr/local/nginx/sbin/nginx 

/etc/init.d/keepalived start

監控 server 1 的日志

Apr 20 18:37:39 nginx Keepalived_vrrp: Registering Kernel netlink command channel 

Apr 20 18:37:39 nginx Keepalived_vrrp: Registering gratutious ARP shared channel 

Apr 20 18:37:39 nginx Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'. 

Apr 20 18:37:39 nginx Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'. 

Apr 20 18:37:39 nginx Keepalived_healthcheckers: Configuration is using : 3401 Bytes 

Apr 20 18:37:39 nginx Keepalived_vrrp: Configuration is using : 35476 Bytes 

Apr 20 18:37:40 nginx Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE 

Apr 20 18:37:41 nginx Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE 

Apr 20 18:37:41 nginx Keepalived_vrrp: Netlink: skipping nl_cmd msg... 

Apr 20 18:37:41 nginx Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded

監控 server 2的日志 

Apr2018:38:23 varnish Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'. 

Apr 20 18:38:23 varnish Keepalived_healthcheckers: Configuration is using : 3405 Bytes 

Apr 20 18:38:23 varnish Keepalived_vrrp: Using MII-BMSR NIC polling thread... 

Apr 20 18:38:23 varnish Keepalived_vrrp: Registering Kernel netlink reflector 

Apr 20 18:38:23 varnish Keepalived_vrrp: Registering Kernel netlink command channel 

Apr 20 18:38:23 varnish Keepalived_vrrp: Registering gratutious ARP shared channel 

Apr 20 18:38:23 varnish Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'. 

Apr 20 18:38:23 varnish Keepalived_vrrp: Configuration is using : 35486 Bytes 

Apr 20 18:38:23 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE 

Apr 20 18:38:25 varnish Keepalived_vrrp: VRRP_Script(chk_http_port) succeeded 

看日志可以看出,兩台伺服器的 MASTRE 和 BACUKUP 已經都正常了

現在我們在 server 1 把 nginx 伺服器停到

Server 1 $> killall nginx

這時候看server 1的日志

Apr 20 18:41:26 nginx Keepalived_healthcheckers: Terminating Healthchecker child process on signal 

Apr 20 18:41:26 nginx Keepalived_vrrp: Terminating VRRP child process on signal 

可以看出keepalived 的程序已經停到

這時候看server 2的日志,看是否已經接管

Apr 20 18:41:23 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE 

Apr 20 18:41:24 varnish Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE 

Apr 20 18:41:24 varnish Keepalived_vrrp: Netlink: skipping nl_cmd msg... 

很明顯的看出 server 2 已經接管了,已經變為 MASTER 了

本文轉自Deidara 51CTO部落格,原文連結:http://blog.51cto.com/deidara/302402,如需轉載請自行聯系原作者

繼續閱讀