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

Nginx的主要用途有反向代理儡嘶,負(fù)載均衡等暖途,無論它作為哪種用途弓柱,Nginx本身也需要高可用來預(yù)防單點故障,Nginx的高可用可以通過搭配Keepalive來實現(xiàn)悄谐。主要思路即配置主備Nginx服務(wù)介评,通過Keepalive來進(jìn)行檢測,當(dāng)主Nginx掛掉時爬舰,能夠通過轉(zhuǎn)移VIP的方式自動切換到備Nginx们陆,進(jìn)而實現(xiàn)Nginx的高可用。

1 部署架構(gòu)

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

2 Nginx部署

對于很多公司可能生產(chǎn)環(huán)境機(jī)器都是無法聯(lián)網(wǎng)的情屹,所以我們這里通過源碼來安裝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椅文,因為生產(chǎn)環(huán)境機(jī)器都會單獨掛載磁盤,而且Nginx的訪問日志會隨著時間變大惜颇,為了不影響操作系統(tǒng)所在磁盤雾袱,這里我們配置成單獨掛載的磁盤目錄。

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

make && make install

5) 因為配置了安裝目錄,所以Nginx會安裝在/home/nginx目錄下望伦,啟動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)程檢測腳本
    interval 2
    weight 2
}

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

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

因為Keepalived轉(zhuǎn)移虛ip是根據(jù)Keepalived進(jìn)程是否存活來進(jìn)行的屯伞,所以如果Nginx掛了腿箩,但Keepalived進(jìn)程還在的話,是不會轉(zhuǎn)移ip的劣摇,所以如果Nginx掛掉并且無法重啟珠移,則需要在檢查腳本中關(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沒有啟動就啟動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)程檢測腳本
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP   
    interface ens33  #網(wǎng)卡設(shè)備
    virtual_router_id 51  #虛擬路由編號钧惧,主從要一致
    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配置好后,可以通過命令啟動:

systemctl start keepalived

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

tail -f /var/log/message

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

ip addr

4 主從切換測試

停掉主機(jī)上的Keepalived來查看虛ip是否轉(zhuǎn)移到SLAVE主機(jī)上浓瞪,如果轉(zhuǎn)移成功則說明后續(xù)的請求都是通過備機(jī)上的Nginx來處理的,即實現(xiàn)了Nginx的高可用巧婶。

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

systemctl stop keepalived

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

ip addr

查看切換過程中的日志:

tail -f /var/log/message

成功轉(zhuǎn)移乾颁,則說明環(huán)境搭建完成涂乌。

5 其他說明

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

細(xì)心的同學(xué)可能會發(fā)現(xiàn)vrrp_script中有個weight參數(shù),這個參數(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ù)會調(diào)整priority參數(shù)湾盒,而priority是用來選舉MASTER的。所以該參數(shù)會影響到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的話诅妹,如果檢測腳本返回失敗历涝,則keepalived會down掉,進(jìn)而完成切換漾唉。

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

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.

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

實際測試當(dāng)weight大于0時,腳本檢測成功時般此,priority會增加weight蚪战,腳本檢測失敗時,priority會減少weight铐懊。

當(dāng)weight < 0時邀桑,當(dāng)腳本檢測成功時,priority保持不變科乎,而腳本檢測失敗時壁畸,priority會減少weight。

實際測試這里的priority不會一直改變茅茂,也就是說一直檢測成功或者失敗捏萍,也不會對priority一直增加或減少,這里應(yīng)該是Keepalive內(nèi)部的優(yōu)化了空闲。

5.2 主從切換失敗的常見問題解決

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

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

nginx.conf

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

events {
    worker_connections  1024; #每個工作線程能夠處理的最大連接數(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;  #與后臺服務(wù)器保持的空閑連接數(shù)
    }

    server {
        listen       8848;
        server_name  192.168.1.200; # 這里配置成虛ip的地址碴倾,因為客戶端都是通過虛ip來訪問Nginx的

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

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

寫在最后

希望今天的內(nèi)容能對大家有所幫助矫户,更多精彩內(nèi)容歡迎關(guān)注微信公眾號:WU雙片迅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末残邀,一起剝皮案震驚了整個濱河市皆辽,隨后出現(xiàn)的幾起案子柑蛇,更是在濱河造成了極大的恐慌,老刑警劉巖驱闷,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻台,死亡現(xiàn)場離奇詭異,居然都是意外死亡空另,警方通過查閱死者的電腦和手機(jī)盆耽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扼菠,“玉大人摄杂,你說我怎么就攤上這事⊙埽” “怎么了析恢?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秧饮。 經(jīng)常有香客問我映挂,道長,這世上最難降的妖魔是什么盗尸? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任柑船,我火速辦了婚禮,結(jié)果婚禮上泼各,老公的妹妹穿的比我還像新娘鞍时。我一直安慰自己,他們只是感情好扣蜻,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布寸癌。 她就那樣靜靜地躺著,像睡著了一般弱贼。 火紅的嫁衣襯著肌膚如雪蒸苇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天吮旅,我揣著相機(jī)與錄音溪烤,去河邊找鬼。 笑死庇勃,一個胖子當(dāng)著我的面吹牛檬嘀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播责嚷,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸳兽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了罕拂?” 一聲冷哼從身側(cè)響起揍异,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤全陨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衷掷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辱姨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年戚嗅,在試婚紗的時候發(fā)現(xiàn)自己被綠了雨涛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡懦胞,死狀恐怖替久,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躏尉,我是刑警寧澤侣肄,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站醇份,受9級特大地震影響稼锅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僚纷,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一矩距、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怖竭,春花似錦锥债、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至广匙,卻和暖如春允趟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸦致。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工潮剪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人分唾。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓抗碰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绽乔。 傳聞我的和親對象是個殘疾皇子弧蝇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355