在日常工作中,我們經常會聽到代理和反向代理這兩個詞,那么,什么是代理?什么又是反向代理?為什么有了代理還需要反向代理?他們之間有什么差異?今天我們就來一起聊一聊。
一、定義
在計算機和網絡領域,代理(proxy)通常是一種充當中間人的服務器或服務,用于轉發(fā)客戶端(通常是用戶計算機)和目標服務器之間的請求和響應。它主要包括正向代理(forward proxy)和反向代理(reverse proxy)。
二、正向代理
在維基百科中,正向代理的定義是這樣的:
正向代理:Forward Proxy,也稱網絡代理,就是我們通常說的代理,它是一種特殊的網絡服務,允許一個終端(一般為客戶端)通過這個服務與另一個終端(一般為服務器)進行非直接的連接。一些網關、路由器等網絡設備具備網絡代理功能。一般認為代理服務有利于保障網絡終端的隱私或安全,在一定程度上能夠阻止網絡攻擊。
正向代理的模型示意圖如下:
從上圖可以看出,正向代理位于客戶端和網絡之間,可以將客戶端全部隱藏在代理后面。當客戶端在發(fā)起網絡請求時,不直接連接到目標服務器,而是將請求發(fā)送到正向代理服務器。正向代理服務器代表客戶端向目標服務器請求數據,并將響應返回給客戶端。客戶端對目標服務器的身份和存在是不知情的,只與代理服務器進行通信。
三、應用場景
匿名瀏覽
正向代理可以隱藏客戶端的真實IP地址和身份,使目標服務器只能看到代理服務器的IP地址。這樣,客戶端可以在訪問網站時保護自己的隱私和身份。
訪問限制和繞過限制
通過代理,可以設置一些規(guī)則,防止客戶端訪問某些資源。相反,如果某些資源被限制,比如(防火墻),因此可以通過使用正向代理繞過這些限制,訪問被屏蔽的內容或服務。
加速和緩存
正向代理服務器可以緩存目標服務器返回的內容。當多個客戶端請求相同的資源時,代理服務器可以直接提供緩存的內容,減輕目標服務器的負載,并加快響應速度。
安全性增強
正向代理可以在客戶端和目標服務器之間增加一個額外的安全層,可以過濾和阻止惡意請求、病毒、惡意軟件等。
四、反向代理
在維基百科中,反向代理的定義是這樣的:
反向代理(Reverse proxy)在電腦網絡中是代理服務器的一種。服務器根據客戶端的請求,從其關系的一組或多組后端服務器(如Web服務器)上獲取資源,然后再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理服務器后面的服務器集群的存在[1]。下面我們通過客戶端向服務器發(fā)起一個HTTP請求這個經典的流程來講解API網關及其重要的功能。
反向代理的模型示意圖如下:
從上圖可以看出,反向代理位于網絡和服務器之間,可以把服務器隱藏在反向代理后面。當客戶端發(fā)起請求時,請求會發(fā)送到反向代理服務器,反向代理服務器代表目標服務器向客戶端提供服務,并將客戶端的請求轉發(fā)到相應的目標服務器上。
五、應用場景
負載均衡
反向代理可以將客戶端的請求分發(fā)給多個目標服務器,以平衡服務器負載。比如 Nginx,可以將用戶的請求分發(fā)到后端到多個服務器。
緩存
反向代理可以緩存目標服務器返回的內容以及一些靜態(tài)資源。當多個客戶端請求相同的資源時,反向代理可以直接返回緩存的內容,減輕目標服務器的負載,并加快響應時間,提升API性能。
安全性
反向代理可以隱藏目標服務器 IP地址,可以過濾部分惡意請求、DDoS攻擊等,并提供Web應用防火墻(WAF)功能,增強網絡安全性。
SSL 終止
反向代理可以在代理服務器上終止傳入的SSL連接,并將請求轉發(fā)到目標服務器的非SSL連接上。這樣,目標服務器就可以避免處理SSL握手的負擔,提高性能。
單一入口
反向代理可以作為單一入口點,將來自多個目標服務器的內容匯聚在一個統(tǒng)一的URL下。這對于構建復雜的應用程序或多服務器架構非常有用。
內容過濾和修改
反向代理可以對請求和響應進行內容過濾和修改。例如,它可以對傳入的請求進行訪問控制、內容篩選,或者對返回的響應進行內容壓縮和修改。
六、如何選擇
正向代理的選擇,更多的可以從下面的功能出發(fā):
-
隱私保護和匿名性
-
訪問控制和繞過限制
-
緩存和加速
-
安全增強
反向代理的選擇,更多的可以從下面的功能出發(fā):
-
負載均衡
-
安全性和隱藏目標服務器
-
SSL 終止
-
緩存和加速
在實際應用中,正向代理和反向代理也可以結合使用,以發(fā)揮各自的優(yōu)勢。比如,某公司擁有多個位于不同地理位置的目標服務器,可以使用反向代理來實現負載均衡和高可用性。同時,為了提供隱私保護和訪問控制,可以在客戶端和目標服務器之間再添加一個正向代理層。
七、總結
代理是比較簡單的一個知識點,但有時候也容易混淆。
正向代理更接近客戶端,位于客戶端和互聯網之間,反向代理更接近服務器,位于互聯網和服務器之間。
正向代理無法進行負載均衡和緩存資源優(yōu)化,反向代理不能直接控制客戶端的訪問權限。
Squid是一款常見的開源正向代理框架,Nginx是一款常見的開源反向代理框架,同時 Nginx也可以做正向代理。現實工作中,還有很多框架既可以做正向代理,也可以做反向代理。
正向代理和反向代理的選擇,我們更多的依據他們的應用場景。