第 8 章 nginx 搭建高可用集群

8.1 Keepalived+Nginx 高可用集群(主從模式)

image.png
global_defs { 
 notification_email { 
 acassen@firewall.loc 
 failover@firewall.loc 
 sysadmin@firewall.loc 
 } 
 notification_email_from Alexandre.Cassen@firewall.loc 
 smtp_server 192.168.17.129 
 smtp_connect_timeout 30 
 router_id LVS_DEVEL } 
vrrp_script chk_http_port { 
 script "/usr/local/src/nginx_check.sh" 
 interval 2 #(檢測(cè)腳本執(zhí)行的間隔) 
 weight 2
} 

vrrp_instance VI_1 { 
 state BACKUP # 備份服務(wù)器上將 MASTER 改為 BACKUP 
 interface ens33 //網(wǎng)卡 
 virtual_router_id 51 # 主湃望、備機(jī)的 virtual_router_id 必須相同 
 priority 100 # 主宇驾、備機(jī)取不同的優(yōu)先級(jí)汗贫,主機(jī)值較大,備份機(jī)值較小 
 advert_int 1 
 authentication { 
 auth_type PASS 
 auth_pass 1111 
 } 
 virtual_ipaddress { 
 192.168.17.50 // VRRP H 虛擬地址 
 } } 

#!/bin/bash 
A=`ps -C nginx –no-header |wc -l` 
if [ $A -eq 0 ];then 
 /usr/local/nginx/sbin/nginx 
 sleep 2 
 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
 killall keepalived 
 fi 
fi

(1)在所有節(jié)點(diǎn)上面進(jìn)行配置

# systemctl stop firewalld //關(guān)閉防火墻
# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux //關(guān)閉 selinux讯壶,重啟生效
# setenforce 0 //關(guān)閉 selinux,臨時(shí)生效
# ntpdate 0.centos.pool.ntp.org //時(shí)間同步
# yum install nginx -y //安裝 nginx

(2)配置后端 web 服務(wù)器(兩臺(tái)一樣)

# echo "`hostname` `ifconfig ens33 |sed -n 's#.*inet \(.*\)netmask.*#\1#p'`" >
 /usr/share/nginx/html/index.html
 //準(zhǔn)備測(cè)試文件末盔,此處是將主機(jī)名和 ip 寫(xiě)到 index.html 頁(yè)面中
# vim /etc/nginx/nginx.conf //編輯配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
 worker_connections 1024;
}

