網(wǎng)站首頁 編程語言 正文
1.概述
nginx單機(jī)部署時,一旦宕機(jī)就會導(dǎo)致整個服務(wù)的不可用,導(dǎo)致雪崩式效應(yīng)。集群式部署是解決單點式雪崩效應(yīng)的有效方案,本文將在centos環(huán)境下,結(jié)合Keepalived搭建高可用的nginx集群。
2.CentOS中nginx集群搭建
2.1 集群架構(gòu)圖
當(dāng)客戶端請求服務(wù)器時,若利用nginx作為代理,則會首先訪問nginx服務(wù)器,再通過nginx服務(wù)器轉(zhuǎn)發(fā)到對應(yīng)的服務(wù)器上。上述架構(gòu)圖的原理是:nginx-01和nginx-02是兩臺nginx服務(wù)器,其中nginx-01作為主服務(wù)器,通過keepalived與nginx-02形成一個小集群,同時還可以與nginx-03、nginx-04…nginx-n等多臺服務(wù)器構(gòu)成集群。當(dāng)nginx-01因為某些原因宕機(jī)而停止服務(wù)時,其它nginx服務(wù)器會選舉一個進(jìn)行替代,使整個服務(wù)保持正常的運行。
2.2 Keepalived
Keepalived是一款基于vrrp協(xié)議的高可用集群軟件,通過虛擬IP(VIP)對外提供服務(wù),能夠?qū)崟r監(jiān)控集群中服務(wù)器的運行狀態(tài)并自動進(jìn)行故障隔離,這些服務(wù)器都啟動著相同的服務(wù),當(dāng)主服務(wù)器發(fā)生故障時,會自動將虛擬IP漂移到備份服務(wù)器,從而實現(xiàn)業(yè)務(wù)高可用。
2.3 集群搭建準(zhǔn)備
1.需要兩臺nginx服務(wù)器
2.需要keepalived
3.需要虛擬ip
2.4 集群搭建
2.4.1 安裝keepalived
分別在了兩臺虛擬機(jī)上,利用yum指令安裝keepalived,指令如下:
yum install keepalived
可以利用下述指令確認(rèn)是否安裝成功,成功的話則會顯示版本號,具體如下:
rpm -q -a keepalived
若非特別指定安裝目錄,則在centos的安裝路徑如下:
/etc/keepalived
2.4.2 配置keepalived.conf
由于是主從配置,在主服務(wù)器中,找到keepalived.conf的文件,進(jìn)行替換,該文件存儲于/etc/keepalived路徑下,找到后替換為如下內(nèi)容:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.200.129
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL這字段在/etc/hosts文件中看;通過它訪問到主機(jī)
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (檢測腳本執(zhí)行的間隔)2s
weight 2 #權(quán)重,如果這個腳本檢測為真,服務(wù)器權(quán)重+2
}
vrrp_instance VI_1 {
state MASTER # 備份服務(wù)器上將MASTER 改為BACKUP
interface ens33 #網(wǎng)卡名稱,可查看對應(yīng)服務(wù)器的網(wǎng)卡
virtual_router_id 51 # 主、備機(jī)的virtual_router_id必須相同
priority 100 #主、備機(jī)取不同的優(yōu)先級,主機(jī)值較大,備份機(jī)值較小
advert_int 1 #每隔1s發(fā)送一次心跳
authentication { # 校驗方式, 類型是密碼,密碼1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛擬ip
192.168.200.50 // VRRP H虛擬ip地址
}
}
備份服務(wù)器的keepalived.conf替換為:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_ server 192.168.200.129
smtp_connect_timeout 30
router_id LVS_DEVEL # LVS_DEVEL這字段在/etc/hosts文件中看;通過它訪問到主機(jī)
}
vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (檢測腳本執(zhí)行的間隔)2s
weight 2 #權(quán)重,如果這個腳本檢測為真,服務(wù)器權(quán)重+2
}
vrrp_instance VI_1 {
state MASTER # 備份服務(wù)器上將MASTER 改為BACKUP
interface ens33 #網(wǎng)卡名稱,可查看對應(yīng)服務(wù)器的網(wǎng)卡
virtual_router_id 51 # 主、備機(jī)的virtual_router_id必須相同
priority 10 #主、備機(jī)取不同的優(yōu)先級,主機(jī)值較大,備份機(jī)值較小
advert_int 1 #每隔1s發(fā)送一次心跳
authentication { # 校驗方式, 類型是密碼,密碼1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛擬ip
192.168.200.50 // VRRP H虛擬ip地址
}
}
2.4.3 編寫nginx監(jiān)測腳本
文件保存為bash類型,命名為:nginx_check.sh,也可以自定義文件名稱,腳本內(nèi)容如下:
#! /bin/bash
A=`ps -C nginx -no-header | wc - 1`
if [ $A -eq 0];then
/usr/local/nginx/sbin/nginx
sleep 2
if [`ps -C nginx --no-header| wc -1` -eq 0 ];then
killall keepalived
fi
fi
腳本可根據(jù)喜好來自定義文件夾存放,我這里存放于/usr/local/src/nginx_check.sh,注意一點的是,腳本存放的路徑必須與keepalived.conf中配置的腳本文件路徑一致。腳本路徑更改,則keepalived.conf中的路徑也要修改。
2.4.4 啟動keepalived
分別在兩臺服務(wù)器上執(zhí)行如下指令:
systemctl start keepalived.service
查看keepalived進(jìn)程是否運行,
ps -ef|grep keepalived
若運行成功,則會出現(xiàn)以下界面:
2.4.5 啟動nginx
在主服務(wù)器和從服務(wù)器上,分別利用nginx啟動命令啟動nginx服務(wù),在nginx安裝目錄下執(zhí)行如下指令:
./nginx
2.4.6 測試
1測試方案如下
(1)關(guān)閉主服務(wù)器上的nginx
在nginx安裝目錄下執(zhí)行如下指令:
./nginx -s stop
(2)訪問虛擬ip
在外部瀏覽器輸入:
192.168.200.50:80
若能正常彈出nginx歡迎頁面,則表明集群搭建成功,主服務(wù)器nginx宕機(jī)后,從服務(wù)器會代替服務(wù)。
3.小結(jié)
1.本文利用兩臺服務(wù)器模擬nginx集群狀態(tài),當(dāng)nginx master宕機(jī)后,從服務(wù)器會代替服務(wù);
2.模擬集群關(guān)鍵三要素:keepalived、監(jiān)測腳本、虛擬ip;
3.在某些情況下,需要為腳本添加可執(zhí)行權(quán)限,指令如下:
chmod +x /usr/local/src/nginx_check.sh #腳本地址根據(jù)實際情況而定
4.參考文獻(xiàn)
1.https://www.bilibili.com/video/BV1zJ411w7SV?t=85&p=1
2.https://juejin.cn/post/6844903956192182285
3.https://juejin.cn/post/6844903929738854413
4.https://juejin.cn/post/6844903585449246733
總結(jié)
原文鏈接:https://blog.csdn.net/qq_33479841/article/details/110939481
相關(guān)推薦
- 2022-04-03 Golang的第一個程序-Hello?World_Golang
- 2022-05-26 python中的getter與setter你了解嗎_python
- 2022-07-16 關(guān)于報錯 Error starting ApplicationContext. To display
- 2022-12-04 Android自定義View繪制貝塞爾曲線實現(xiàn)流程_Android
- 2022-04-12 【debug】error: no matching function for call to ‘ma
- 2022-06-01 Python使用xlrd和xlwt批量讀寫excel文件的示例代碼_python
- 2022-05-16 C語言中const和define的區(qū)別你了解嘛_C 語言
- 2023-03-20 C#?BeginInvoke實現(xiàn)異步編程方式_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支