目錄
一、正向代理 (Forward Proxy)
正向代理是在用戶端。是一個位於客戶端和原始服務器之間的服務器,爲了從原始服務器獲取內容,客戶端向代理髮送一個請求並指定目標,然後代理向原始服務器轉交請求並將獲得的內容返回給客戶端。比如訪問某些國內網站,我們需要購買VPN,並且VPN是在我們的用戶瀏覽器端設置的。
瀏覽器先訪問VPN地址,VPN轉發請求,並最後將請求結果原路返回。
二、反向代理 (Reverse Proxy)
反向代理是作用在服務端的,是一個虛擬的ip,用戶對於一個請求,會轉發到多個後端處理器中的一臺來處理該具體請求。
大型網站都有DNS(域名解析服務器),load balance(負載均衡器)等
三、故事講解
如上圖,大致瞭解了什麼是正反向代理以後下面我們來講一個故事讓你真正的理解什麼是正反向代理。
中國小吃三巨頭: 沙縣小吃 、黃燜雞 、蘭州拉麪
對象: 顧客(客戶端)、服務員(正向代理)、下單系統(反向代理)廚師(服務器)
今天我們選擇沙縣小吃(無服務員) : 顧客進店點了小吃,下單的時候廚師過來接單,並且給 顧客配餐,十五分鐘後 廚師給 顧客端來了小吃,這個過程中只有顧客和廚師參與,顧客和廚師都知道對方是誰。
吃完後吃不飽,突然看到一黃燜雞的店鋪,進去點了兩份黃燜雞,然後服務員過來接了單子,再把單子傳遞給了廚師,十五分鐘後,服務員端了兩份黃燜雞過來,這個過程有三個角色,其中相比於沙縣小吃多了一個服務員。
這其中,服務員不僅會給我們點單,也會給其他人點單,重點來了:我們規定顧客到廚師這個方向是正向,而服務員在爲我們服務,他們傳達了我們的需求,我們是正向,所以他就是所謂的“正向代理”,而服務員會傳達店裏所有的需求給廚師,而廚師只需要回覆服務員就好,過程中客人和廚師是不需要直接接觸的。
吃完以後又看到一家蘭州拉麪,於是進店,服務員安排了顧客坐在空餘位置,顧客點了一份炒刀削麪,服務員等顧客點好以後接過了菜單,系統自動按照閒忙情況分配了廚師,十分鐘過後炒刀削端上來了,這個時候多了一個下單系統,就是"反向代理",之前說過,顧客到廚師這個方向是正向,那麼反過來就是反向,簡單的說下單系統代所有廚師傳遞做好的菜,下單系統會找到當下任務最少的那個廚師,把菜單分配給他,廚師做好以後,會在下單系統結束自己的任務,服務員接到提醒後我們的炒刀削就上了,這個過程要清楚: 顧客只知道服務員(正向代理)是誰,廚師只知道下單系統(反向代理)是誰。
四、各自的特點、共同點和區別
正向代理:
代理客戶
隱藏真實的客戶,爲客戶端首發請求,使真實客戶端對服務器不可見
一個局域網內的所有用戶可能被一臺服務器做了正向代理,由該服務器負責HTTP請求
意味着同服務器做通信的是正向代理服務器
反向代理:
代理服務器
隱藏了真實的服務器,爲服務器收發請求,使真實服務器對客戶端不可見
負載均衡服務器,將用戶的請求分發到空閒服務器上
意味着用戶和負載均衡服務器直接通信,即用戶解析服務器域名時得到的是負載均衡服務器的IP
共同點:
都是作爲服務器和客戶端的中間層
都可以加強內網安全性,阻止Web攻擊
都可以做緩存機制,提高訪問速度
區別:
正向代理其實是代理客戶端,反向代理則是代理服務器
正向代理中,服務器並不知道真正的客戶端到底是誰,而在反向代理中,客戶端也不知道真正的服務器是誰
作用不同,正向代理主要是用來解決訪問限制問題,而反向代理則是提供負載均衡,安全防護等作用。
五、實際應用
正向代理:
GFW:作用主要是用於分析和過濾中國境內外網絡間的互相訪問。也就是說,他不僅能限制國內網民訪問境外的某些站點,也能限制國外用戶訪問國內的站點。通常所說的“被牆”,就是指GFW所限制,顧名思義,則就是突破限制。
反向代理:
Nginx服務器的功能有很多,諸如反向代理,負載均衡,靜態資源等。
客戶端請求可以直接通過http協議訪問服務器,不過我們可以在中間加上一個Nginx服務器,客戶端請求Nginx服務器,Nginx服務器請求應用服務器,然後將結果返回給客戶端,此時Nginx服務器就是反向代理服務器。
在虛擬主機中配置反向代理服務器:
- # 虛擬主機的配置
- server {
- listen 8080; # 監聽的端口
- server_name 192.168.1.1; # 配置訪問域名
- root /data/toor; # 站點根目錄
- error_page 502 404 /page/404.html; # 錯誤頁面
- location ^~ /api/ { # 使用 /api/ 代理 proxy_pass 的值
- proxy_pass http://192.168.20.1:8080; # 被代理的應用服務器 HTTP 地址
- }
- }
以上簡單的配置就可以實現反向代理的功能。當然反向代理也可以處理跨域問題。
負載均衡配置:
- # upstream 表示負載服務器池,定義名字爲 my
- upstream my {
- server 192.168.2.1:8080 weight=1 max_fails=2 fail_timeout=30s;
- server 192.168.2.2:8080 weight=1 max_fails=2 fail_timeout=30s;
- server 192.168.2.3:8080 weight=1 max_fails=2 fail_timeout=30s;
- server 192.168.2.4:8080 weight=1 max_fails=2 fail_timeout=30s;
- # 即在 30s 內嘗試 2 次失敗即認爲主機不可用
- }