Keepalived搭建nginx高可用的實(shí)現(xiàn)
一、環(huán)境準(zhǔn)備
兩臺(tái)裝有 nginx 的 CentOS 虛擬機(jī)。

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html [root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html
二、原理

Keepalived 為我們后端服務(wù)器組虛擬出一組 VIP,該 VIP 只能由優(yōu)先級(jí)最高的一臺(tái)服務(wù)器持有??蛻舳嗽L問(wèn),就只訪問(wèn) VIP。

當(dāng)主服務(wù)器掛掉之后,Keepalived 自動(dòng)幫我們把 VIP 漂移到 BACKUP 服務(wù)器。以此來(lái)保證服務(wù)的高可用。
Keepalived 通過(guò)檢測(cè)服務(wù)器上的 Keepalived 進(jìn)程的存活狀態(tài),來(lái)判斷服務(wù)器是否存活。
三、安裝
1)安裝 keepalived
# 在 nginx1 安裝 keepalived [root@nginx1 ~]# yum install -y keepalived # 在 nginx2 安裝 keepalived [root@nginx2 ~]# yum install -y keepalived
2)配置
使用 yum 安裝后配置文件在 /etc/keepalived/keepalived.conf
# 備份 nginx1 keepalived 配置文件 [root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak # 備份 nginx2 keepalived 配置文件 [root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
- nginx1 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}- global_defs:全局配置標(biāo)識(shí)。
- router_id:路由器標(biāo)識(shí),一般不用改,也可以寫成每個(gè)主機(jī)自己的主機(jī)名。
- vrrp_instance:一個(gè) vrrp_instance 就是定義一個(gè)虛擬路由器的,VI_1 是實(shí)例名稱。
- state:指定 keepalived 的角色,MASTER 表示此主機(jī)是主服務(wù)器,BACKUP 表示此主機(jī)是備服務(wù)器。
- interface:指定檢測(cè)網(wǎng)絡(luò)的網(wǎng)卡接口。就比如下圖的 ens33。

- virtual_router_id:虛擬路由標(biāo)識(shí),數(shù)字形式,同一個(gè) VRRP 實(shí)例使用唯一的標(biāo)識(shí),即在同一個(gè) vrrp_instance下,master 和 backup 必須一致。
- priority:節(jié)點(diǎn)優(yōu)先級(jí),數(shù)字越大表示節(jié)點(diǎn)的優(yōu)先級(jí)越高,在一個(gè) VRRP 實(shí)例下,MASTER 的優(yōu)先級(jí)必須要比 BACKUP 高,不然就會(huì)切換角色。
- advert_int:用于設(shè)定 MASTER 與 BACKUP 之間同步檢查的時(shí)間間隔,單位為秒。
- auth_type:預(yù)共享密鑰認(rèn)證,同一個(gè)虛擬路由器的 keepalived 節(jié)點(diǎn)必須一樣。
- auth_pass:設(shè)置密鑰。
- virtual_ipaddress:設(shè)置虛擬IP地址,可以設(shè)置多種形式:
- 10.0.0.100 不指定網(wǎng)卡,默認(rèn)為 eth0,注意:不指定/prefix,默認(rèn)為/32;
- 10.0.0.101/24 dev eth1 指定 VIP 的網(wǎng)卡;
- 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的網(wǎng)卡 label。
- nginx2 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
}3)啟動(dòng)
# 啟動(dòng) MASTER 服務(wù)器 keepalived 并設(shè)置為開(kāi)機(jī)自啟動(dòng) [root@nginx1 keepalived]# systemctl enable keepalived --now [root@nginx1 keepalived]# systemctl status keepalived [root@nginx1 keepalived]# ip a

會(huì)發(fā)現(xiàn) MASTER 服務(wù)器多出了 192.168.40.80 這個(gè)IP。
# 啟動(dòng) BACKUP 服務(wù)器 keepalived 并設(shè)置為開(kāi)機(jī)自啟動(dòng) [root@nginx2 keepalived]# systemctl enable keepalived --now [root@nginx2 keepalived]# systemctl status keepalived [root@nginx2 keepalived]# ip a

備份服務(wù)器并不持有 VIP。
4)訪問(wèn)
此時(shí)訪問(wèn) VIP,請(qǐng)求都是被打到 MASTER 上的 nginx。

5)故障測(cè)試
# 停掉 MASTER [root@nginx1 ~]# init 0


此時(shí) VIP 飄移到 BACKUP。
6)重啟 MASTER
此時(shí) VIP 又漂移回來(lái)了。