http {
    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 /var/log/nginx/access.log main;
     sendfile on;
     tcp_nopush on;
     tcp_nodelay on;
     keepalive_timeout 65;
     types_hash_max_size 2048;
     include /etc/nginx/mime.types;
     default_type application/octet-stream;
     include /etc/nginx/conf.d/*.conf;
    server {
       listen 80;
       server_name www.mtian.org;
       location / {
          root /usr/share/nginx/html;
       }
      access_log /var/log/nginx/access.log main;
   } 
}

# systemctl start nginx //啟動(dòng) nginx
# systemctl enable nginx //加入開(kāi)機(jī)啟動(dòng)

(3)配置 LB 服務(wù)器(兩臺(tái)都一樣)

# vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
     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 /var/log/nginx/access.log main;
     sendfile on;
      tcp_nopush on;
     tcp_nodelay on;
     keepalive_timeout 65;
     types_hash_max_size 2048;
     include /etc/nginx/mime.types;
     default_type application/octet-stream;
     include /etc/nginx/conf.d/*.conf;
     upstream backend {
         server 192.168.1.33:80 weight=1 max_fails=3 fail_timeout=20s;
         server 192.168.1.34:80 weight=1 max_fails=3 fail_timeout=20s;
     }
     server {
         listen 80;
         server_name www.mtian.org;
         location / {
             proxy_pass http://backend;
             proxy_set_header Host $host:$proxy_port;
             proxy_set_header X-Forwarded-For $remote_addr;
         }
     } 
}
# systemctl start nginx //啟動(dòng) nginx 
# systemctl enable nginx //加入開(kāi)機(jī)自啟動(dòng)

(4)在測(cè)試機(jī)(192.168.1.35)上面添加 host 解析薛训,并測(cè)試 lb 集群是否正常。(測(cè)試機(jī)任意都可以辈毯,只要能訪問(wèn) lb 節(jié)點(diǎn)坝疼。)

[root@node01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.32 www.mtian.org
192.168.1.31 www.mtian.org
// 測(cè)試時(shí)候輪流關(guān)閉 lb1 和 lb2 節(jié)點(diǎn),關(guān)閉后還是能夠訪問(wèn)并看到輪循效果即表示 nginx lb 集群搭建
成功谆沃。
[root@node01 ~]# curl www.mtian.org
web01 192.168.1.33 
[root@node01 ~]# curl www.mtian.org
web02 192.168.1.34 
[root@node01 ~]# curl www.mtian.org
web01 192.168.1.33 
[root@node01 ~]# curl www.mtian.org
web02 192.168.1.34 
[root@node01 ~]# curl www.mtian.org
web01 192.168.1.33 
[root@node01 ~]# curl www.mtian.org
web02 192.168.1.34

(5)上面步驟成功后钝凶,開(kāi)始搭建 keepalived,在兩臺(tái) lb 節(jié)點(diǎn)上面安裝 keepalived(也可以源碼編譯安

裝唁影、此處直接使用 yum 安裝)

# yum install keepalived -y 

(6)配置 LB-01 節(jié)點(diǎn)

[root@LB-01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    notification_email {
       381347268@qq.com
    }
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
     192.168.1.110/24 dev ens33 label ens33:1
   }
}
[root@LB-01 ~]# systemctl start keepalived //啟動(dòng) keepalived
[root@LB-01 ~]# systemctl enable keepalived //加入開(kāi)機(jī)自啟動(dòng)
[root@LB-01 ~]# ip a //查看 IP耕陷,會(huì)發(fā)現(xiàn)多出了 VIP 192.168.1.110
......
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 00:0c:29:94:17:44 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.31/24 brd 192.168.1.255 scope global ens33
 valid_lft forever preferred_lft forever
 inet 192.168.1.110/24 scope global secondary ens33:1
 valid_lft forever preferred_lft forever
 inet6 fe80::20c:29ff:fe94:1744/64 scope link 
 valid_lft forever preferred_lft forever
......

(7)配置 LB-02 節(jié)點(diǎn)

[root@LB-02 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
     381347268@qq.com
   }
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
   state BACKUP
   interface ens33
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
      auth_type PASS
      auth_pass 1111
   }
   virtual_ipaddress {
     192.168.1.110/24 dev ens33 label ens33:1
   }
}
[root@LB-02 ~]# systemctl start keepalived //啟動(dòng) keepalived
[root@LB-02 ~]# systemctl enable keepalived //加入開(kāi)機(jī)自啟動(dòng)
[root@LB-02 ~]# ifconfig //查看 IP,此時(shí)備節(jié)點(diǎn)不會(huì)有 VIP(只有當(dāng)主掛了的時(shí)候据沈,VIP 才會(huì)飄到備節(jié)點(diǎn))
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 192.168.1.32 netmask 255.255.255.0 broadcast 192.168.1.255
 inet6 fe80::20c:29ff:feab:6532 prefixlen 64 scopeid 0x20<link>
 ether 00:0c:29:ab:65:32 txqueuelen 1000 (Ethernet)
 RX packets 43752 bytes 17739987 (16.9 MiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 4177 bytes 415805 (406.0 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
......

(8)在測(cè)試機(jī)器上面訪問(wèn) Keepalived 上面配置的 VIP 192.168.1.110

[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34 
[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34
//關(guān)閉 LB-01 節(jié)點(diǎn)上面 keepalived 主節(jié)點(diǎn)哟沫。再次訪問(wèn)
[root@LB-01 ~]# systemctl stop keepalived
[root@node01 ~]# 
[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34 
[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34
//此時(shí)查看 LB-01 主節(jié)點(diǎn)上面的 IP ,發(fā)現(xiàn)已經(jīng)沒(méi)有了 VIP
[root@LB-01 ~]# ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 192.168.1.31 netmask 255.255.255.0 broadcast 192.168.1.255
 inet6 fe80::20c:29ff:fe94:1744 prefixlen 64 scopeid 0x20<link>
 ether 00:0c:29:94:17:44 txqueuelen 1000 (Ethernet)
 RX packets 46813 bytes 18033403 (17.1 MiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 9350 bytes 1040882 (1016.4 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
//查看 LB-02 備節(jié)點(diǎn)上面的 IP锌介,發(fā)現(xiàn) VIP 已經(jīng)成功飄過(guò)來(lái)了
[root@LB-02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 192.168.1.32 netmask 255.255.255.0 broadcast 192.168.1.255
 inet6 fe80::20c:29ff:feab:6532 prefixlen 64 scopeid 0x20<link>
 ether 00:0c:29:ab:65:32 txqueuelen 1000 (Ethernet)
 RX packets 44023 bytes 17760070 (16.9 MiB)
 RX errors 0 dropped 0 overruns 0 frame 0
 TX packets 4333 bytes 430037 (419.9 KiB)
 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
 inet 192.168.1.110 netmask 255.255.255.0 broadcast 0.0.0.0
 ether 00:0c:29:ab:65:32 txqueuelen 1000 (Ethernet)
...

到此嗜诀,Keepalived+Nginx 高可用集群就搭建完成了。

8.2 Keepalived+Nginx 高可用集群(雙主模式)

image.png

說(shuō)明:還是按照上面的環(huán)境繼續(xù)做實(shí)驗(yàn)孔祸,只是修改 LB 節(jié)點(diǎn)上面的 keepalived 服務(wù)的配置文件即可隆敢。此時(shí)
LB-01 節(jié)點(diǎn)即為 Keepalived 的主節(jié)點(diǎn)也為備節(jié)點(diǎn),LB-02 節(jié)點(diǎn)同樣即為 Keepalived 的主節(jié)點(diǎn)也為備節(jié)點(diǎn)融击。
LB-01 節(jié)點(diǎn)默認(rèn)的主節(jié)點(diǎn) VIP(192.168.1.110)筑公,LB-02 節(jié)點(diǎn)默認(rèn)的主節(jié)點(diǎn) VIP(192.168.1.210) (

1)配置 LB-01 節(jié)點(diǎn)

[root@LB-01 ~]# vim /etc/keepalived/keepalived.conf //編輯配置文件,增加一段新的
vrrp_instance 規(guī)則
! Configuration File for keepalived
global_defs {
    notification_email {
       381347268@qq.com
   }
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.110/24 dev ens33 label ens33:1
    }
 }

vrrp_instance VI_2 {
    state BACKUP
     interface ens33
    virtual_router_id 52
     priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 2222
    }
    virtual_ipaddress {
       192.168.1.210/24 dev ens33 label ens33:2
    }
 }

[root@LB-01 ~]# systemctl restart keepalived //重新啟動(dòng) keepalived
// 查看 LB-01 節(jié)點(diǎn)的 IP 地址尊浪,發(fā)現(xiàn) VIP(192.168.1.110)同樣還是默認(rèn)在該節(jié)點(diǎn)
[root@LB-01 ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 00:0c:29:94:17:44 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.31/24 brd 192.168.1.255 scope global ens33
 valid_lft forever preferred_lft forever
 inet 192.168.1.110/24 scope global secondary ens33:1
 valid_lft forever preferred_lft forever
 inet6 fe80::20c:29ff:fe94:1744/64 scope link 
 valid_lft forever preferred_lft forever

(2)配置 LB-02 節(jié)點(diǎn)

[root@LB-02 ~]# vim /etc/keepalived/keepalived.conf //編輯配置文件匣屡,增加一段新的
vrrp_instance 規(guī)則
! Configuration File for keepalived
global_defs {
    notification_email {
        381347268@qq.com
    }
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
       192.168.1.110/24 dev ens33 label ens33:1
    } 
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 150
     advert_int 1
    authentication {
       auth_type PASS
       auth_pass 2222
    }
    virtual_ipaddress {
        192.168.1.210/24 dev ens33 label ens33:2
    } 
}
[root@LB-02 ~]# systemctl restart keepalived //重新啟動(dòng) keepalived
// 查看 LB-02 節(jié)點(diǎn) IP,會(huì)發(fā)現(xiàn)也多了一個(gè) VIP(192.168.1.210)拇涤,此時(shí)該節(jié)點(diǎn)也就是一個(gè)主了捣作。
[root@LB-02 ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ab:65:32 brd ff:ff:ff:ff:ff:ff
 inet 192.168.1.32/24 brd 192.168.1.255 scope global ens33
 valid_lft forever preferred_lft forever
 inet 192.168.1.210/24 scope global secondary ens33:2
 valid_lft forever preferred_lft forever
 inet6 fe80::20c:29ff:feab:6532/64 scope link 
 valid_lft forever preferred_lft forever

(3)測(cè)試

[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34 
[root@node01 ~]# curl 192.168.1.210
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.210
web02 192.168.1.34
// 停止 LB-01 節(jié)點(diǎn)的 keepalived 再次測(cè)試
[root@LB-01 ~]# systemctl stop keepalived
[root@node01 ~]# curl 192.168.1.110
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.110
web02 192.168.1.34 
[root@node01 ~]# curl 192.168.1.210
web01 192.168.1.33 
[root@node01 ~]# curl 192.168.1.210
web02 192.168.1.34

測(cè)試可以發(fā)現(xiàn)我們?cè)L問(wèn) keepalived 中配置的兩個(gè) VIP 都可以正常調(diào)度等,當(dāng)我們停止任意一臺(tái) keepalived節(jié)點(diǎn)鹅士,同樣還是正常訪問(wèn)券躁;到此,keepalived+nginx 高可用集群(雙主模式)就搭建完成了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末也拜,一起剝皮案震驚了整個(gè)濱河市以舒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慢哈,老刑警劉巖蔓钟,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異卵贱,居然都是意外死亡滥沫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)键俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兰绣,“玉大人,你說(shuō)我怎么就攤上這事编振∽罕纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵党觅,是天一觀的道長(zhǎng)雌澄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)杯瞻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任炫掐,我火速辦了婚禮魁莉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘募胃。我一直安慰自己旗唁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布痹束。 她就那樣靜靜地躺著检疫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祷嘶。 梳的紋絲不亂的頭發(fā)上屎媳,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音论巍,去河邊找鬼烛谊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘉汰,可吹牛的內(nèi)容都是我干的丹禀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼双泪!你這毒婦竟也來(lái)了持搜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焙矛,失蹤者是張志新(化名)和其女友劉穎葫盼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體薄扁,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剪返,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邓梅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱盲。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖日缨,靈堂內(nèi)的尸體忽然破棺而出钱反,到底是詐尸還是另有隱情,我是刑警寧澤匣距,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布面哥,位于F島的核電站,受9級(jí)特大地震影響毅待,放射性物質(zhì)發(fā)生泄漏尚卫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一尸红、第九天 我趴在偏房一處隱蔽的房頂上張望吱涉。 院中可真熱鬧,春花似錦外里、人聲如沸怎爵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳖链。三九已至,卻和暖如春墩莫,著一層夾襖步出監(jiān)牢的瞬間芙委,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工贼穆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留题山,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓故痊,卻偏偏與公主長(zhǎng)得像顶瞳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355