Nginx 作為代理服務器時,主要用于反向代理(最常用,轉發客戶端請求到后端服務)或正向代理(較少用,為客戶端提供訪問外部網絡的代理)。以下是兩種場景的具體配置示例:
一、反向代理配置(最常用)
反向代理是 Nginx 最核心的功能之一,用于將客戶端請求轉發到后端的應用服務器(如 Java、Node.js、Python 服務等),可隱藏后端服務地址、實現負載均衡、SSL 終結等。
基礎配置示例(代理單個后端服務)
# 全局配置
worker_processes auto; # 自動設置工作進程數(通常等于CPU核心數)
events {worker_connections 1024; # 每個工作進程的最大連接數
}http {include mime.types; # 引入MIME類型映射default_type application/octet-stream;# 反向代理核心配置server {listen 80; # 監聽80端口(HTTP)server_name example.com; # 代理服務器域名(客戶端訪問的域名)# 所有請求都轉發到后端服務location / {# 后端服務地址(協議://IP:端口,如Node.js服務、Java服務等)proxy_pass http://127.0.0.1:3000; # 傳遞客戶端真實IP和請求頭(重要)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_set_header X-Forwarded-Proto $scheme;# 超時設置(按需調整)proxy_connect_timeout 60s; # 連接后端超時proxy_read_timeout 60s; # 讀取后端響應超時proxy_send_timeout 60s; # 發送請求到后端超時}}
}
配置說明:
-
proxy_pass
:指定后端服務地址(必須),格式為協議://IP:端口
或協議://域名
。- 示例:
proxy_pass http://127.0.0.1:3000
表示轉發到本地3000端口的服務。 - 注意:
proxy_pass
后是否帶/
影響路徑拼接(見下方“路徑匹配規則”)。
- 示例:
-
proxy_set_header
:傳遞客戶端請求頭到后端,避免后端服務獲取不到真實客戶端信息(如 IP、Host)。Host $host
:傳遞客戶端訪問的域名(如example.com
)。X-Real-IP $remote_addr
:傳遞客戶端真實 IP。
-
超時設置:防止后端服務無響應時 Nginx 長期等待,避免連接泄露。
路徑匹配規則(proxy_pass
帶 /
vs 不帶 /
)
-
場景1:
location /api
+proxy_pass http://backend
(不帶/
)
客戶端請求http://example.com/api/user
→ 轉發到http://backend/api/user
(保留/api
前綴)。 -
場景2:
location /api
+proxy_pass http://backend/
(帶/
)
客戶端請求http://example.com/api/user
→ 轉發到http://backend/user
(去掉/api
前綴)。
高級:代理多個服務(按路徑區分)
server {listen 80;server_name example.com;# 1. 代理API服務(路徑以/api開頭)location /api {proxy_pass http://127.0.0.1:8080; # 后端API服務(如Java SpringBoot)proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}# 2. 代理前端靜態資源(路徑以/static開頭)location /static {proxy_pass http://127.0.0.1:8000; # 前端服務(如Node.js靜態服務器)proxy_set_header Host $host;}# 3. 其他請求默認返回404location / {return 404;}
}
二、正向代理配置(客戶端代理)
正向代理用于為客戶端提供訪問外部網絡的代理(如科學上網、客戶端IP隱藏),配置較少見。
http {# 正向代理核心配置server {listen 8888; # 客戶端需連接的代理端口# 允許客戶端通過代理訪問任意域名resolver 8.8.8.8; # DNS resolver(使用谷歌DNS解析外部域名)location / {# 正向代理到客戶端請求的目標地址proxy_pass http://$http_host$request_uri;# 支持HTTPS代理(需配置SSL隧道)proxy_connect_timeout 10s;proxy_send_timeout 10s;proxy_read_timeout 10s;}}
}
使用方式:
客戶端(如瀏覽器、curl)需手動設置代理為 http://代理服務器IP:8888
,即可通過該代理訪問外部網絡。
三、配置SSL(HTTPS代理)
若需要代理 HTTPS 請求(客戶端通過 https://example.com
訪問),需配置 SSL 證書:
server {listen 443 ssl; # 監聽443端口(HTTPS)server_name example.com;# SSL證書配置(替換為實際證書路徑)ssl_certificate /path/to/cert.pem; # 公鑰證書ssl_certificate_key /path/to/key.pem; # 私鑰# 代理到后端HTTP服務(Nginx終結SSL,后端用HTTP通信)location / {proxy_pass http://127.0.0.1:3000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}# 可選:HTTP自動跳轉到HTTPS
server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}
四、配置檢查與生效
-
檢查配置是否正確:
nginx -t # 輸出 "syntax is ok" 表示配置無誤
-
重啟Nginx生效:
nginx -s reload # 平滑重啟(不中斷現有連接)
核心總結
- 反向代理:用于服務器端轉發請求到后端服務,配置核心是
location
+proxy_pass
+ 頭信息傳遞。 - 正向代理:用于客戶端代理,需配置
resolver
和代理端口。 - 注意路徑匹配規則和超時設置,生產環境建議配置 SSL 證書。
根據實際需求修改 server_name
、proxy_pass
地址、端口和路徑即可。