在詳解http報文
相關文章中咱們介紹了http協議是如何工做的,那麼構建一個真實的網站還須要引入組件呢?一些常見的名詞究竟是什麼含義呢?html
在前面文章中咱們介紹過最簡單的一種客戶端-服務端響應模式,以下 nginx
這是http服務最簡單的一種形式,服務端就一層web服務器。web
如今咱們服務端變複雜了,用戶數增長了,併發量增長了。對咱們服務端要求增長了算法
爲了解決這些問題,咱們須要引入中間層
也就是代理,在客戶端和服務端中間插入一箇中間環節,代理服務。代理,狹義上講就是不生產內容,只是轉發上下游的請求和響應。apache
代理服務按照是否匿名能夠分爲緩存
按照靠近客戶端仍是服務端,分爲安全
由於http協議最開始並無考慮代理服務,設計的協議只是針對客戶端-服務器模式。根據咱們一般的架構標準,http協議層是不用關心使用者是如何使用的,代理服務這種中間產物天然不用考慮。服務端有獲取客戶端ip的需求,因此Squid這個緩存代理軟件最早引入X-Forwarded-For
頭字段,用來表示 客戶端的真實 IP。bash
格式以下,從客戶端到各個代理服務,記錄下每一層的轉發服務器
X-Forwarded-For: client, proxy1, proxy2
複製代碼
這個需求是如此的普世,因此慢慢變成了標準,被各個代理服務普遍使用,因此後來被寫入到RFC 7239標準之中了網絡
HTTP 協議自己對代理服務並無什麼說明,因此就衍生出了代理協議,代理協議是haproxy的做者Willy Tarreau於2010年開發和設計的一個Internet協議,經過爲tcp添加一個很小的頭信息,來方便的傳遞客戶端信息(協議棧、源IP、目的IP、源端口、目的端口等),在網絡狀況複雜又須要獲取客戶IP時很是有用。
另外因爲每一層代理服務都須要解析http header 頭X-Forwarded-For
,而後追加本身的地址,因此這個成本也比較高。因此代理協議也變成了剛需
,雖然是haproxy提出來的,可是也被各大代理服務器支持了,如nginx、apache、squid。代理協議格式
PROXY TCP4/TCP6 客戶端ip 應答方ip 請求方端口號 應答方端口號 \r\n
複製代碼
這樣請求方解析第一行就能夠拿到客戶端ip,不用再去處理http報文了。
負載均衡,其實就是分發請求。根據OSI七層協議
負載均衡分紅兩種
nginx是4層負載均衡,LVS是七層負載均衡。
因此小型網站,nginx就足夠,當流量足夠大時,負載均衡成爲瓶頸了,就能夠在前面引入了LVS一層。
關於具體的負載均衡算法,參考這邊文章,這裏再也不贅述
前面咱們提到過安全防禦也是代理服務的一大重要功能。爲了應對外部攻擊,須要引入網絡防火牆,WAF(Web Application Firewall)。工做在OSI 第七層,主要是對http報文進行更細緻的審覈,也就是各類filter。 好比
當服務的安全性要求沒那麼高時,或者對公司業務發展的ROI沒那麼高時,咱們一般就在nginx層面配置一些規則便可。需求升級時,咱們就要引入專門的模型,好比ModSecurity1
。需求再升級時,引入外部雲廠商提供的WAF服務。
http服務端架構演進和咱們單應用架構演進有殊途同歸之處。在業務不復雜的時候,可使用單體模塊搞定(好比Nginx),當請求量增長,需求升級時,須要引入中間層來解決。當某個模塊要求增長時,須要解耦出單獨的模塊來處理。
因此總體上看,一箇中型的服務端架構以下圖。
關注公衆號【方丈的寺院】,第一時間收到文章的更新,與方丈一塊兒開始技術修行之路
相關閱讀 詳解http報文