Nginx + Keepalive生產(chǎn)環(huán)境搭建

Nginx的主要用途有反向代理,負(fù)載均衡等,無(wú)論它作為哪種用途,Nginx本身也需要高可用來(lái)預(yù)防單點(diǎn)故障,Nginx的高可用可以通過(guò)搭配Keepalive來(lái)實(shí)現(xiàn)。主要思路即配置主備Nginx服務(wù),通過(guò)Keepalive來(lái)進(jìn)行檢測(cè),當(dāng)主Nginx掛掉時(shí),能夠通過(guò)轉(zhuǎn)移VIP的方式自動(dòng)切換到備Nginx,進(jìn)而實(shí)現(xiàn)Nginx的高可用。

1 部署架構(gòu)

Nginx+Keepalive部署架構(gòu)

2 Nginx部署

對(duì)于很多公司可能生產(chǎn)環(huán)境機(jī)器都是無(wú)法聯(lián)網(wǎng)的,所以我們這里通過(guò)源碼來(lái)安裝Nginx。

1) 下載源碼包:nginx: download,解壓縮后文件目錄如下(這里我們使用了最新穩(wěn)定版nginx-1.20.1):

image.png

2) 安裝gcc等編譯依賴環(huán)境:

yum -y install gcc pcre-devel zlib-devel

3) 進(jìn)入安裝包目錄,執(zhí)行以下命令配置安裝路徑:

./configure --prefix=/home/nginx

默認(rèn)情況下安裝路徑是/usr/local/nginx,因?yàn)樯a(chǎn)環(huán)境機(jī)器都會(huì)單獨(dú)掛載磁盤(pán),而且Nginx的訪問(wèn)日志會(huì)隨著時(shí)間變大,為了不影響操作系統(tǒng)所在磁盤(pán),這里我們配置成單獨(dú)掛載的磁盤(pán)目錄。

4) 執(zhí)行完配置命令后,當(dāng)前目錄下會(huì)生成Makefile文件,繼續(xù)執(zhí)行以下命令安裝:

make && make install

5) 因?yàn)榕渲昧税惭b目錄,所以Nginx會(huì)安裝在/home/nginx目錄下,啟動(dòng)Nignx:

cd /home/nginx/sbin
./nginx

主從機(jī)器都按照上述步驟安裝Nginx。

3 Keepalive部署

1) yum安裝keepalive:

yum -y install keepalived

2) 修改配置文件:

vi /etc/keepalived/keepalived.conf

主機(jī)keepalived.conf:

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/home/shell/check_nginx_pid.sh" #nginx進(jìn)程檢測(cè)腳本
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER   
    interface ens33  #網(wǎng)卡設(shè)備
    virtual_router_id 51  #虛擬路由編號(hào),主從要一致
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.200 #虛擬ip設(shè)置
    }
}

因?yàn)镵eepalived轉(zhuǎn)移虛ip是根據(jù)Keepalived進(jìn)程是否存活來(lái)進(jìn)行的,所以如果Nginx掛了,但Keepalived進(jìn)程還在的話,是不會(huì)轉(zhuǎn)移ip的,所以如果Nginx掛掉并且無(wú)法重啟,則需要在檢查腳本中關(guān)閉Keepalived進(jìn)程:

check_nginx_pid.sh:

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then    #如果nginx沒(méi)有啟動(dòng)就啟動(dòng)nginx
      /home/nginx/sbin/nginx                #重啟nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重啟失敗,則停掉keepalived服務(wù),進(jìn)行VIP轉(zhuǎn)移
              systemctl stop keepalived
      fi
fi

需要給check_nginx_pid.sh腳本權(quán)限:

chmod 777 check_nginx_pid.sh

備機(jī)keepalive.conf:

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/home/shell/check_nginx_pid.sh" #nginx進(jìn)程檢測(cè)腳本
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP   
    interface ens33  #網(wǎng)卡設(shè)備
    virtual_router_id 51  #虛擬路由編號(hào),主從要一致
    priority 90 #這里的priority小于MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.200 #虛擬ip設(shè)置
    }
}

3) 主從keepalived配置好后,可以通過(guò)命令啟動(dòng):

systemctl start keepalived

4) 查看是否啟動(dòng)成功,以及當(dāng)前機(jī)器是MASTER還是SLAVE可以查看日志:

tail -f /var/log/message

5) 通過(guò)如下命令查看虛ip是否配置成功:

ip addr

4 主從切換測(cè)試

