日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

很多場景下,不得不承認Nginx是個好東西,它給我們的跨系統間的訪問、安全性方面等等,帶來了極大的便利,況且它的性能也極高。

Nginx是一個異步框架的 Web服務器,可用作正向代理,也可以用作反向代理,負載平衡器 和 HTTP緩存。最近在項目中通過反向代理解決我們一些的問題,今天我們就來聊聊它的反向代理。(內容均整理來源于網絡)

Nginx之反向代理,正向代理和反向代理什么區別?

 

什么是反向代理?

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器。

我們換個方式理解,就是當外部網絡對內部網絡器是不能直接訪問的,要通過一個代理服務器才能進行訪問,而外部網絡看到的只是代理服務器,反饋也是由代理服務器返回的,外部網絡對于代理服務器與內部網絡直接的具體情況是不可見的。


正向代理和反向代理什么區別?

正向代理是一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器),然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端才能使用正向代理。

 

這里有一個最顯著的區別是:(可以看下面的圖示來感受)

  • 正向代理是客戶端知道目的服務器在哪里,然后通過代理服務器去訪問客戶端不能直接訪問的目標服務器,而目標服務器并不知道客戶端通過什么來訪問的, 即正向代理代理的是客戶端 ,最典型的案例就是”翻墻
  • 反向代理中,外部網絡對于內部網絡具體的情況是不可見的,而代理服務器來代理內部網絡來返回所要的數據(當然靜態文件可以放在Nginx,這個靜動分離再說),而服務端知道請求的來源以及數據,反向代理代理的是服務端 ,典型的例子就是負載均衡。

 

Nginx之反向代理,正向代理和反向代理什么區別?

 

 

反向代理的好處:

  • 保護了真實的web服務器,web服務器對外不可見,外網只能看到反向代理服務器,而反向代理服務器上并沒有真實數據,因此,保證了web服務器的資源安全
  • 反向代理為基礎產生了動靜資源分離以及負載均衡的方式,減輕web服務器的負擔,加速了對網站訪問速度(動靜資源分離和負載均衡會以后說)。
  • 節約了有限的IP地址資源,企業內所有的網站共享一個在internet中注冊的IP地址,這些服務器分配私有地址,采用虛擬主機的方式對外提供服務。

反向代理在Nginx.conf的簡單配置

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

server塊可以理解為一個虛擬主機,此時我們如果調用的是http://localhost:8182時,會將這個請求轉發到http://localhost:8082,因此實際處理這個請求的是http://localhost:8082

使用Nginx后web服務器如何獲得真實的用戶IP

問題:

當使用Nginx后,web服務器中request.getRemoteAddr(),得到的是Nginx的ip,而不是真實用戶的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服務端就可以可以通過request.getHeader("X-Forwarded-For");來獲得真實的用戶ip。

  • proxy_set_header Host $host :把原http請求的Header中的Host字段也放到轉發的請求里,$host值為主域名/IP
  • proxy_set_header X-real-ip $remote_addr:這里的X-real-ip是一個自定義名,名字隨意,效果是可以將 ip 就被放在 X-real-ip 這個變量里了,可以通過request.getHeader("X-real-ip ")獲取當前的值,與X-Forwarded-For,下文會詳細解釋
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

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

X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項。用于識別通過HTTP代理或負載平衡器原始IP一個連接到Web服務器的客戶機地址的非rfc標準,

當Nginx有X-Forwarded-For設置的話,每次經過proxy轉發都會有記錄,格式就是client1, proxy1,proxy2,以逗號隔開各個地址,而且由于他是非rfc標準,所以默認是沒有的,需要強制添加,通過Proxy轉達的時候,后端服務器看到的遠程ip是Proxy的ip,也就是說如果直接使用request.getHeader("X-Forwarded-For")是獲取不到用戶ip的,那我們要如何設置獲得用戶ip呢?

 

此時就需要在nginx配置的location塊中添加

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

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

proxy_add_forwarded_for包含著兩個格式,前面一部分是請求頭的X-Forwarded-For,而后面$remote_addr,也就是說是遠程用戶的ip

 

我們來個圖淺顯的解釋下:

Nginx之反向代理,正向代理和反向代理什么區別?

 

X-real-ip與X-Forwarded-For的區別

  • X-real-ip是覆蓋,而X-Forwarded-For是后面添加
  • 舉個例子,請求由1.1.1.1發出,經過三層代理,第一層是2.2.2.2,第二層是3.3.3.3,而本次請求的來源IP4.4.4.4是第三層代理,
  • 而X-Real-IP,沒有相關標準,上面的例子,如果配置了X-Read-IP,可能會有兩種情況:
最后一跳是正向代理,可能會保留真實客戶端IP:X-Real-IP: 1.1.1.1
最后一跳是反向代理,比如Nginx,一般會是與之直接連接的客戶端IP:X-Real-IP: 3.3.3.3
  • 而X-Forwarded-For的結果則是
X-Forwarded-For:1.1.1.1, 2.2.2.2, 3.3.3.3

分享到:
標簽:Nginx
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定