Roy-Try-Catch
← Back to list

【Nginx】實作Nginx負載平衡(Nginx Load Balance)

Roy • Updated 2026-10-15 16:02:37

更新提醒(2026-10):本文寫於 2022 年,範例中的 ssl_protocols 仍啟用 TLSv1 與 TLSv1.1。這兩個版本已被 RFC 8996 正式棄用,較新的 Nginx 與 OpenSSL 預設也可能不再接受,建議改為只啟用 TLSv1.2 與 TLSv1.3。若你的後台需要存取保護,也可參考 【資安】Cloudflare Access 實戰:不用 VPN 保護後台與 Grafana。

Nginx 提供了以下三種負載平衡(load balancing)方法

  1. round-robin:預設值,會將請求輪流平均分配到每台伺服器上
  2. least-connected:會將請求分配到目前連線數最少的伺服器上
  3. ip-hash:利用 hash function 來決定使用者要被分配到哪台伺服器,這個方法可以讓同一個使用者(IP address)每次連線到的伺服器都相同

實作環境

Load Balancer
IP:192.168.0.1
Web Server 1
IP:192.168.0.2
Web Server 2
IP:192.168.0.3

Web Server 設定

server {
    listen 80;
    server_name {server_name};
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}

Load Balancer 設定

架構圖:瀏覽器經 HTTPS 連到 Nginx Load Balancer,由 upstream balancer 依權重 3 比 2 分流給兩台 Web Server,下方列出三種負載平衡方法。

upstream balancer 依 weight 分流給兩台伺服器,分流方法另有三種。

upstream balancer {
    server 192.168.0.2 weight=3;
    server 192.168.0.3 weight=2;
}
server {
    listen 443 ssl;
    server_name {server_name};
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    ssl_certificate {ssl_certificate};
    ssl_certificate_key {ssl_certificate_key};
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    location / {
        proxy_pass http://balancer;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Host 設定

vi /etc/nginx/conf.d/default.conf
{server_name} 192.168.0.2
{server_name} 192.168.0.3

Comments

No comments yet.

請先登入