生產環境部署Nginx伺服器雙機熱備部署-keepalived(多種模式教程)

Linux运维技术栈發表於2024-06-30

前言:今天演示下生產環境keepalived的部署方式,安裝模式有很多,比如說主備模型和雙主模型,主備分:搶佔模式 和 非搶佔模式。這裡我會一一展開說具體怎麼配置
一、雙節點均部署Nginx:

第一步:上傳安裝包到/usr/local/

第二步:安裝編譯依賴(使用普通使用者需要家sudo)

yum install gcc gcc-c++
yum install zlib zlib-devel
yum install pcre pcre-devel
yum install openssl libssl-dev

第三步:解壓,編譯安裝:

解壓命令: sudo tar -zxvf nginx-1.24.0.tar.gz 
進入nginx路徑:cd nginx-1.24.0	
編譯安裝:
命令:
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/bin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --with-http_ssl_module
# --with-http_ssl_module這個引數為了啟用 SSL 支援。
命令:sudo make install

第四步:啟動nginx
命令:sudo nginx

第五步:停止nginx
命令:sudo nginx -s stop

第六步:配置nginx開機啟動

sudo vim /etc/rc.d/rc.local
新增執行語句/usr/bin/nginx
退出儲存
開機啟動檔案授權
sudo chmod +x /etc/rc.d/rc.local

第六步:過載nginx
nginx -s reload
Nginx安全加固配置:在nginx.conf配置檔案里加上TLSv1.2 TLSv1.3; 和隱藏版本號的部分。

# 在server { }塊裡配置啟用TLSv1.2和TLSv1.3的引數 
    ssl_protocols TLSv1.2 TLSv1.3;  
# 在http { }塊裡配置隱藏Nginx伺服器版本資訊的引數
    server_tokens off; 

二、雙節點部署keepalived主備模式

第一步:上傳安裝包到/mpjava/

第二步:安裝gcc等編譯需要的軟體庫。(要求網路能連線外網進行更新,如果已安裝,可跳過此步驟)

命令:yum -y install libnl libnl-devel 
命令:yum -y install gcc gcc-c++
命令:yum -y install  openssl 
命令:yum -y install openssl-devel
命令:yum -y install libnl3-devel

第三步:解壓,並編譯安裝

命令:tar -zxf keepalived-2.2.4.tar.gz
命令:cd keepalived-2.2.4
命令:./configure --prefix=/usr/local/keepalived
命令:make && make install

第四步:複製配置檔案

命令:mkdir  -p  /etc/keepalived
命令:cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #主配置檔案
命令:cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
命令:ln -s /usr/local/keepalived/sbin/keepalived /sbin/

第五步:設定開機啟動
命令:chkconfig keepalived on

第六步:啟動keepalived

命令:systemctl start keepalived
命令:ps -ef | grep keepalived

問題:發現未能正常啟動

檢視日誌命令:
systemctl status keepalived.service -l:檢視 keepalived 服務的狀態及相關日誌資訊
journalctl -u keepalived.service -f:實時檢視 keepalived 服務的日誌輸出
tail -22f /var/log/messages | grep Keepalived:透過檢視系統日誌/var/log/messages中與 Keepalived 相關的內容來獲取日誌資訊

原因:透過查詢系統日誌發現keepalived配置檔案預設網路卡名和當前伺服器網路卡名不一致。
解決:需要修改/etc/keepalived/keepalived.conf的網路卡名,與伺服器同步即可。
重啟keepalived:systemctl start keepalived

第七步:新建nginx檢測指令碼nginxcheck.sh,並存放在指定目錄,本例使用:/mpjava/nginxcheck.sh

命令:vim /mpjava/nginxcheck.sh
新增以下內容:
#/bin/sh

nginxPidNum=`ps -C nginx --no-header |wc -l`
if [[ $nginxPidNum -eq 0 ]];
then
    killall keepalived
fi
注:需要設定nginxcheck.sh有執行許可權,chmod 777 /mpjava/nginxcheck.sh

第八步:按下例分別修改主、備伺服器/etc/keepalived/keepalived.conf
宣告:這裡的ip為虛假ip,只是舉例說明
主節點:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1                  #配置當前閘道器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
    script "/mpjava/nginxcheck.sh"       #指令碼位置
    interval 2                           #檢測時間間隔
    weight 2                             #權重2
}

vrrp_instance VI_1 {
    state BACKUP                   #主節點如果寫BACKUP,和配置下面的nopreempt引數就為 非搶佔模式;如果寫MASTER,刪除nopreempt引數,則為 搶佔模式
    nopreempt                      #非搶佔模式引數  
    interface enp4s3
    virtual_router_id 69           #不能使用同網段已使用的ip地址;同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 100                   #不管是否開啟搶佔模式,主節點的優先順序必須高於 從節點
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

track_script {                           #以指令碼為監控chk_http_port是前面填寫的
        chk_nginx
    }

    virtual_ipaddress {
        10.0.0.10                        #vip
    }
}

