nginx負載平衡配置
原文http://nginx.org/en/docs/http/load_balancing.html
本文依照自己的理解翻譯
在多個應用程式間提供負載平衡是一種常用的提高資源使用率的技術,提高伺服器的輸送量,減少延遲,確保應用程式容錯。Nginx可以做為一個高效的http負載平衡器來將負載分發到多個應用程式上以提高效能,它也是一種可靠地,可伸縮的web應用程式伺服器。
負載平衡的類別
輪詢 -應用程式輪流來響應請求
最少串連 -請求被分配到活動串連最少的伺服器上
ip-hash -通過一個hash函數決定哪個伺服器來響應使用者的請求(依據用戶端的請求ip)
下面是最簡單的負載平衡的配置
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } }}上面這個配置中3個相同的應用程式的伺服器srv1-srv3,預設的負載平衡方式是輪詢,所用的請求通過反向 Proxy給了myapp1組,nginx通過負載平衡來分發這些請求到三個服務上。
在nginx中HTTP, HTTPS, FastCGI, uwsgi, SCGI, and memcached. 的負載平衡都是通過反向 Proxy實現的。
要配置https的負載平衡只需要將http協議改https就可以了,其他配置不變。
要實現FastCGI, uwsgi, SCGI, or memcached的負載平衡可以分別使用 fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass指令。
另一種負載平衡方式是least-connected,在“請求需要更長的時間來完成”的情境下採用least-connected方式可以更公平的將負載分配到多個機器上面。使用least-connected,nginx不會將請求分發到繁忙的機器上面,而且將新的請求分發的較清閑的機器上面。
可以在 upstream {}模組中配置least_conn;指令來啟用least-connected負載模式。
upstream myapp1 { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
輪詢和least-connected這兩種負載平衡方式會將新的請求分發到不同的機器上,很難保證每個用戶端會固定訪問某一個伺服器。
如果需要某個用戶端只訪問訪問固定的一個伺服器可以通過ip-hash負載平衡方式實現。
使用ip-hash時,用戶端的ip作為一個散列的Key來決定伺服器組中哪個伺服器來響應請求,這種方式可以保證每個用戶端每次訪問的都是同一個伺服器。
客戶通過ip_hash指令來配置ip_hash負載平衡方式
upstream myapp1 { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com;}權重的負載平衡方式,在輪詢的基礎上為每個伺服器配置權重可以保證某個伺服器儘可能處理多的請求
upstream myapp1 { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com; }上面的配置中,如果有5個請求,有3個會分配到serv1上,有1個會分配到srv2上,有一個會分配到srv3上。如果不指定weight,預設是平的的。
負載平衡包含伺服器的健全狀態檢查,如果某個請求被分配到了一個伺服器上,伺服器無法響應,那麼nginx會標記它失敗了,在短時間內,nginx是不會將之後的請求分配給標記失敗的伺服器。max_fails指令可以設定最大失敗次數,預設是1,需要先設定了fail_timeout才行。fail_timeout指定回應時間超過多少秒就將伺服器標記為失敗。伺服器標記失敗後,nginx會使用幾個用戶端請求優雅地探測伺服器,如果探測成功,則伺服器標記成功。
更多的負載平衡指令:proxy_next_upstream,backup,down, andkeepalive.