基於 Nginx 的大型網際網路叢集架構與實戰方案

风轻雪棉發表於2024-10-10

1. Nginx 負載均衡基礎配置

首先,搭建一個基礎的 Nginx 負載均衡器,用於將流量分發到多個後端伺服器上。

步驟 1.1:安裝 Nginx

在每臺要作為負載均衡器的伺服器上,安裝 Nginx。可以使用包管理工具進行安裝,例如在 Ubuntu 上執行以下命令:

sudo apt update
sudo apt install nginx

步驟 1.2:配置 Nginx 負載均衡

Nginx 的核心是配置檔案 nginx.conf,我們可以在其中定義後端伺服器池以及負載均衡策略。以下是一個簡單的 Nginx 負載均衡配置:

# 定義一個名為 backend 的後端伺服器池
upstream backend {
server backend1.example.com weight=5; # 設定權重
server backend2.example.com weight=3;
server backend3.example.com weight=2;

# 啟用健康檢查(需要 Nginx Plus 支援開箱配置,開源版本需要第三方模組)
# Nginx Plus 示例:
health_check interval=10s fails=3 passes=2;
}

# 配置 HTTP 伺服器
server {
listen 80;
server_name loadbalancer.example.com;

location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

配置詳解:

  • upstream 指令:定義了後端伺服器池(backend),併為各伺服器分配了不同的權重,Nginx 根據權重將流量按照比例分發到後端伺服器。

  • 健康檢查:此配置會定期檢查後端伺服器是否可用,確保當某個伺服器當機時,不會繼續向其傳送請求。

  • proxy_pass:將客戶端請求代理到後端伺服器池。

步驟 1.3:啟動和測試 Nginx

確保配置無誤後,啟動或重啟 Nginx 服務:

sudo nginx -t  # 測試配置檔案是否正確
sudo systemctl restart nginx # 重啟 Nginx

測試:透過訪問 http://loadbalancer.example.com,驗證請求是否被均勻分發到後端伺服器。

2. 高可用性配置(Keepalived + Nginx)

單獨使用 Nginx 進行負載均衡仍然會面臨單點故障問題。如果前端的 Nginx 當機,整個服務將不可用。因此,我們需要透過 Keepalived 實現高可用的 Nginx 叢集。

步驟 2.1:安裝 Keepalived

在每臺 Nginx 伺服器上安裝 Keepalived。以 Ubuntu 為例:

sudo apt install keepalived

步驟 2.2:配置 Keepalived

Keepalived 透過虛擬 IP 地址(VIP)實現故障轉移。當主伺服器當機時,VIP 自動切換到備用伺服器,確保服務的高可用性。

在主 Nginx 伺服器上,編輯 Keepalived 的配置檔案 /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state MASTER # 主伺服器
interface eth0 # 網路介面
virtual_router_id 51
priority 100 # 主伺服器優先順序較高
advert_int 1 # 廣播間隔
authentication {
auth_type PASS
auth_pass 123456 # 密碼
}
virtual_ipaddress {
192.168.0.100 # 虛擬IP地址
}
track_script {
chk_nginx # 監控 Nginx 狀態的指令碼
}
}

在備用 Nginx 伺服器上,將 state 設定為 BACKUP,並將 priority 設定為較低的值,例如 90。

步驟 2.3:監控 Nginx 狀態

Keepalived 可以透過監控 Nginx 的執行狀態來決定是否切換 VIP。建立一個監控指令碼 /etc/keepalived/check_nginx.sh

#!/bin/bash
if ! pidof nginx > /dev/null
then
systemctl stop keepalived # 如果 Nginx 停止,關閉 Keepalived 以觸發 VIP 切換
fi

將此指令碼新增為可執行:

sudo chmod +x /etc/keepalived/check_nginx.sh

在 Keepalived 的配置檔案中新增監控指令碼:

vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
}

步驟 2.4:啟動 Keepalived

完成配置後,啟動或重啟 Keepalived 服務:

sudo systemctl restart keepalived

測試:關閉主伺服器的 Nginx,VIP 應該自動切換到備用伺服器,確保服務不中斷。

3. Nginx 健康檢查和動態擴充套件

Nginx 可以結合健康檢查功能,確保只有狀態正常的伺服器參與負載均衡。另外,動態擴充套件是應對突發流量的關鍵。以下是相關配置和實戰方案。

步驟 3.1:配置健康檢查(開源版本)

Nginx 開源版本不自帶健康檢查模組,可以透過第三方模組(如 ngx_http_healthcheck_module)實現健康檢查。假設已安裝此模組,配置如下:

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;

# 使用第三方模組實現健康檢查
check interval=5000 rise=2 fall=5 timeout=2000;
}

步驟 3.2:動態擴充套件後端伺服器

結合容器化技術(如 Docker 或 Kubernetes),可以根據流量自動擴充套件後端伺服器。例如,在 Kubernetes 叢集中可以使用 Horizontal Pod Autoscaler (HPA) 自動擴充套件應用服務的副本數。

以下是在 Kubernetes 中配置自動擴充套件的示例:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: backend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 70 # 當 CPU 利用率超過 70% 時擴容

透過這種方式,後端服務可以根據負載動態擴充套件,Nginx 透過配置服務發現機制可以自動識別新的後端伺服器。

4. Nginx SSL/TLS 配置

在生產環境中,啟用 HTTPS 是必不可少的。以下是啟用 SSL/TLS 的配置:

步驟 4.1:生成或獲取 SSL 證書

使用 Let's Encrypt 生成免費的 SSL 證書:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com

步驟 4.2:配置 Nginx 使用 SSL

server {
listen 443 ssl;
server_name yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

# 自動將 HTTP 請求重定向到 HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}

總結

透過 Nginx 的負載均衡、Keepalived 實現高可用、動態擴充套件後端伺服器以及健康檢查,構建了一個高效、可擴充套件且高可用的網際網路叢集架構。

相關文章