歡迎光臨
每天分享高質量文章

Nginx 學習 —— 正向代理與反向代理

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:http://t.cn/Evbdqc9

今天花點時間記錄下nginx的反向代理知識,之前也是有用過,但是我覺得還是依舊簡單地記錄下來,好記性不如爛筆頭,說不定你以後學了新知識,又把它忘記了,回過頭想重新學習,又得百度一下這找部落格,那找部落格,學習成本多大呀!

1、正向代理和反向代理的概念

無論是正向代理,還是反向代理,說到底,就是代理樣式的衍生版本罷了。我們都學習過代理設計樣式,都知道代理樣式中有代理角色和被代理角色,為什麼這麼說,因為這兩個角色對於我們理解正向和反向代理非常重要,下麵會講到。

下麵我將引入這樣一個場景,很多時候我們上網的網速特別慢,或者說由於翻牆問題導致我們無法訪問到國外的網站,通常這些情況我們會透過給瀏覽器配置一個網速快的、可以翻牆的代理ip及埠號來解決我們的問題,那麼配置好之後,大概的請求流程如下圖所示:

我們首先請求代理伺服器,然後代理伺服器幫我們去快速訪問國外的網站,對於這種代理方式,我們就稱之為正向代理。請記住,上面說到代理樣式的兩個角色中,我們當前的角色為 被代理者,也就是瀏覽器這個角色。更重要的是,正向代理的本質是我們去請求外部的資源,如果以生產者、消費者樣式來區分,我們屬於消費者。

總結:

  • 1、正向代理,我們的角色是 被代理者

  • 2、正向代理,我們不對外提供服務,反而是對外消費服務,屬於消費者

反向代理,很顯然,就是和正向代理相反,如果說正向代理是男,那麼反向代理就是女了,親,此處不再糾結其他情況!下麵我用一副圖片解釋下反向代理:

看完上面的圖片,請你想象一下這麼一個場景,假設你現在是某公司技術總監,你們公司需要對外提供一套web服務,那麼你打算怎麼做呢?

答案是可以透過反向代理來完成。通常你們公司擁有自己的IDC機房,機房通訊通常採用區域網交換機,internet網使用者請求是無法直接訪問到區域網內的web服務的,因此這個時候,你需要一臺反向代理伺服器來接收internet web請求,然後將請求分發到區域網中的不同主機上進行處理,處理完成之後再做出響應。因此,反向代理大概就是這麼一個場景。請記住,反向代理中,我們的角色是 區域網 web服務

總結:

  • 1、反向代理,我們的角色是 區域網 web服務

  • 2、反向代理,我們對外提供服務,屬於服務提供者

2、nginx正向代理和反向代理實體解析

nginx在正向代理方面的應用非常地少,因此,對於正向代理的相關配置指令也不多,下麵是一個nginx作為正向代理伺服器的配置實體,配置僅供參考。

server {  
   resolver 192.168.1.1; #指定DNS伺服器IP地址  
   listen 8080;  
   location / {  
       proxy_pass http://$http_host$request_uri; #設定代理伺服器的協議和地址  
   }  

解釋下上面的指令,resolver配置DNS伺服器的ip地址,可以配置多個。你可能會問,正向代理中為什麼需要配置DNS伺服器的ip地址呢?其實答案很簡單,你想象下假如現在你的瀏覽器配置了正向代理伺服器,你現在在瀏覽器中輸入http://oneSite.cn/index.html,根據正向代理原理,該url請求將會被正向代理伺服器執行,問題來了,如果你的代理伺服器不配置DNS解析服務,nginx怎麼知道你這個oneSite.cn到底是個什麼鬼,到底對應因特網的ip地址是什麼?所以這就是需要配置resolver指令的原因所在。

listen指令配置nginx監聽瀏覽器請求的埠號。

proxy_pass指令配置接收到被代理瀏覽器發來的請求之後,需要幫忙執行的請求是什麼,$http_host$request_uri指明目的主機和uri,屬於nginx變數,一般不需要修改。

nginx反向代理的相關配置如下,在這裡小編搭建兩個Spring boot小demo模擬上面反向代理的web服務,相關原始碼可以在github獲取。

demo工程啟動埠號為8081,demo1工程啟動埠為8082,對於所有的請求字首帶/demo的都將轉發到demo工程進行處理,對於所有的請求字首帶/demo1的都將轉發到demo1工程進行處理。

nginx配置如下:

server {
   listen       80;
   location /demo {
       proxy_pass http://127.0.0.1:8081;
   }
   location /demo1 {
       proxy_pass http://127.0.0.1:8082;
   }
}

啟動demodemo1兩個工程之後,瀏覽器輸入下麵地址:

可以看到,外部統一使用80埠訪問服務時,nginx根據路徑字首進行代理,然後傳回執行結果。對於nginx反向代理路徑配置有幾點需要註意,使用時要非常謹慎。

上面proxy_pass指令配置的url為http://127.0.0.1:8081,註意在該url後面不能使用/demo1字尾進行代替,否則就報錯了。為什麼呢?首先nginx會判斷proxy_pass指令中配置的url地址是否包含uri,如果在proxy_pass指令中配置的url地址不包含uri,那麼nginx將會使用請求路徑的uri進行轉發,如果在proxy_pass指令中配置的url地址包含uri,則nginx會忽略請求location中的uri,轉而使用你在proxy_pass中配置的uri進行改寫,轉發,另外,/也是一種uri,哈哈,要特別小心哈~

舉例子:

假設請求地址為:http://localhost/demo/getServerInfo.json,location配置為/demo,proxy_pass配置為http://xxxx:port,則會使用http://xxxx:port/demo/getServerInfo.json進行轉發,結果正確。如果proxy_pass配置為http://xxxx:port/demo1,則會使用http://xxxx:port/demo1進行轉發,因為/demo1改寫了/demo




如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢

目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 伺服器

16. P2P 伺服器

17. HTTP 伺服器

18. 序列化 Serialization

19. 叢集容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇

目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模組
02. 交易模組
03. 營銷模組
04. 公用模組

… 一共 17+ 篇

原始碼不易↓↓↓

點贊支援老艿艿↓↓

贊(0)

分享創造快樂