Appearance
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 Hash | Session 親和性需求 |
效能調整: worker_rlimit_nofile 控制每個 worker 的最大 fd 數,必須搭配 OS 層級的 ulimit -n 或 /etc/security/limits.conf 一起調整,否則設定值無效。
關鍵要點
- HTTP 反向代理需正確傳遞
X-Real-IP與X-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 負載平衡
環境參數(實際部署值):
| 節點 | IP | Port |
|---|---|---|
| Node 1 | 10.22.101.201 | 6443 |
| Node 2 | 10.22.101.202 | 6443 |
| Node 3 | 10.22.101.203 | 6443 |
| Node 4 | 10.22.101.204 | 6443 |
| Node 5 | 10.22.101.205 | 6443 |
| 對外監聽 Port | — | 58002 |
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;
}
}相關概念
- Nginx Reverse Proxy to Self(反向代理回自身) — 同一台機器兩個 server block 分離入口邏輯
- Nginx 檔案服務 Server — Nginx autoindex 與 fancyindex 靜態目錄設定
- Gunicorn 原生 ASGI Worker — Nginx 反向代理 Gunicorn/FastAPI 的標準設定
- Shadowsocks Sidecar 代理 — TCP 代理的實務案例
來源
- DigitalOcean: How To Configure Nginx as a Reverse Proxy on Ubuntu 22.04 — 標準反向代理設定參考
- Nginx TCP/UDP Load Balancer 官方文件 — Stream 模組說明
- 原始素材:Nginx 反向代理與負載平衡設定