Web服務(wù)器Nginx正向代理和反向代理的區(qū)別

2021-02-01    分類(lèi): 網(wǎng)站建設(shè)

很多場(chǎng)景下,不得不承認(rèn)Nginx是個(gè)好東西,它給我們的跨系統(tǒng)間的訪問(wèn)、安全性方面等等,帶來(lái)了極大的便利,況且它的性能也極高。

Nginx是一個(gè)異步框架的 Web服務(wù)器,可用作正向代理,也可以用作反向代理,負(fù)載平衡器 和 HTTP緩存。最近在項(xiàng)目中通過(guò)反向代理解決我們一些的問(wèn)題,今天創(chuàng)新互聯(lián)就來(lái)聊聊它的反向代理。(內(nèi)容均整理來(lái)源于網(wǎng)絡(luò))


什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶(hù)端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。

我們換個(gè)方式理解,就是當(dāng)外部網(wǎng)絡(luò)對(duì)內(nèi)部網(wǎng)絡(luò)器是不能直接訪問(wèn)的,要通過(guò)一個(gè)代理服務(wù)器才能進(jìn)行訪問(wèn),而外部網(wǎng)絡(luò)看到的只是代理服務(wù)器,反饋也是由代理服務(wù)器返回的,外部網(wǎng)絡(luò)對(duì)于代理服務(wù)器與內(nèi)部網(wǎng)絡(luò)直接的具體情況是不可見(jiàn)的。


正向代理和反向代理什么區(qū)別?

正向代理是一個(gè)位于客戶(hù)端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶(hù)端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶(hù)端??蛻?hù)端才能使用正向代理。


這里有一個(gè)最顯著的區(qū)別是:(可以看下面的圖示來(lái)感受)

  • 正向代理是客戶(hù)端知道目的服務(wù)器在哪里,然后通過(guò)代理服務(wù)器去訪問(wèn)客戶(hù)端不能直接訪問(wèn)的目標(biāo)服務(wù)器,而目標(biāo)服務(wù)器并不知道客戶(hù)端通過(guò)什么來(lái)訪問(wèn)的, 即正向代理代理的是客戶(hù)端 ,最典型的案例就是”翻墻“
  • 反向代理中,外部網(wǎng)絡(luò)對(duì)于內(nèi)部網(wǎng)絡(luò)具體的情況是不可見(jiàn)的,而代理服務(wù)器來(lái)代理內(nèi)部網(wǎng)絡(luò)來(lái)返回所要的數(shù)據(jù)(當(dāng)然靜態(tài)文件可以放在Nginx,這個(gè)靜動(dòng)分離再說(shuō)),而服務(wù)端知道請(qǐng)求的來(lái)源以及數(shù)據(jù),反向代理代理的是服務(wù)端 ,典型的例子就是負(fù)載均衡。


反向代理的好處:

  • 保護(hù)了真實(shí)的web服務(wù)器,web服務(wù)器對(duì)外不可見(jiàn),外網(wǎng)只能看到反向代理服務(wù)器,而反向代理服務(wù)器上并沒(méi)有真實(shí)數(shù)據(jù),因此,保證了web服務(wù)器的資源安全。
  • 反向代理為基礎(chǔ)產(chǎn)生了動(dòng)靜資源分離以及負(fù)載均衡的方式,減輕web服務(wù)器的負(fù)擔(dān),加速了對(duì)網(wǎng)站訪問(wèn)速度(動(dòng)靜資源分離和負(fù)載均衡會(huì)以后說(shuō))。
  • 節(jié)約了有限的IP地址資源,企業(yè)內(nèi)所有的網(wǎng)站共享一個(gè)在internet中注冊(cè)的IP地址,這些服務(wù)器分配私有地址,采用虛擬主機(jī)的方式對(duì)外提供服務(wù)。

反向代理在Nginx.conf的簡(jiǎn)單配置

server {
 listen 8182;
 server_name localhost;
 ...
 location / {
 proxy_pass http://localhost:8082; 
 ...
 }
 
 }

