http筆記整理:代理服務

鏈條的起點還是客戶端(也就是瀏覽器),

中間的角色被稱爲代理服務器(proxy server),

鏈條的終點被稱爲源服務器(origin server)

「代理服務」就是指服務本身不生產內容,而是處於中間位置轉發上下游的請求和響應,具有雙重身份:面向下游的用戶時,表現爲服務器,代表源服務器響應客戶端的請求;而面向上游的源服務器時,又表現爲客戶端,代表客戶端發送請求。

 

「計算機科學領域裏的任何問題,都可以通過引入一箇中間層來解決。如果一箇中間層解決不了問題,那就再加一箇中間層。」

代理最基本的一個功能是負載均衡。因爲在面向客戶端時屏蔽了源服務器,客戶端看到的只是代理服務器,源服務器究竟有多少臺、是哪些 IP 地址都不知道。於是代理服務器就可以掌握請求分發的「大權」,決定由後面的哪臺服務器來響應請求

負載均衡的同時,代理服務還可以執行更多的功能:

健康檢查:使用「心跳」等機制監控後端服務器,發現有故障就及時「踢出」集羣,保證服務高可用;

安全防護:保護被代理的後端服務器,限制 IP 地址或流量,抵禦網絡攻擊和過載;

加密卸載:對外網使用 SSL/TLS 加密通信認證,而在安全的內網不加密,消除加解密成本;

數據過濾:攔截上下行的數據,任意指定策略修改請求或者響應;

內容緩存:暫存、複用服務器響應

代理服務器需要用字段「Via」標明代理的身份

Via 是一個通用字段,請求頭或響應頭裏都可以出現。每當報文經過一個代理節點,代理服務器就會把自身的信息追加到字段的末尾。

如果通信鏈路中有很多中間代理,就會在 Via 裏形成一個鏈表。

服務器的 IP 地址應該是保密的,關係到企業的內網安全,所以一般不會讓客戶端知道。不過反過來,通常服務器需要知道客戶端的真實 IP 地址,方便做訪問控制、用戶畫像、統計分析。

HTTP 標準裏並沒有爲此定義頭字段,但已經出現了很多「事實上的標準」,最常用的兩個頭字段是「X-Forwarded-For」和「X-Real-IP」

「X-Forwarded-For」的字面意思是「爲誰而轉發」,也是每經過一個代理節點就會在字段裏追加一個信息。但「Via」追加的是代理主機名(或者域名),而「X-Forwarded-For」追加的是請求方的 IP 地址。所以,在字段裏最左邊的 IP 地址就客戶端的地址。

X-Real-IP」是另一種獲取客戶端真實 IP 的手段,記錄客戶端 IP 地址,沒有中間的代理信息

訪問「http://www.chrono.com/21-1」,它會轉而訪問「http://origin.io」。這裏的「origin.io」就是源站,它會在響應報文裏輸出「Via」「X-Forwarded-For」等代理頭字段信息:

 

 

 

代理與客戶端、源服務器的通信過程:

1.客戶端 55061 先用三次握手連接到代理的 80 端口,然後發送 GET 請求;

2.代理不直接生產內容,所以就代表客戶端,用 55063 端口連接到源服務器,也是三次握手;

3.代理成功連接源服務器後,發出了一個 HTTP/1.0 的 GET 請求;

4.因爲 HTTP/1.0 默認是短連接,所以源服務器發送響應報文後立即用四次揮手關閉連接;

5.代理拿到響應報文後再發回給客戶端,完成了一次代理服務。

 

在這個實驗中,你可以看到除了「X-Forwarded-For」和「X-Real-IP」,還出現了兩個字段:「X-Forwarded-Host」和「X-Forwarded-Proto」,它們的作用與「X-Real-IP」類似,只記錄客戶端的信息,分別是客戶端請求的原始域名和原始協議名

 

代理協議:

「代理協議」(The PROXY protocol),它由知名的代理軟件 HAProxy 所定義,也是一個「事實標準」,被廣泛採用(注意並不是 RFC)

「代理協議」有 v1 和 v2 兩個版本,v1 和 HTTP 差不多,也是明文,而 v2 是二進制格式。

代理會增加鏈路長度,在代理上做一些複雜的處理。會很耗費性能,增加響應時間。

反向代理中的負載均衡算法:

1.隨機

2.輪詢

3.一致性hash

4最近最少使用

5.鏈接最少