📚Nginx學習筆記(六)—— Nginx反向代理
📌 一、反向代理核心概念
本質原理:
? 核心價值:
- 🛡? 安全屏障:隱藏后端服務器真實IP
- ?? 負載分發:均衡后端服務器流量
- 🚀 性能加速:集成緩存/壓縮等優化
- 🔧 統一入口:簡化客戶端訪問邏輯
?? 二、基礎配置語法
核心指令:
location /api/ {# 必需指令proxy_pass http://backend_server; # 轉發到上游服務器組# 請求頭控制proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 超時控制proxy_connect_timeout 3s; # 連接后端超時proxy_read_timeout 30s; # 讀取響應超時proxy_send_timeout 30s; # 發送請求超時
}
關鍵參數詳解:
指令 | 默認值 | 作用 |
---|---|---|
proxy_buffering | on | 啟用響應緩沖區(防后端阻塞) |
proxy_buffer_size | 4k/8k | 響應頭緩沖區大小 |
proxy_buffers | 8 4k/8k | 響應內容緩沖區數量及大小 |
proxy_redirect | off | 重定向URL修正開關 |
🧩 三、實戰配置案例
🔄 案例1:基礎反向代理(upstream + proxy_pass)
upstream backend {server 192.168.1.101:8080 weight=5; server 192.168.1.102:8080 max_fails=3;keepalive 32; # 啟用連接池
}server {location /service/ {proxy_pass http://backend; # 關鍵轉發指令# 連接優化proxy_http_version 1.1;proxy_set_header Connection "";}
}
📌 效果:
http://nginx-host/service/request → 轉發到 http://192.168.1.101:8080/request
🛡? 案例2:安全隔離實現
location /internal-api/ {# 物理隔離proxy_pass http://10.0.100.20; # 內網服務器# 安全控制allow 192.168.1.0/24; # 僅允許內網IPdeny all; proxy_hide_header Server; # 隱藏服務器標識# 防滲透proxy_cookie_path / "/; HttpOnly; Secure"; # Cookie安全加固
}
? 安全增強:
- 🔒 IP白名單過濾
- 🚫 隱藏服務指紋
- 🍪 強制Cookie安全策略
📶 案例3:基于IP的流量控制
# 定義限流區域(10MB空間,每秒10請求)
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;location /download/ {proxy_pass http://backend;# 限流配置limit_req zone=ip_limit burst=20; # 允許突發20請求limit_req_status 429; # 超限返回429狀態碼# 差異化限速if ($remote_addr ~ "192.168.1.100") {set $limit_rate 1m; # 特殊IP限速1MB/s}
}
📊 流量控制邏輯:
🚧 案例4:并發連接數限制
# 連接數計數區(1MB可記錄1.6萬IP)
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;server {location /api/ {proxy_pass http://backend;# 單IP最大5并發limit_conn conn_zone 5; limit_conn_status 503; # 超限返回503# 慢連接保護proxy_connect_timeout 2s; client_body_timeout 10s;}
}
🛠? 容錯機制:
# 故障轉移配置
proxy_next_upstream error timeout http_500 http_502; # 自動切換故障節點
proxy_next_upstream_tries 3; # 最大重試次數
?? 四、高階技巧與陷阱規避
🔧 技巧1:WebSocket代理
location /wsapp/ {proxy_pass http://backend;# WebSocket必需參數proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_read_timeout 3600s; # 長連接超時
}
🎭 技巧2:多路徑重寫規則
location ~ ^/service/(user|order)/(.*)$ {# 路徑重寫:/service/user/info → /api/user-service/inforewrite ^/service/(.*)/(.*)$ /api/$1-service/$2 break;proxy_pass http://backend;
}
? 常見陷阱:
-
502 Bad Gateway錯誤
# 解決方案:增加超時閾值 proxy_connect_timeout 5s; proxy_read_timeout 60s;
-
Cookie/Session丟失
# 添加原始主機頭 proxy_set_header Host $host; proxy_cookie_domain backend.example.com $host;
📊 五、調試與監控方案
# 專用調試日志格式
log_format proxy_debug '$remote_addr - $upstream_addr ''$status $upstream_response_time ''"$request" $body_bytes_sent';location /api/ {proxy_pass http://backend;# 注入調試頭add_header X-Backend-IP $upstream_addr;add_header X-Response-Time $upstream_response_time;# 記錄詳細日志access_log /var/log/nginx/proxy.log proxy_debug;
}
監控指標:
nginx.http.proxy.requests
:代理請求計數nginx.http.proxy.response_time
:后端響應時間nginx.http.proxy.failures
:失敗請求數
🔍 診斷命令:
tail -f /var/log/nginx/proxy.log | grep ' 502 ' nginx -T | grep -A20 "location /api/"