一般情況下,如果我們做小型項(xiàng)目垢粮,前端用一個(gè)nginx做反向代理即可贴届,大概是這樣的
但是,作為互聯(lián)網(wǎng)項(xiàng)目蜡吧,純2C的話必然需要做高可用毫蚓,不僅后端的Server有N個(gè),Nginx同樣需要有N個(gè)昔善,一主N備元潘,當(dāng)有一個(gè)服務(wù)器掛掉的時(shí)候,服務(wù)能瞬間切換到其他服務(wù)器君仆,大概是這樣的
下面就以上圖為例翩概,說(shuō)明一下如何實(shí)現(xiàn)server的高可用。
1返咱、準(zhǔn)備
虛擬機(jī)兩臺(tái)氮帐,同樣安裝nginx,keepalived洛姑,最簡(jiǎn)單的安裝方法yum -y install nginx,yum -y install keepalived皮服。如果找不到安裝到哪兒了楞艾,可以使用whereis nginx查看参咙,這里不再贅述。
網(wǎng)絡(luò)劃分如下
名稱 | IP | 虛擬IP | 操作系統(tǒng) |
---|---|---|---|
虛擬機(jī)1(VM1) | 192.168.136.2 | 192.168.136.99 | centos7.6 |
虛擬機(jī)2(VM2) | 192.168.136.4 | 192.168.136.99 | centos7.6 |
2硫眯、關(guān)閉防火墻蕴侧,修改nginx首頁(yè),啟動(dòng)nginx
- 關(guān)閉防火墻
systemctl stop firewalld.service #臨時(shí)關(guān)閉两入,重啟失效
systemctl disable firewalld.service #禁止開機(jī)啟動(dòng)
- 簡(jiǎn)單起見净宵,我們認(rèn)為每個(gè)nginx都是代理一個(gè)服務(wù),只用nginx默認(rèn)帶的靜態(tài)頁(yè)作為測(cè)試,分別修改頁(yè)面內(nèi)容為"Welcome to 192.168.136.4"和“Welcome to 192.168.136.2”
- 啟動(dòng)nginx
systemctl start nginx
3裹纳、修改keepalived的配置文件
主配置如下(默認(rèn)配置文件:/etc/keepalived/keepalived.conf):
! Configuration File for keepalived
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.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER # 標(biāo)識(shí)為主服務(wù)
interface ens33 #綁定虛擬機(jī)的IP
virtual_router_id 51 # 虛擬路由id择葡,和從機(jī)保持一致
#mcast_src_ip 192.168.126.2 #本機(jī)ip
priority 100 #權(quán)重,需要高于從機(jī)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 執(zhí)行 Nginx 監(jiān)控的服務(wù)
}
virtual_ipaddress {
192.168.136.99 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虛擬IP地址
# 192.168.200.17
# 192.168.200.18
}
}
從機(jī)配置(默認(rèn)配置文件:/etc/keepalived/keepalived.conf)
! Configuration File for keepalived
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.1
# smtp_connect_timeout 30
router_id dreamer1
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢測(cè) nginx 狀態(tài)的腳本路徑
interval 2 ## 檢測(cè)時(shí)間間隔
weight -20 ## 如果條件成立剃氧,權(quán)重-20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
#mcast_src_ip 192.168.136.4 ## 本機(jī) IP 地址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx ## 執(zhí)行 Nginx 監(jiān)控的服務(wù)
}
virtual_ipaddress {
192.168.136.99
#192.168.200.17
#192.168.200.18
}
}
3敏储、編寫監(jiān)測(cè)心跳腳本
上面配置中可以看到有一個(gè)腳本文件:/etc/keepalived/nginx_check.sh
查看nginx是否啟動(dòng),如果沒啟動(dòng)則啟動(dòng)朋鞍,如果啟動(dòng)不起來(lái)已添,停掉keepalived服務(wù),此時(shí)心跳斷掉滥酥,服務(wù)轉(zhuǎn)向另一個(gè)nginx更舞。
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
4、測(cè)試
- 啟動(dòng)192.168.136.2上的nginx和keepalive
- 啟動(dòng)192.168.136.4上的nginx和keepalive
-
訪問虛擬IP:http://192.168.136.99
-
停掉192.168.136.2上的keepalive
- 重新啟動(dòng)192.168.136.2上的keepalive坎吻,又會(huì)回到 Welcome to 192.168.136.2
-
停掉192.168.136.2上的nginx缆蝉,系統(tǒng)會(huì)自動(dòng)調(diào)回Welcome to 192.168.136.4
就是這樣。