從節點:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1                   #配置當前閘道器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
    script "/mpjava/nginxcheck.sh"         #指令碼位置
    interval 2                             #檢測時間間隔
    weight 2                               #權重2
}

vrrp_instance VI_1 {
    state BACKUP                           #不管是搶佔模式否,從節點設定為backup
    nopreempt                              #非搶佔模式引數,如果不開啟該模式,需要刪除  
    interface eth0
    virtual_router_id 69                   #不能使用同網段已使用的ip地址;同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

track_script {                             #以指令碼為監控chk_http_port是前面填寫的
        chk_nginx
    }

    virtual_ipaddress {
        10.0.0.10                          #VIP
    }
}`

第九步:驗證
由於涉及公司內網ip,驗證結果不方便展示,我這裡口述方法:

搶佔模式:啟動兩個節點的nginx和keepalived,當主節點的keepalived關了後,VIP會漂移到從節點上,當主節點啟動後,此時VIP會漂移回主節點;

非搶佔模式:啟動兩個節點的nginx和keepalived,當主節點的keepalived關了後,VIP會漂移到從節點上,此時再將主節點啟動後,VIP不會漂移回主節點;
(以上驗證方法用命令ip a實時檢視網路卡的VIP地址的漂移節奏)

高可用叢集中的不搶佔功能。在一個HA叢集中,如果主節點當機了,備用節點會進行接管,主節點再次正常啟動後一般會自動接管服務。對於實時性和穩定性要求不高的業務系統來說,這種來回切換的操作還是可以接受的。而對於穩定性和實時性要求很高的業務系統來說,不建議來回切換,畢竟服務的切換存在一定的風險和不穩定性

三、Keepalived主主模式

第一步:按下例分別修改主、主伺服器/etc/keepalived/keepalived.conf
宣告:這裡的ip為虛假ip,只是舉例說明
主節點1:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1                   #配置當前閘道器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
    script "/mpjava/nginxcheck.sh"        #指令碼位置
    interval 2                            #檢測時間間隔
    weight 2                              #權重2
}

vrrp_instance VI_1 {
    state MASTER                          #主節點為MASTER
    interface enp4s3
    virtual_router_id 69                  #不能使用同網段已使用的ip地址;同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 100                          #MASTER節點必須高於BACKUP節點
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

track_script {                           #以指令碼為監控chk_http_port是前面填寫的
        chk_nginx
    }

    virtual_ipaddress {
        10.0.0.8                         #vip1
    }
}

vrrp_instance VI_2 {
    state BACKUP                        #該節點設定為backup
    interface eth0
    virtual_router_id 70                # 同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 90                         # MASTER節點必須高於BACKUP節點
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.9                        #vip2
    }
}

主節點2:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 10.0.0.1                  #配置當前閘道器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {
    script "/mpjava/nginxcheck.sh"        #指令碼位置
    interval 2                            #檢測時間間隔
    weight 2                              #權重2
}

vrrp_instance VI_1 {
    state BACKUP                          #不管是搶佔模式否,從節點設定為backup
    nopreempt                             #非搶佔模式引數,如果不開啟該模式,需要刪除  
    interface eth0
    virtual_router_id 69                  #不能使用同網段已使用的ip地址;同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 99                           #MASTER節點必須高於BACKUP節點
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

track_script {                            #以指令碼為監控chk_http_port是前面填寫的
        chk_nginx
    }

    virtual_ipaddress {
        10.0.0.8                          #vip1
    }
}`

vrrp_instance VI_2 {
    state MASTER                         #該節點設定為MASTER
    interface eth0
    virtual_router_id 70                 #同一個VRRP例項中每個節點的虛擬路由ID必須相同
    priority 100                         #MASTER節點的優先順序必須高於BACKUP節點
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.9                         #vip2


    }
}

第二步:驗證
由於涉及公司內網ip,驗證結果不方便展示,我這裡口述方法:

啟動兩個主節點的nginx和keepalived,將nginx中配置的域名解析到這兩個VIP地址上,瀏覽器訪問正常。此時關閉其中一個主節點的keepalived,VIP會漂移到另外一臺主節點伺服器上。
(以上驗證方法用命令ip a實時檢視網路卡的VIP地址的漂移節奏)

在keepalived的主備模式中,當主節點正常的時候,備節點永遠處於閒置狀態,不會接受web請求,這樣就會浪費一半的資源。根據自身業務和資源等綜合來選擇模式。

相關文章