Nginx 反向代理 負載均衡

常見負載均衡算法

 
  • 輪詢(默認)
  • 權重
    • weight,訪問比率等於權重之比
  • IP 哈希
    • 解決session問題:每一個請求訪問IP的hash結果分配,這樣每一個訪客能夠固定到後端某一個臺服務器。
    • 問題:
      • 如某臺服務器掛掉,對應ip_hash找不到該機器?
        • 若是哈希選擇失敗次數達到20次以上,回退到輪詢策略進行選擇。
      • 若是同一IP地址請求較多,形成某一服務器壓力較大,而其他的服務器較空閒?。
        • 能夠使用url_hash 進一步細分,來實現負載均衡。
  • 最少鏈接(least_conn)
    • 選擇鏈接數最少的服務器
  • url_hash(第三方)
    • 按訪問URL的hash結果來分配請求,使每一個URL定向到同一個後端服務器。後端服務器爲緩存時比較適用。
    • 此中策略中,不能使用weight,等其餘參數。
  • fair(第三方)
    • 按後端服務器的響應時間來分配請求,響應時間短的優先分配
 
 
配置模塊--upstream模塊

upstream模塊可定義一個新的上下文, 它包含了一組upstream服務器,這些服務器可能被賦予了不一樣的權重、不一樣的類型甚至能夠基於維護等緣由被標記爲down。
upstream模塊常用在 proxy模塊中;
 
經常使用指令
  • ip_hash
    • 基於客戶端IP地址完成請求的分發
    • 它能夠保證來自於同一個客戶端的請求始終被轉發至同一個upstream服務器;
  • keepalive
    • 每一個worker進程爲發送到upstream服務器的鏈接所緩存的個數;
  • least_conn
    • 最少鏈接調度算法;
  • server:定義一個upstream服務器的地址,還可包括一系列可選參數,如:
    • weight
      • 權重
    • max_fails
      • 最大失敗鏈接次數,失敗鏈接的超時時長由fail_timeout指定;
    • fail_timeout
      • 等待請求的目標服務器發送響應的時長;
    • backup
      • 用於fallback的目的,全部服務均故障時才啓動此服務器;
    • down
      • 手動標記其再也不處理任何請求;
 
應用場景

官方給的簡單例子:
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080  backup;
    server backup2.example.com:8080  backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

 

動態選擇的例子
resolver 10.0.0.1;

upstream dynamic {
    zone upstream_dynamic 64k;

    server backend1.example.com      weight=5;
    server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;
    server backend3.example.com      resolve;
    server backend4.example.com      service=http resolve;

    server backup1.example.com:8080  backup;
    server backup2.example.com:8080  backup;
}

server {
    location / {
        proxy_pass http://dynamic;
        health_check;
    }
}

 



 
實踐與問題

實現默認輪詢與權重
     // 權重
      upstream backend {
              server 10.103.100.3:8090 weight=2;
              server 10.103.100.4:8090;
     }
     // 默認輪詢
      upstream backend {
              server 10.103.100.3:8090;
              server 10.103.100.4:8090;
       }
 
      server {
 
          listen 80;
          server_name localhost;
 
          location /{
              proxy_pass http://backend;
          }
     }

 

問題
  • upstream 模塊是在http配置塊底下,放在server配置塊裏面會報錯
  • upstream server 定義後臺服務器時直接指定主機名和端口便可
    • 不須要加上http://
    • http:// 在proxy_pass 中加上便可
  • weight 默認值爲1
 
IP_hash
// 帶權重ip_hash
      upstream backend {
               ip_hash;
              server 10.103.100.3:8090 weight=2;
              server 10.103.100.4:8090;
     }
     // 普通ip_hash
      upstream backend {
              ip_hash;
              server 10.103.100.3:8090;
              server 10.103.100.4:8090;
       }
 
      server {
 
          listen 80;
          server_name localhost;
 
          location /{
              proxy_pass http://backend;
          }
     }
注意:
  • weight,ip_hash 能夠疊加使用
相關文章
相關標籤/搜索