1. 概述
Nginx 可以用來作為反向代理伺服器,來提供負載均衡的能力,使我們的 Web 伺服器,能夠水平擴容,進而處理更多的使用者請求。
但是反向代理伺服器又變成了一個單點,當反向代理伺服器掛了,整合 Web 伺服器就不能被外界存取到,所以我們必須要保證反向代理伺服器的高可用。
而 Keepalived 是一種高效能的伺服器高可用或熱備解決方案,可以用來防止伺服器單點故障的發生,透過配合 Nginx 可以實現 Web 前端服務的高可用。
2. 方案規劃
注:VIP 為虛擬 IP ,不被佔用前提下可自訂。
VIP | 伺服器 IP | 主機名 | nginx 埠 | 預設主從 |
---|---|---|---|---|
192.168.5.200 | 192.168.5.249 | ethan3 | 80 | MASTER |
192.168.5.200 | 192.168.5.103 | localhost.localdomain | 80 | BACKUP |
3. 外網使用者方案
3.1 安裝 Nginx
兩個伺服器上安裝配置 Nginx 。具體步驟請參見:Linux系統安裝配置Nginx
3.2 安裝 Keepalived
兩個伺服器上安裝 Keepalived 。
執行命令:
yum -y install keepalived
3.3 設定 keepalived 服務開機啟動
兩個伺服器都需要執行下面語句。語句如下所示:
chkconfig keepalived on
3.4 修改 Keepalived 的配置檔案
路徑為:/etc/keepalived/keepalived.conf
3.4.1 MASTER 節點配置檔案
! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。 建議用獨立的監視或第三方 SMTP
router_id ethan3 ## 標識本節點的字條串,通常為 hostname
}
## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先。如果腳本執行結果為 0,並且 weight 配置的值大於 0,則優先相應的增加。如果腳本執行結果非 0,並且 weight配置的值小於 0,則優先相應的減少。其他情況,維持原本配置的優先,即配置檔案中 priority 對應的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 檢查 nginx 狀態的腳本路徑
interval 2 ## 檢查時間間隔
weight -20 ## 如果條件成立,權重-20
}
## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
state MASTER ## 主節點為 MASTER, 對應的備份節點為 BACKUP
interface eno16777736 ## 綁定虛擬 IP 的網路API,與本機 IP 地址所在的網路API相同。
virtual_router_id 33 ## 虛擬路由的 ID 號, 兩個節點設定必須一樣, 可選 IP 最後一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址
mcast_src_ip 192.168.5.249 ## 本機 IP 地址
priority 200 ## 節點優先, 值範圍 0-254, MASTER 要比 BACKUP 高
advert_int 1 ## 組播資訊傳送間隔,兩個節點設定必須一樣, 預設 1s
## 設定驗證資訊,兩個節點必須一致
authentication {
auth_type PASS
auth_pass 1111 ## 真實生產,按需求對應該過來
}
## 將 track_script 塊加入 instance 配置塊
track_script {
chk_nginx ## 執行 Nginx 監視的服務
} #
# 虛擬 IP 池, 兩個節點設定必須一樣
virtual_ipaddress {
192.168.5.200 ## 虛擬 ip,可以定義多個
}
}
3.4.2 BACKUP 節點配置檔案
! Configuration File for keepalived
global_defs {
router_id localhost.localdomain
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 33
mcast_src_ip 192.168.5.103
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.5.200
}
}
需要注意的配置說明:
1)router_id ethan3 ## 標識本節點的字條串,通常為 hostname 。
在伺服器中使用語句hostname可得出。如下圖所示:
2)script "/etc/keepalived/nginx_check.sh" ## 檢查 nginx 狀態的腳本路徑,無需修改,參考本文 3.5 節。
3)state MASTER/BACKUP ##說明主備。
4)interface eno16777736 ## 綁定虛擬 IP 的網路API,與本機 IP 地址所在的網路API相同。
使用ip a可得出。如下圖所示:
注:主節點配置檔案中該值為主節點網卡號;備節點配置檔案中該值為備節點網卡號。
5)mcast_src_ip 192.168.5.249 ## 本機 IP 地址。
6)priority 200 ## 節點優先, 值範圍 0-254, MASTER 要比 BACKUP 高。
7)virtual_ipaddress ##虛擬 ip,即VIP,可自訂,可定義多個。
3.5 編寫 Nginx 狀態啟動腳本
兩個伺服器上都需要編寫下面檔案,根據實際情況修改 nginx 路徑。
編寫 Nginx 狀態檢查腳本 /etc/keepalived/nginx_check.sh (已在 Keepalived.conf 中配置)腳本要求。
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
賦予檔案權限:chmod +x /etc/keepalived/nginx_check.sh
3.6 啟動 Keepalived
兩個伺服器都執行下面語句:
systemctl start keepalived
3.7 效果查看
注:節點上有虛擬 IP 時,可透過虛擬 IP 存取相應的 nginx 及下面相應的檔案。
1)使用ip addr語句,可以看到虛擬 IP 192.168.5.200 綁定在了 MASTER 伺服器上面。如下圖所示:
而 BACKUP 節點上沒有虛擬 IP 。如下圖所示:
2)使用systemctl stop keepalived停掉主節點的 keepalived 服務,備節點上有虛擬 IP 。如下圖所示:
4. 內網使用者方案
4.1 步驟說明
內網使用者無法線上安裝 Keepalived ,與外網使用者方案不同點在於 3.2 節,其他步驟相同。
4.2 離線安裝 Keepalived
兩個伺服器都需要做下面步驟。
4.2.1 安裝步驟
1)下載安裝包。存取地址:https://www.keepalived.org/download.html 並下載 Keepalived 的安裝包。
2)解壓安裝。
將安裝包上傳到伺服器某個資料夾下(文檔範例為:/wendy),進入安裝包所在資料夾後,進行下面操作:
cd /wendy
tar -zxvf keepalived-2.0.18.tar.gz # 解壓
cd /wendy/keepalived-2.0.18 # 路徑根據實際情況修改
./configure --prefix=/usr/local/keepalived # 編譯
make && make install # 安裝
4.2.2 將 Keepalived 安裝成 Linux 系統服務
1)複製keepalived.conf檔案到/etc/keepalived/下。
mkdir /etc/keepalived
cp /wendy/keepalived-2.0.18/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
2)複製 keepalived 服務腳本到預設地址:
cp /wendy/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp /wendy/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/