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