server塊可以理解為一個(gè)虛擬主機(jī),此時(shí)我們?nèi)绻{(diào)用的是http://localhost:8182時(shí),會(huì)將這個(gè)請(qǐng)求轉(zhuǎn)發(fā)到http://localhost:8082,因此實(shí)際處理這個(gè)請(qǐng)求的是http://localhost:8082

使用Nginx后web服務(wù)器如何獲得真實(shí)的用戶(hù)IP

問(wèn)題:

當(dāng)使用Nginx后,web服務(wù)器中request.getRemoteAddr(),得到的是Nginx的ip,而不是真實(shí)用戶(hù)的ip

解決方案:

在nginx.conf的的中的location中添加如下一些配置

server {
 ...
 location / {
 ...
 proxy_set_header Host $host;
 proxy_set_header X-real-ip $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
 
 }

然后web服務(wù)端就可以可以通過(guò)request.getHeader("X-Forwarded-For");來(lái)獲得真實(shí)的用戶(hù)ip。

  • proxy_set_header Host $host :把原h(huán)ttp請(qǐng)求的Header中的Host字段也放到轉(zhuǎn)發(fā)的請(qǐng)求里,$host值為主域名/IP
  • proxy_set_header X-real-ip $remote_addr:這里的X-real-ip是一個(gè)自定義名,名字隨意,效果是可以將 ip 就被放在 X-real-ip 這個(gè)變量里了,可以通過(guò)request.getHeader("X-real-ip ")獲取當(dāng)前的值,與X-Forwarded-For,下文會(huì)詳細(xì)解釋
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

首先我們要知道什么是X-Forwarded-For?

X-Forwarded-For:簡(jiǎn)稱(chēng)XFF頭,它代表客戶(hù)端,也就是HTTP的請(qǐng)求端真實(shí)的IP,只有在通過(guò)了HTTP 代理或者負(fù)載均衡服務(wù)器時(shí)才會(huì)添加該項(xiàng)。用于識(shí)別通過(guò)HTTP代理或負(fù)載平衡器原始IP一個(gè)連接到Web服務(wù)器的客戶(hù)機(jī)地址的非rfc標(biāo)準(zhǔn),

當(dāng)Nginx有X-Forwarded-For設(shè)置的話,每次經(jīng)過(guò)proxy轉(zhuǎn)發(fā)都會(huì)有記錄,格式就是client1, proxy1,proxy2,以逗號(hào)隔開(kāi)各個(gè)地址,而且由于他是非rfc標(biāo)準(zhǔn),所以默認(rèn)是沒(méi)有的,需要強(qiáng)制添加,通過(guò)Proxy轉(zhuǎn)達(dá)的時(shí)候,后端服務(wù)器看到的遠(yuǎn)程ip是Proxy的ip,也就是說(shuō)如果直接使用request.getHeader("X-Forwarded-For")是獲取不到用戶(hù)ip的,那我們要如何設(shè)置獲得用戶(hù)ip呢?


此時(shí)就需要在nginx配置的location塊中添加

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

注意這里的意思是增加到X-Forwarded-For中,不是覆蓋,而增加后的格式就是之前說(shuō)的“client1,proxy1....”,默認(rèn)的時(shí)候X-Forwarded-For是空的,如果有兩個(gè)nginx,并且都配置了上面這個(gè)命令,則會(huì)在web服務(wù)器的request.getHeader("X-Forwarded-For")獲得的是“用戶(hù)ip,第一個(gè)nginx的ip”,分別對(duì)應(yīng)之前的格式。

proxy_add_forwarded_for包含著兩個(gè)格式,前面一部分是請(qǐng)求頭的X-Forwarded-For,而后面$remote_addr,也就是說(shuō)是遠(yuǎn)程用戶(hù)的ip


我們來(lái)個(gè)圖淺顯的解釋下:


X-real-ip與X-Forwarded-For的區(qū)別

  • X-real-ip是覆蓋,而X-Forwarded-For是后面添加
  • 舉個(gè)例子,請(qǐng)求由1.1.1.1發(fā)出,經(jīng)過(guò)三層代理,第一層是2.2.2.2,第二層是3.3.3.3,而本次請(qǐng)求的來(lái)源IP4.4.4.4是第三層代理,
  • 而X-Real-IP,沒(méi)有相關(guān)標(biāo)準(zhǔn),上面的例子,如果配置了X-Read-IP,可能會(huì)有兩種情況:
最后一跳是正向代理,可能會(huì)保留真實(shí)客戶(hù)端IP:X-Real-IP: 1.1.1.1
最后一跳是反向代理,比如Nginx,一般會(huì)是與之直接連接的客戶(hù)端IP:X-Real-IP: 3.3.3.3
  • 而X-Forwarded-For的結(jié)果則是
X-Forwarded-For:1.1.1.1, 2.2.2.2, 3.3.3.3

所以如果只有一層代理,則兩個(gè)值是一樣的。

名稱(chēng)欄目:Web服務(wù)器Nginx正向代理和反向代理的區(qū)別
標(biāo)題路徑:http://www.muchs.cn/news7/98607.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃網(wǎng)站維護(hù)、網(wǎng)頁(yè)設(shè)計(jì)公司、關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)