來源:https://www.jianshu.com/p/ae76c223c6ef
一、正向代理和反向代理的概念
正向代理的概念
- 正向代理:也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然后返回給我,從網站的角度,只在代理服務器來取內容的時候有一次記錄,有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。
- 結論就是 :正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。就像要訪問google用vpn代理翻牆去訪問(用戶知道要訪問真正的服務器)
反向代理的概念
- 反向代理:例用戶訪問 http://www.example.com/readme
但www.example.com上並不存在readme頁面,他是偷偷從另外一台服務器上取回來,然后作為自己的內容吐給用戶,但用戶並不知情,這里所提到的 www.example.com 這個域名對應的服務器就設置了反向代理功能。 - 結論就是:反向代理正好相反,對於客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理 的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容 原本就是它自己的一樣。(用戶不知道要訪問真正的服務器)
以租房為例解釋正向代理和反向代理:
正向代理:客戶端 <一> 代理 一>服務端
A(客戶端)想租C(服務端)的房子,但是A(客戶端)並不認識C(服務端)租不到。
B(代理)認識C(服務端)能租這個房子所以你找了B(代理)幫忙租到了這個房子。
這個過程中C(服務端)不認識A(客戶端)只認識B(代理)
C(服務端)並不知道A(客戶端)租了房子,只知道房子租給了B(代理)。
反向代理:客戶端 一>代理 <一> 服務端
A(客戶端)想租一個房子,B(代理)就把這個房子租給了他。
這時候實際上C(服務端)才是房東。
B(代理)是中介把這個房子租給了A(客戶端)。
這個過程中A(客戶端)並不知道這個房子到底誰才是房東
他都有可能認為這個房子就是B(代理)的
由上的例子我們可以知道正向代理和反向代理的區別在於代理的對象不一樣,正向代理的代理對象是客戶端,反向代理的代理對象是服務端。
二、正向代理和反向代理配置

B服務器(代理服務器)/etc/nginx/conf.d/default.conf。添加resolver和proxy_pass,設置如下

反向代理配置
首先在/etc/nginx/conf.d/下新建一個test.conf
可以看到我server里listen的8080端口,但是我的服務器本身不對外開放8080端口,只開放了80端口。所以此時訪問test.html是訪問不到的
然后我們打開/etc/nginx/conf.d/default.conf 添加proxy_pass設置如下
我們設置當匹配test.html結尾的URL時就去代理訪問本機的8080端口。為了對比我們先注釋掉,然后直接80端口訪問以下test.htl
可以看到此時返回的404.這時候取消注釋reload以下nginx然后用80端口訪問test.html
此時便可訪問8080端口配置的資源。
以上便是完成了一個反向代理的演示,這個過程中我們可以知道,客戶端想要訪問的是test.html,但是test.html實際上是8080端口下配置的,中間經過了代理才能拿到。也就是客戶端並不知道中間經歷了什么代理過程,只有服務端知道。客戶端只知道他拿到了test.html也就是8080端口下配置的資源內容。
三、總結
正向代理的代理對象時客戶端,反向代理的代理對象時服務端。代理服務器站在客戶端那邊就是正向代理,代理服務器站在原始服務器那邊 就是反向代理。nginx通過proxy_pass可以設置代理服務。