http反向代理調度算法追朔

標題索引
nginx


  • 追朔緣由算法

  • 反代原理apache

  • 調度算法vim

  • 算法評估後端


追朔緣由
centos

    http調度算法有多種,在nginx、haproxy、apache、keepalive中等等都有相對應的算法,可是算法根本原理是不變的緩存

反代原理bash

    圖解http協議中提到的端到端首部,「分到此類別中的首部會轉發給請求/響應對應的最終接受目標,且必須保持在由緩存生成的響應中」(圖解http協議83頁)經過在varnish抓包分析可知,端到端的請求報頭從http請求、到varni代理請求、組後到後端服務器收到請求,一直變化的時源目IP地址,請求頭部的端到端時一直還沒有發生變化的。服務器

調度算法併發

    加權調度調度算法:加權輪詢調度算法爲,後端服務器根據權重進行虛擬邏輯服務器,調度服務器使用URL或其餘參數進行hash,將hash的數值對權重值之和進行取模計算,最後根據計算結果決定調度邏輯服務器計算節點,從而調度到物理真實服務器,具體可參考下圖所示:

5f33e6eae67096c10cc08111d9aab1e3.png

圖1-1WRR調度算法圖

    根據上圖舉例說明,如反向代理服務器調度算法爲WRR,若客戶端訪問URI爲http://www.a.com/mp4/fire.mp4,調度器接受到此URI並進行hash計算,計算結果對6(3+2+1)取模,取模結果可定爲0、一、二、三、四、5,將URI請求調度到相對應的邏輯服務器,進而調度到真實物理服務器。

    致命權限:在併發量較大的狀況下,一般反向代理服務器先調度到後端varnish等緩存服務器,若其中一臺緩存服務器異外宕機時,權重總和發生變化,取模結果發生變化,嚴重致使varnish等緩存服務器命中率大大下降,從而增長後端物理服務器的壓力,若併發量極大的狀況下有可能使得後端服務器沒法承載衆多流量而罷工。

    如採用nginx作反向代理調度配置可參考以下方法:

[ root@centos7 ~ ]#vim /etc/nginx/nginx.conf
http {
upstream www.jncsy.com {
        server 10.2.3.1 weight=3;
        server 10.2.3.2 weight=2;
        server 10.2.3.3 weight=1;
      }
server
   {
    listen 80;
    server_name www.jncsy.com;
    location / {
        #關閉重定向
        proxy_redirect off; 
        #讓真實服務器端接受的真實的host,真實請求IP地址和代理轉發的IP地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass http://www.jncsy.com;
        }
    access_log logs/jncsy.access.log;
    }
}

    如採用apache作反向代理調度可參考以下方法:

#配置加載模塊
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#在反向代理模
[ root@centos7 ~ ]#vim /etc/httpd/conf.d/vhost.conf
#定義基於http的負載均衡模塊    
        <Proxy balancer://www.jncsy.com>
            BalancerMember http://10.2.3.1 loadfactor=3
            BalancerMember http://10.2.3.2  loadfactor=2
            BalancerMember http://10.2.3.3  loadfactor=1
            ProxySet lbmethod=byrequests        
        </Proxy>  
<VirtualHost *:80>
        ServerName www.jncsy.com
        #對代理進行受權
        <Proxy *>
                Require all granted
        </Proxy>
        #apache2.4中須要進行受權
        <Location />
		         Require all granted
	    </Location>
	#關閉正向代理      
    ProxyRequests Off
    #響應頭部添加Via首部,添加X-Forward-for相關信息
    ProxyVia    On
    #正常狀況下host被解析爲IP地址,開啓此項目保留host的主機名防止後端爲虛擬主機
    ProxyPreserveHost On
    ProxyPass / balancer://www.jncsy.com/
    #將URI等進行緩存避免再次獲取URI 
    ProxyPa***everse / balancer://www.jncsy.com/   
</VirtualHost>

算法評估

    建議採用的方案

相關文章
相關標籤/搜索