Skip to content

Nginx 反向代理與負載平衡設定

涵蓋兩種 Nginx 代理模式:標準 HTTP L7 反向代理與 TCP/UDP L4 負載平衡;Reverse Proxy to Self 請見 專文

概述

Nginx 在代理層面支援多種工作模式,滿足從典型 Web 應用部署到低層級 TCP/UDP 流量分發的各種需求。本文記錄兩種常用模式:

模式適用層典型情境
標準 HTTP 反向代理L7(應用層)Node.js / FastAPI / Gunicorn 前端入口
TCP/UDP 負載平衡L4(傳輸層)K8s API Server HA、資料庫、Shadowsocks

第三種模式「Reverse Proxy to Self」(同一台機器兩個 server block 分離入口邏輯)有獨立專文,請見 Nginx Reverse Proxy to Self

核心內容

標準 HTTP 反向代理

Nginx 作為前端入口,將 HTTP/HTTPS 請求代理至後端應用伺服器。核心設定為 proxy_pass 指定後端地址,搭配四個標準 Header 傳遞客戶端資訊。

四個必要 Header:

Header變數用途
Host$http_host傳遞原始 Host(含 port)
X-Real-IP$remote_addr客戶端真實 IP
X-Forwarded-For$proxy_add_x_forwarded_for代理鏈 IP 串列
X-Forwarded-Proto$scheme原始協定(http / https)

後端框架(FastAPI、Django 等)需要信任這些 Header 才能正確讀取客戶端 IP,例如 uvicorn 啟動時加 --proxy-headers,或 FastAPI 使用 trusted_hosts Middleware。

TCP/UDP L4 負載平衡

透過 ngx_stream_core_module(編譯 Nginx 時加 --with-stream,OpenResty 預設內建),Nginx 可在傳輸層進行四層代理,適合非 HTTP 協定:Kubernetes API Server 高可用、資料庫連線、Shadowsocks 等。

負載平衡演算法:

指令說明適用情境
預設(無指令)Round-robin 輪詢短連線、HTTP 請求
least_conn最少連線數優先長連線(推薦 K8s API Server)
hash $remote_addr依來源 IP HashSession 親和性需求

效能調整: worker_rlimit_nofile 控制每個 worker 的最大 fd 數,必須搭配 OS 層級的 ulimit -n/etc/security/limits.conf 一起調整,否則設定值無效。

關鍵要點

  • HTTP 反向代理需正確傳遞 X-Real-IPX-Forwarded-For,後端才能識別真實客戶端 IP
  • L4 Load Balancer 需在編譯時啟用 --with-stream;OpenResty 已預設內建,無需額外編譯
  • least_conn 適合長連線場景(如 Kubernetes API Server),避免 Round-robin 讓慢連線節點積壓
  • worker_rlimit_nofile 需搭配 OS 層設定同步調整,單獨設定 Nginx 不會生效

實際應用

  • FastAPI / Gunicorn 部署:Nginx 作反向代理入口,詳見 Gunicorn 原生 ASGI Worker
  • K3s HA API Server:以 Nginx Stream 負載平衡多個 control plane 節點,對外暴露統一的 API 端點
  • Shadowsocks 代理鏈:TCP 透通代理,詳見 Shadowsocks Sidecar 代理

部署設定參考

以下為實際部署時使用的完整設定,供日後查詢與複製使用。

情境 A:標準 HTTP 反向代理

nginx
server {
    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain;

    location / {
        proxy_pass app_server_address;

        proxy_set_header Host              $http_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;
    }
}

情境 B:K3s API Server L4 負載平衡

環境參數(實際部署值):

節點IPPort
Node 110.22.101.2016443
Node 210.22.101.2026443
Node 310.22.101.2036443
Node 410.22.101.2046443
Node 510.22.101.2056443
對外監聽 Port58002
nginx
worker_rlimit_nofile 300000;

events {
    worker_connections 50000;
}

stream {
    upstream k3s_servers {
        least_conn;

        server 10.22.101.201:6443;
        server 10.22.101.202:6443;
        server 10.22.101.203:6443;
        server 10.22.101.204:6443;
        server 10.22.101.205:6443;
    }

    server {
        listen 58002;
        proxy_pass k3s_servers;
    }
}

相關概念

來源