Nginx 反向代理的 10 種設定場景 文章首圖

Nginx 反向代理的 10 種設定場景

Nginx 反向代理的 10 種設定場景

在現代 Web 架構中,Nginx 不僅是高效的靜態檔案伺服器,更是處理流量分發、負載平衡與安全防護的核心樞紐。對於中階 Linux 使用者而言,掌握 Nginx 反向代理(Reverse Proxy)的多種情境設定,能大幅提升系統的靈活性與安全性。本文將介紹 10 種最實用的 Nginx 反向代理場景,幫助你應對各種複雜的網路架構需求。

1. 基礎反向代理:將域名指向內部服務

這是最常見的應用,例如將 example.com 的流量轉發到本地的 8080 端口(如 Node.js 或 Python 應用)。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

重點: proxy_set_header 確保後端伺服器能獲取真實客戶端 IP,而非 Nginx 的 IP。

2. HTTPS 終止與重定向

處理 SSL 終止,並將所有 HTTP 流量強制重定向至 HTTPS,確保通訊安全。

# HTTP 重定向
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 配置
server {
    listen 443 ssl;
    server_name example.com;

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

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

3. 基於路徑的多服務分發

在單一 IP 上運行多個應用,例如 /api 指向後端 API,/ 指向前端靜態頁面。

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
    }

    location / {
        root /var/www/html;
        index index.html;
    }
}

4. WebSocket 支援

針對需要長連線的應用(如聊天室、即時通知),必須正確傳遞 WebSocket 頭部。

location /ws/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

5. 負載平衡:輪詢模式

將流量均勻分發到多個後端實例。

upstream backend_servers {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
    }
}

6. 基於權重的負載平衡

根據伺服器性能分配不同比例的流量,例如一台高性能伺服器處理 70% 流量。

upstream backend_servers {
    server 127.0.0.1:8080 weight=7;
    server 127.0.0.1:8081 weight=3;
}

7. 健康檢查與故障轉移

當主節點失效時,自動將流量切換至備用節點(需配合 nginx_upstream_check_module 或使用 Nginx Plus,開源版可透過 max_fails 實現基本容錯)。

upstream backend_servers {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:8081 backup; # 僅在主節點全 fail 時啟用
}

8. 靜態檔案快取優化

針對靜態資源(CSS、JS、圖片)設置長期快取,減少伺服器壓力。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    root /var/www/html;
}

9. 限流與防護 DDoS

防止惡意請求耗盡資源,限制每秒請求數。

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    listen 80;
    server_name example.com;

    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://127.0.0.1:8080;
    }
}

10. 內部網路隔離與白名單

僅允許特定 IP 訪問管理後台,保護敏感接口。

location /admin/ {
    allow 192.168.1.100; # 允許的管理員 IP
    deny all;            # 拒絕其他所有 IP
    proxy_pass http://127.0.0.1:9090;
}

常見問題

  1. 502 Bad Gateway 錯誤: 通常後端服務未啟動或監聽端口錯誤。請檢查 systemctl status <your-app> 確認服務狀態,並驗證 proxy_pass 的 IP 和端口是否正確。

  2. WebSocket 連線斷開: 若未設置 proxy_http_version 1.1Upgrade 頭部,Nginx 會將 WebSocket 視為普通 HTTP 請求,導致連線立即關閉。務必檢查上述第 4 點設定。

小結

Nginx 反向代理的強大之處在於其高度的可配置性。從基礎的流量轉發到複雜的負載平衡與安全防護,透過組合上述 10 種場景,你可以構建出穩定且高效的 Web 架構。建議在生產環境部署前,使用 nginx -t 測試配置語法,並透過 curl -I 驗證響應頭部,確保設定符合預期。