眾所周知,Nginx 是一個廣受好評的 web 服務器,也可以用作反向代理,負載均衡器和 HTTP 緩存。keepalive 工作在虛擬路由器冗余協議 vrrp (Virtual Router Redundancy Protocol) 上,它允許一個靜態 IP 在兩個 linux 系統之間進行故障轉移。
在本文中,我們將演示如何在 Linux 中使用 keepalive 設置高可用 (HA) NGINX web 服務器。
實驗準備
- Node 1 – 192.168.1.130 – nginx1.example.com – minimal centos 8 / RHEL 8
- Node 2 – 192.168.1.140 – nginx2.example.com – minimal CentOS 8 / RHEL 8
- Virtual IP (VIP) – 192.168.1.150
- sudo user pkumar
- firewalld enbled
- SELinux Running
廢話不多說,讓我們直接進入安裝和配置步驟。
1) 安裝 NGINX Web Server
For CentOS 8 / RHEL 8
NGINX 軟件包在 CentOS 8 / RHEL 8 存儲庫默認可用,在兩個節點上運行如下命令
$ sudo dnf install -y nginx
For CentOS 7 / RHEL 7
NGINX 軟件包在 CentOS 7 / RHEL 7 存儲庫中默認不可用,我們必須啟用 epel 存儲庫,在兩個節點上運行以下命令
$ sudo yum install epel-release -y$ sudo yum install -y nginx
For Ubuntu / Debian
基于 Debian 的發行版,nginx 軟件包在存儲庫中默認可用,在兩個節點上運行如下命令
$ sudo apt update$ sudo apt install -y nginx
2) 為兩個節點自定義 index.html
讓我們為這兩個節點創建自定義 index.html,這樣我們就可以很容易地識別哪個服務器在通過虛擬 IP 訪問網站。
在 node 1 上,執行如下命令
[pkumar@nginx1 ~]$ echo "This is NGINX Web Server from Node 1" | sudo tee /usr/share/nginx/html/index.html
在 node 2 上,執行如下命令
[pkumar@nginx2 ~]$ echo "This is NGINX Web Server from Node 2" | sudo tee /usr/share/nginx/html/index.html
3) 放行 NGINX 端口并啟動其服務
如果防火墻已啟用,通過以下命令放行 80 端口
For CentOS / RHEL System
$ sudo firewall-cmd --permanent --add-service=http$ sudo firewall-cmd –reload
For Ubuntu / Debian System
$ sudo ufw allow 'Nginx HTTP'
啟動并啟用 nginx 服務
$ sudo systemctl start nginx$ sudo systemctl enable nginx
在外部運行 curl 命令測試兩個節點的 NGINX 服務器
$ curl http://192.168.1.130This is NGINX Web Server from Node 1$ curl http://192.168.1.140This is NGINX Web Server from Node 2
以上輸出確認 NGINX 正在運行,并且可以從外部通過系統的 IP 地址訪問。
4) 安裝配置 Keepalived
在兩個節點上安裝配置 Keepalived
For CentOS / RHEL systems
$ sudo dnf install -y keepalived // CentOS 8/ RHEL 8$ sudo yum install -y keepalived // CentOS 7 / RHEL 7
For Ubuntu / Debian System
$ apt install -y keepalived
本文中,Node 1 作為主節點,Node 2 作為從節點。
備份配置文件
[pkumar@nginx1 ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org
編輯配置文件
[pkumar@nginx1 ~]$ echo -n | sudo tee /etc/keepalived/keepalived.conf[pkumar@nginx1 ~]$ sudo vi /etc/keepalived/keepalived.conf
復制如下內容:
global_defs {# Keepalived process identifierRouter_id nginx# script to check whether Nginx is running or notVRRP_script check_nginx {script "/bin/check_nginx.sh"interval 2weight 50# Virtual interface - The priority specifies the order in which the assigned interface to take over in a failovervrrp_instance VI_01 {state MASTERinterface enp0s3virtual_router_id 151priority 110# The virtual ip address shared between the two NGINX Web Server which will floatvirtual_ipaddress {192.168.1.150/24track_script {check_nginxauthentication {auth_type AHauth_pass secret
現在創建一個帶有以下內容的腳本,它將檢查 nginx 服務是否正在運行。keepalive 將始終檢查 check_nginx.sh 腳本的輸出,如果它發現 nginx 服務停止或沒有響應,那么它將虛擬 ip 地址指向備份節點。
[pkumar@nginx1 ~]$ sudo vi /bin/check_nginx.sh#!/bin/shif [ -z "`pidof nginx`" ]; thenexit 1fi
保存并關閉文件,設置所需權限
[pkumar@nginx1 ~]$ sudo chmod 755 /bin/check_nginx.sh
使用 scp 命令把 keepalive .conf 和 check_nginx.sh 文件從 Node 1 復制到 Node 2
[pkumar@nginx1 ~]$ scp /etc/keepalived/keepalived.conf root@192.168.1.140:/etc/keepalived/[pkumar@nginx1 ~]$ scp /bin/check_nginx.sh root@192.168.1.140:/bin/
復制完成后,登錄到 Node 2,并在 keepalive .conf 文件中做一些更改。將 state 從 MASTER 更改為 BACKUP,并將 priority 設置為 100 降低優先級。
如果開啟防火墻,執行以下命令放行 VRRP(兩個節點都要執行)
For CentOS / RHEL Systems
$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent$ sudo firewall-cmd --reload
For Ubuntu / Debian Systems
在主節點 (Node 1) 上執行
$ sudo ufw allow to 224.0.0.18 comment 'VRRP Broadcast'$ sudo ufw allow from 192.168.1.140 comment 'VRRP Router'
在從節點 (Node 2) 上執行
$ sudo ufw allow to 224.0.0.18 comment 'VRRP Broadcast'$ sudo ufw allow from 192.168.1.130 comment 'VRRP Router'
啟動和開啟 keepalived 服務
$ sudo systemctl start keepalived$ sudo systemctl enable keepalived
驗證 keepalived 服務狀態
$ sudo systemctl status keepalived
驗證主節點上的 VIP (虛擬 ip 地址) 狀態,本例中 VIP 是 192.168.1.130
$ ip add show
以上輸出確認在主節點的 enp0s3 接口上配置了 VIP
5) Keepalive 和 NGINX 測試
使用虛擬 IP (192.168.1.150) 訪問 nginx 服務器,目前它應該會顯示 Node 1 頁面。
停止 Node 1 上的 NGINX 服務,看看虛擬 IP 是否從 Node 1 切換到 Node 2,這次它應該會顯示 Node 1 頁面。
[pkumar@nginx1 ~]$ sudo systemctl stop nginx[pkumar@nginx1 ~]$ ip add show
登錄到 Node 2,查看虛擬 IP 是否正確
[pkumar@nginx2 ~]$ ip add show
使用虛擬 IP (192.168.1.150) 訪問 nginx 服務器
漂亮,以上證實我們已經成功地設置了高可用的 NGINX Web 服務器。