四、定制腳本
Keepalived 通過(guò)檢測(cè)服務(wù)器上的 Keepalived 進(jìn)程的存活狀態(tài),來(lái)判斷服務(wù)器是否存活。
但如果此時(shí),我們的服務(wù)器沒(méi)有掛,但是我們希望 Keepalived 保活的服務(wù)(比如 nginx)掛了,由于 Keepalived 進(jìn)程沒(méi)有掛,這個(gè)時(shí)候,Keepalived 是不會(huì)幫我們主備切換的。
# 停掉 MASTER [root@nginx1 ~]# systemctl stop nginx

這個(gè)時(shí)候 VIP 并沒(méi)有遷移走。這個(gè)時(shí)候,我們就得自己寫一個(gè)腳本,去檢測(cè) nginx 存活狀態(tài),如果 nginx 掛了,人為殺死 keepalived 進(jìn)程,讓 keepalived 幫我們主備切換。
先重新啟動(dòng) nginx
[root@nginx1 ~]# systemctl start nginx
1)修改 keepalived.conf
- nginx1 上 keepalived.onf:
! Configuration File for keepalived
global_defs {
router_id lb1
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 當(dāng)檢查失敗時(shí),優(yōu)先級(jí)會(huì)減去這個(gè)值
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}- nginx2 上 keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id lb2
}
vrrp_script check_nginx {
script "pgrep nginx"
interval 2
weight 50 # 當(dāng)檢查失敗時(shí),優(yōu)先級(jí)會(huì)減去這個(gè)值
fall 2
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.80
}
track_script {
check_nginx
}
}2)重啟 keepalived
[root@nginx1 keepalived]# sudo systemctl restart keepalived [root@nginx2 keepalived]# sudo systemctl restart keepalived
3)停掉 MASTER
# 停掉 MASTER [root@nginx1 ~]# systemctl stop nginx


VIP 這次終于被遷移到 BACKUP。
五、應(yīng)用場(chǎng)景
Keepalived + Nginx 的組合有很多應(yīng)用場(chǎng)景:
- 搭建 Nacos 高可用集群
- 搭建 K8S Ingress 入口
到此這篇關(guān)于Keepalived搭建nginx高可用的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Keepalived搭建nginx高可用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- keepalived+nginx高可用實(shí)現(xiàn)方法示例
- Keepalived+Nginx+Tomcat 實(shí)現(xiàn)高可用Web集群的示例代碼
- nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟
- Keepalived實(shí)現(xiàn)Nginx負(fù)載均衡高可用的示例代碼
- keepalived對(duì)nginx進(jìn)行高可用搭建及原理詳解
- Keepalived如何實(shí)現(xiàn)Nginx高可用
- keepalived?+?nginx?實(shí)現(xiàn)高可用方案
- 使用Nginx?+?Keepalived?實(shí)現(xiàn)高可用?Web?負(fù)載均衡筆記(虛擬機(jī))
- Nginx+keepalived實(shí)現(xiàn)七層的負(fù)載均衡的高可用(最新解決方案)
- Nginx高可用Keepalived的具體使用
- Nginx使用Keepalived部署web集群(高可用高性能負(fù)載均衡)實(shí)戰(zhàn)案例
相關(guān)文章
Nginx代理導(dǎo)致請(qǐng)求頭某些內(nèi)容丟失的問(wèn)題解決
本文主要介紹了在使用NGINX代理時(shí)請(qǐng)求頭中的下劃線被自動(dòng)忽略的問(wèn)題,通過(guò)兩種方法解決了這個(gè)問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
Nginx優(yōu)化服務(wù)之網(wǎng)頁(yè)壓縮的實(shí)現(xiàn)方法
這篇文章主要介紹了Nginx優(yōu)化服務(wù)之網(wǎng)頁(yè)壓縮的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
把ImageMagic庫(kù)編譯進(jìn)nginx服務(wù)器的一些必要配置
這篇文章主要介紹了把ImageMagic庫(kù)編譯進(jìn)nginx服務(wù)器的一些必要配置,本文給出了操作步驟和配置參數(shù)示例,需要的朋友可以參考下2015-06-06
Nginx 502 Bad Gateway錯(cuò)誤原因及解決方案
這篇文章主要介紹了Nginx 502 Bad Gateway錯(cuò)誤原因及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
nginx的請(qǐng)求轉(zhuǎn)發(fā)配置過(guò)程
Nginx在Windows和Linux環(huán)境下的安裝、啟動(dòng)、停止、配置和請(qǐng)求轉(zhuǎn)發(fā)過(guò)程,配置文件語(yǔ)法檢測(cè)、優(yōu)雅關(guān)閉、熱部署和日志文件重新打開(kāi),配置多個(gè)服務(wù)的請(qǐng)求轉(zhuǎn)發(fā)規(guī)則,修改前端API地址,設(shè)置最大上傳文件大小2024-12-12
Nginx配置請(qǐng)求頭攜帶原始請(qǐng)求信息的實(shí)現(xiàn)
本文主要介紹了Nginx配置請(qǐng)求頭攜帶原始請(qǐng)求信息的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12

