在互聯網的龐大架構中,Nginx 作為一款高性能的 Web 服務器和反向代理服務器,發揮著至關重要的作用。其中,反向代理功能更是 Nginx 被廣泛應用的核心原因之一。本文將深入探討什么是反向代理,以及如何在 Nginx 中進行反向代理的配置。
一、反向代理的概念與原理
反向代理的定義
反向代理是指以代理服務器來接受 Internet 上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。
正向代理 vs 反向代理
我們先來簡單對比一下正向代理與反向代理的區別:
“反向代理的核心思想是:客戶端不知道真正的服務器是誰,所有請求都先發給反向代理服務器,由它轉發到后端真實服務器,并將結果返回給客戶端。
反向代理的作用
- 負載均衡:當有大量客戶端請求到達時,反向代理服務器可以根據預設的算法,將請求分發到不同的后端服務器上,避免單個服務器負載過高,提高整個系統的處理能力和穩定性 。
- 安全性提升:隱藏后端真實服務器的 IP 地址,使客戶端無法直接與后端服務器通信,降低了后端服務器遭受攻擊的風險。同時,反向代理服務器還可以對請求進行過濾和驗證,攔截惡意請求,如 SQL 注入、跨站腳本攻擊(XSS)等。
- 緩存加速:反向代理服務器可以緩存后端服務器返回的靜態資源(如圖片、CSS、JavaScript 文件等)和動態內容。當有相同的請求再次到達時,直接從緩存中返回數據,減少了后端服務器的壓力,也加快了客戶端獲取數據的速度,提升用戶體驗。
- 服務高可用:當某一臺后端服務器出現故障時,反向代理服務器可以自動將請求轉發到其他正常運行的服務器上,保證服務的連續性,實現服務的高可用性。
反向代理的工作原理
客戶端向反向代理服務器發送請求,反向代理服務器根據配置的規則(如請求的 URL、客戶端 IP 地址等),將請求轉發到合適的后端服務器。后端服務器處理請求后,將響應結果返回給反向代理服務器,反向代理服務器再將響應結果返回給客戶端。整個過程中,客戶端并不知道真正處理請求的后端服務器是誰,它只與反向代理服務器進行交互。
二、Nginx 反向代理的配置
基本反向代理配置
假設你有一個運行在服務器端口為 3000 的服務,現在想通過域名 http://api.example.com 訪問這個服務。
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
說明:
- listen 80:表示 Nginx 監聽 80 端口。
- server_name:指定域名,若沒有域名或通過 IP 訪問,可忽略此配置。
- location / :定義請求的 URL 匹配規則,這里表示所有請求都將被代理到后端服務器。
- proxy_pass:指定后端服務器的地址和端口。
- proxy_set_header:設置請求頭,用于傳遞原始信息給后端,例如:Host表示傳遞原始請求的域名,X-Real-IP表示獲取客戶端真實IP,X-Forwarded-For表示傳遞完整的代理路徑,X-Forwarded-Proto表示傳遞后端請求使用的協議。
基于 URL 的反向代理配置
有時候,我們可能希望根據不同的 URL 將請求轉發到不同的后端服務器。例如,將以/api開頭的請求轉發到一個 API 服務器,將其他請求轉發到另一個 Web 服務器。
server {
listen 80;
server_name your_domain.com;
location /api {
proxy_pass http://api_server_ip:port; # API服務器地址和端口
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;
}
location / {
proxy_pass http://web_server_ip:port; # Web服務器地址和端口
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;
}
}
添加 SSL 支持(HTTPS)
如果你有 SSL 證書(比如 Let's Encrypt),可以添加 HTTPS 支持:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
# 強制跳轉 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
負載均衡配置
Nginx 支持多種負載均衡算法,如輪詢(默認)、加權輪詢、IP 哈希等。下面以加權輪詢為例,介紹如何配置負載均衡。
upstream backend_servers {
server 192.168.1.101 weight=3; # 權重為3
server 192.168.1.102 weight=1; # 權重為1
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://backend_servers;
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;
}
}
總結
反向代理是 Nginx 的重要功能之一,通過合理配置反向代理,我們可以實現負載均衡、提升安全性、加速服務響應等目標。在實際應用中,根據具體的業務需求和服務器架構,靈活運用 Nginx 的反向代理配置,能夠打造出高性能、高可用的 Web 服務系統。
閱讀原文:原文鏈接
該文章在 2025/7/21 10:48:19 編輯過