停掉主機(jī)上的Keepalived來(lái)查看虛ip是否轉(zhuǎn)移到SLAVE主機(jī)上,如果轉(zhuǎn)移成功則說(shuō)明后續(xù)的請(qǐng)求都是通過(guò)備機(jī)上的Nginx來(lái)處理的,即實(shí)現(xiàn)了Nginx的高可用。

MASTER主機(jī)執(zhí)行:

systemctl stop keepalived

從機(jī)上查看虛ip是否轉(zhuǎn)移:

ip addr

查看切換過(guò)程中的日志:

tail -f /var/log/message

成功轉(zhuǎn)移,則說(shuō)明環(huán)境搭建完成。

5 其他說(shuō)明

5.1 keepalive.conf weight參數(shù)說(shuō)明

細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn)vrrp_script中有個(gè)weight參數(shù),這個(gè)參數(shù)是什么意思呢?

官網(wǎng)中的解釋如下Keepalived for Linux

# adjust priority by this weight, (default: 0)
# For description of reverse, see track_script.
# 'weight 0 reverse' will cause the vrrp instance to be down when the
# script is up, and vice versa.
weight <INTEGER:-253..253> [reverse]

第一句話的意思是該參數(shù)會(huì)調(diào)整priority參數(shù),而priority是用來(lái)選舉MASTER的。所以該參數(shù)會(huì)影響到keepalived MASTER選舉:

for electing MASTER, highest priority wins.
to be MASTER, make this 50 more than on other machines.
priority 100

后面的意思應(yīng)該是如果weight設(shè)置為 weight 0 reverse的話,如果檢測(cè)腳本返回失敗,則keepalived會(huì)down掉,進(jìn)而完成切換。

那weight是如何調(diào)整priority的呢,繼續(xù)看官網(wǎng)說(shuō)明:

vrrp tracking scripts that will cause vrrp instances to go down it
they exit a non-zero exist status, or if a weight is specified will add
or subtract the weight to/from the priority of that vrrp instance.

也就是說(shuō)Keepalived會(huì)根據(jù)腳本檢測(cè)結(jié)果,然后根據(jù)配置的weight對(duì)priority進(jìn)行相應(yīng)的增加或減少,進(jìn)而影響MASTER選舉。

實(shí)際測(cè)試當(dāng)weight大于0時(shí),腳本檢測(cè)成功時(shí),priority會(huì)增加weight,腳本檢測(cè)失敗時(shí),priority會(huì)減少weight。

當(dāng)weight < 0時(shí),當(dāng)腳本檢測(cè)成功時(shí),priority保持不變,而腳本檢測(cè)失敗時(shí),priority會(huì)減少weight。

實(shí)際測(cè)試這里的priority不會(huì)一直改變,也就是說(shuō)一直檢測(cè)成功或者失敗,也不會(huì)對(duì)priority一直增加或減少,這里應(yīng)該是Keepalive內(nèi)部的優(yōu)化了。

5.2 主從切換失敗的常見(jiàn)問(wèn)題解決

1) 確認(rèn)防火墻及selinux是否關(guān)閉
2) 轉(zhuǎn)移過(guò)程中的具體日志可以查看/var/log/message文件

5.3 一個(gè)Nginx反向代理及負(fù)載均衡的生產(chǎn)環(huán)境配置

nginx.conf

user  root;
worker_processes  8; #工作線程,配置成cpu核心數(shù)

events {
    worker_connections  1024; #每個(gè)工作線程能夠處理的最大連接數(shù),包括與客戶端的連接和代理服務(wù)器的連接
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65; #與客戶端連接的keepalive_timeout參數(shù)

    #gzip  on;

    upstream api_server {
        server 192.168.1.106:8848;
        server 192.168.1.107:8848;
        server 192.168.1.108:8848;
        keepalive 15;  #與后臺(tái)服務(wù)器保持的空閑連接數(shù)
    }

    server {
        listen       8848;
        server_name  192.168.1.200; # 這里配置成虛ip的地址,因?yàn)榭蛻舳硕际峭ㄟ^(guò)虛ip來(lái)訪問(wèn)Nginx的

        location / {
           proxy_pass http://api_server;
           proxy_http_version 1.1;  #設(shè)置http 1.1協(xié)議,可以與后端http服務(wù)保持長(zhǎng)連接,防止出現(xiàn)過(guò)多time_wait
           proxy_set_header Connection "";
        }
    }
}

上述是nginx-1.20.1的生產(chǎn)環(huán)境配置,有很多參數(shù)未涉及,實(shí)際上保持系統(tǒng)默認(rèn)即可。

寫(xiě)在最后

希望今天的內(nèi)容能對(duì)大家有所幫助,更多精彩內(nèi)容歡迎關(guān)注微信公眾號(hào):WU雙

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容