在現代網路應用中,高用性是確保服務穩定執行的關鍵。本文將探討如何使用 NGINX Plus 建立高用性架構,並確保組態設定在多個伺服器之間保持一致。首先,我們會使用 Keepalived 實作 NGINX Plus 的主備容錯移轉,避免單點故障。接著,我們將介紹如何利用 DNS 輪詢在多個 NGINX 伺服器之間分配流量,進一步提升系統的容錯能力。最後,我們將探討 NGINX Plus 的組態同步功能,確保所有伺服器上的設定保持一致,並簡述 NGINX Plus 的進階監控工具,例如 stub status、監控儀錶板和 Zone Sync,以協助工程師快速診斷和解決問題,維持系統穩定執行。
高用性佈署模式
簡介
容錯架構將系統劃分為相同的、獨立的堆積疊。像 NGINX 這樣的負載平衡器被用來分配負載,確保所提供的資源得到充分利用。高用性的核心概念是在多個活動節點之間進行負載平衡,或者使用主備容錯移轉。高用性的應用程式沒有單點故障;每個元件都必須使用其中一個概念,包括負載平衡器本身。對於我們來說,這意味著 NGINX。NGINX 的設計可以在兩種組態中工作:多個活動節點或主備容錯移轉。本章詳細介紹瞭如何執行多個 NGINX 伺服器以確保負載平衡層的高用性。
NGINX Plus 高用性模式
問題
您需要在本地佈署中實作高用性(HA)負載平衡解決方案。
解決方案
使用 NGINX Plus 的 HA 模式與 keepalived,透過在兩個或多個系統上從 NGINX Plus 儲存函式庫安裝 nginx-ha-keepalived 軟體包:
$ sudo apt update
$ sudo apt install -y nginx-ha-keepalived
使用 nginx-ha-setup 指令碼在每個系統上引導 keepalived 組態檔案,並按照提示進行操作:
$ sudo nginx-ha-setup
檢視由 nginx-ha-setup 命令生成的組態檔案:
$ sudo cat /etc/keepalived/keepalived.conf
global_defs {
vrrp_version 3
}
vrrp_script chk_manual_failover {
script "/usr/lib/keepalived/nginx-ha-manual-failover"
interval 10
weight 50
}
vrrp_script chk_nginx_service {
script "/usr/lib/keepalived/nginx-ha-check"
interval 3
weight 50
}
vrrp_instance VI_1 {
interface eth0
priority 101
virtual_router_id 51
advert_int 1
accept
garp_master_refresh 5
garp_master_refresh_repeat 1
unicast_src_ip 172.17.0.2/16
unicast_peer {
172.17.0.4
}
virtual_ipaddress {
172.17.0.3
}
track_script {
chk_nginx_service
chk_manual_failover
}
notify "/usr/lib/keepalived/nginx-ha-notify"
}
內容解密:
此組態檔案定義了 keepalived 的執行引數。其中包括:
vrrp_version 3:指定使用的 VRRP 版本。vrrp_script:定義了兩個指令碼,chk_manual_failover和chk_nginx_service,用於檢查 NGINX 服務的狀態和手動容錯移轉。vrrp_instance VI_1:定義了一個 VRRP 例項,指定了介面、優先順序、虛擬路由器 ID 等引數。virtual_ipaddress:定義了虛擬 IP 地址。
測試組態的健康檢查指令碼,以確保節點是健康的:
$ sudo /usr/lib/keepalived/nginx-ha-check
nginx is running.
在輔助節點上,轉儲 VRRP 擴充套件統計資訊和資料到檔案系統,並檢視輸出:
$ sudo service keepalived dump
Dumping VRRP stats (/tmp/keepalived.stats) and data (/tmp/keepalived.data)
$ sudo cat /tmp/keepalived.stats
VRRP Instance: VI_1
Advertisements:
Received: 1985
Sent: 0
Became master: 0
Released master: 0
Packet Errors:
Length: 0
TTL: 0
Invalid Type: 0
Advertisement Interval: 0
Address List: 0
Authentication Errors:
Invalid Type: 0
Type Mismatch: 0
Failure: 0
Priority Zero:
Received: 0
Sent: 0
內容解密:
此輸出顯示了 VRRP 例項的統計資訊,包括接收和傳送的廣告數量、成為主節點的次數等。
強制主節點發生狀態變更:
$ sudo service keepalived stop
Stopping keepalived: keepalived.
再次在輔助節點上,轉儲 VRRP 擴充套件統計資訊和資料到檔案系統,並檢視輸出:
$ sudo service keepalived dump
Dumping VRRP stats (/tmp/keepalived.stats) and data (/tmp/keepalived.data)
$ sudo cat /tmp/keepalived.stats
VRRP Instance: VI_1
Advertisements:
Received: 1993
Sent: 278
Became master: 1
Released master: 0
Packet Errors:
Length: 0
TTL: 0
Invalid Type: 0
Advertisement Interval: 0
Address List: 0
Authentication Errors:
Invalid Type: 0
Type Mismatch: 0
Failure: 0
Priority Zero:
Received: 0
Sent: 0
內容解密:
此輸出顯示了輔助節點成為主節點後的統計資訊。
使用 DNS 負載平衡負載平衡器
問題
您需要在兩個或多個 NGINX 伺服器之間分配負載。
解決方案
使用 DNS 對 NGINX 伺服器進行輪詢,透過向 DNS A 記錄新增多個 IP 地址。
此流程圖示說明 DNS 輪詢過程:
此圖示展示了 DNS 輪詢的工作原理。
NGINX Plus 組態同步化
在高用性(HA)環境中執行 NGINX Plus 時,需要同步多台伺服器的組態設定。本章節將介紹如何使用 NGINX Plus 專屬的組態同步功能來達成此目標。
問題描述
您正在執行一個 HA NGINX Plus 環境,需要在多台伺服器之間同步組態設定。
解決方案
使用 NGINX Plus 的組態同步功能。以下是設定步驟:
安裝 nginx-sync 套件
從 NGINX Plus 套件儲存函式庫安裝nginx-sync套件。- 使用 YUM 套件管理器:
$ sudo yum install nginx-sync - 使用 APT 套件管理器:
$ sudo apt install nginx-sync
- 使用 YUM 套件管理器:
設定 SSH 金鑰驗證
在主節點上為 root 使用者產生 SSH 金鑰對,並取得公鑰:$ sudo ssh-keygen -t rsa -b 2048 $ sudo cat /root/.ssh/id_rsa.pub將公鑰分發到其他節點的
authorized_keys檔案中,並指定只允許從主節點的 IP 位址進行連線:$ sudo echo 'from="192.168.1.2" ssh-rsa AAAAB3Nz4rFgt...vgaD root@node1' >> /root/.ssh/authorized_keys修改
/etc/ssh/sshd_config以允許 root 使用者無密碼登入,並重新載入 sshd 服務:$ sudo echo 'PermitRootLogin without-password' >> /etc/ssh/sshd_config $ sudo service sshd reload驗證 SSH 連線
確認主節點可以無密碼 SSH 到其他節點:$ sudo ssh [email protected]建立組態同步檔案
在主節點上建立/etc/nginx-sync.conf檔案,內容如下:NODES="node2.example.com node3.example.com node4.example.com" CONFPATHS="/etc/nginx/nginx.conf /etc/nginx/conf.d" EXCLUDE="default.conf"NODES:指定要同步的對等節點。CONFPATHS:指定要同步的組態檔案或目錄。EXCLUDE:指定要排除的組態檔案。
設定解析
此範例中,主節點會將主要的 NGINX 組態檔案和 /etc/nginx/conf.d 目錄中的檔案同步到 node2.example.com、node3.example.com 和 node4.example.com。如果同步過程中發現名為 default.conf 的檔案,將不會被推播到對等節點,因為它被組態為排除專案。
高階設定引數
NGINX Plus 的組態同步功能還提供其他進階設定引數,例如:
- 自訂 NGINX、RSYNC、SSH 和 diff 二進位制檔案的位置。
- 設定鎖設定檔案位置和備份目錄。
- 使用 sed 對給定的檔案進行範本化處理。
更多關於進階引數的資訊,請參閱 NGINX 檔案中關於叢集內 NGINX 組態同步的部分。
測試您的設定
完成上述設定後,請測試您的組態同步功能是否正常運作,以確保所有 NGINX Plus 節點的組態保持一致。
NGINX Plus 高階功能與監控
12.5 狀態分享與 NGINX Plus Zone Sync
問題描述
在高用性伺服器叢集中,需要 NGINX Plus 同步其分享記憶體區域。
解決方案
組態 Zone Synchronization,然後在組態 NGINX Plus 分享記憶體區域時使用 sync 引數:
stream {
resolver 10.0.0.2 valid=20s;
server {
listen 9000;
zone_sync;
zone_sync_server nginx-cluster.example.com:9000 resolve;
# ... 安全措施
}
}
http {
upstream my_backend {
zone my_backend 64k;
server backends.example.com resolve;
sticky learn zone=sessions:1m
create=$upstream_cookie_session
lookup=$cookie_session
sync;
}
server {
listen 80;
location / {
proxy_pass http://my_backend;
}
}
}
內容解密:
- zone_sync 組態:在
stream區塊中設定zone_sync,指定 NGINX Plus 作為 Zone Sync 伺服器,監聽在 9000 埠。 - zone_sync_server 指令:指定其他 NGINX Plus 伺服器的地址,可以使用網域名稱解析實作動態叢集。
- upstream 區塊中的 sync 引數:在
http區塊的upstream組態中,啟用sync以同步分享記憶體區域,如粘性會話(sticky-learn sessions)。
第 13 章 高階活動監控
13.0 簡介
為了確保應用程式執行最佳,需要深入瞭解其活動監控指標。NGINX 提供多種監控選項,如 stub status、進階監控儀錶板和 NGINX Plus 中的 JSON 資料流。
13.1 啟用 NGINX Stub Status
問題描述
需要為 NGINX 啟用基本監控。
解決方案
在 NGINX HTTP 伺服器的 location 區塊中啟用 stub_status 模組:
location /stub_status {
stub_status;
allow 127.0.0.1;
deny all;
# 按需設定 IP 限制
}
測試組態:
$ curl localhost/stub_status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
內容解密:
- stub_status 資訊:提供活動連線數、總連線數、已處理連線數和請求數等資訊。
- 安全性:預設只允許本地存取,以確保安全。
13.2 啟用 NGINX Plus 監控儀錶板
問題描述
需要深入的 NGINX Plus 伺服器流量指標。
解決方案
使用實時活動監控儀錶板:
server {
# ...
location /api {
api write=on;
# API 存取限制指令
# 見第7章
}
location = /dashboard.html {
root /usr/share/nginx/html;
}
}
內容解密:
- API 組態:啟用
api以提供寫入功能,並限制存取。 - 儀錶板服務:從
/usr/share/nginx/html提供靜態內容/dashboard.html。 - 儀錶板功能:提供系統概覽、HTTP Zones、Upstreams、TCP/UDP Zones 和 Caches 等詳細資訊。
圖表說明:NGINX Plus 狀態儀錶板
此圖示展示了 NGINX Plus 狀態儀錶板的結構,包括 HTTP Zones、Upstreams 和 Caches 等資訊頁面。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title NGINX Plus 高用性佈署與組態同步
package "系統架構" {
package "前端層" {
component [使用者介面] as ui
component [API 客戶端] as client
}
package "後端層" {
component [API 服務] as api
component [業務邏輯] as logic
component [資料存取] as dao
}
package "資料層" {
database [主資料庫] as db
database [快取] as cache
}
}
ui --> client : 使用者操作
client --> api : HTTP 請求
api --> logic : 處理邏輯
logic --> dao : 資料操作
dao --> db : 持久化
dao --> cache : 快取
note right of api
RESTful API
或 GraphQL
end note
@enduml
圖表內容解密:
- NGINX Plus 狀態儀錶板:提供系統的整體概覽。
- 各分頁功能:分別展示不同層面的監控資料,如 HTTP 請求、TCP/UDP 流量的詳細統計。