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;
}
常見問題
-
502 Bad Gateway 錯誤: 通常後端服務未啟動或監聽端口錯誤。請檢查
systemctl status <your-app>確認服務狀態,並驗證proxy_pass的 IP 和端口是否正確。 -
WebSocket 連線斷開: 若未設置
proxy_http_version 1.1和Upgrade頭部,Nginx 會將 WebSocket 視為普通 HTTP 請求,導致連線立即關閉。務必檢查上述第 4 點設定。
小結
Nginx 反向代理的強大之處在於其高度的可配置性。從基礎的流量轉發到複雜的負載平衡與安全防護,透過組合上述 10 種場景,你可以構建出穩定且高效的 Web 架構。建議在生產環境部署前,使用 nginx -t 測試配置語法,並透過 curl -I 驗證響應頭部,確保設定符合預期。