Nginx負載均衡配置

原文鏈接:http://blog.csdn.net/xyang81/article/details/51702900

Nginx安裝請參考:《Nginx源碼安裝

      負載均衡的目的是爲了解決單個節點壓力過大,造成Web服務響應過慢,嚴重的情況下導致服務癱瘓,無法正常提供服務。春節期間在12306網站上買過火車票的朋友應該深有體會,有時查詢一張火車票都會很慢,甚至整個網頁都卡住不動了。通常一個訪問量非常大的Web網站(比如:淘寶、京東、12306等),由於一個Web服務同時能處理的用戶併發請求的數量有限,同時還有機器故障的情況,所以一個Web站點通常會在N臺機器上各部署一套同樣的程序。當某一個服務掛掉的時候,還有第二個、第三個、第N個服務。。。繼續爲用戶提供服務,給用戶的感覺,你的服務還在正常的運行!在這些提供同樣服務的機器當中,在硬件配置方面也各不一樣,這樣就會存在部份機器性能非常好,能快速計算並響應用戶的請求,另外一部份機器可能配置差點,響應用戶的請求的時間會長一些。這就需要我們思考一個問題?如果有一個服務正在同時處理1000個用戶的請求,這個服務的上限可能最多能同時處理1000個用戶的請求,這時它已經很忙了,如果此時又有一個新請求過來,我們仍然把這個請求分配給這臺機器,這時候這個請求就只能在乾等着,等這個服務處理完那些請求後,再繼續處理它。這樣在瀏覽器中的反應就像12306我們在春節買票一樣,卡在那不動了,讓用戶眼巴巴的乾着急。而能提供同樣服務的其它機器,這時確很空閒。這樣不僅是對服務器資源的浪費,也充分發揮不出弄多臺服務器裝同一個服務的最高價值。我們通常稱對某一臺機器的訪問量稱爲負載量,如何將一個用戶的請求,合理的分配到一臺能快速響應用戶請求的服務器上,我們就需要用到一些負載策略。也就體現出了文章主題的用意了:負載均衡,將用戶的所有HTTP請求均衡的分配到每一臺機器上,充分發揮所有機器的性能,提高服務的質量和用戶體驗。負載均衡可以通過負載均衡網絡硬件設備和Web服務器軟件來實現,前者設備成本較高,小公司通常負擔不起,所以後者一般是我們的首選。實現負載均衡常用的Web服務器軟件有Nginx、HAProxyLVSApache,本文主要介紹Nginx的負載均衡策略,至於Nginx是幹嘛的,自行百度。這篇文章介紹了Nginx、HAProxy和LVS的優缺點。

一、內置負載策略

Nginx負載均衡是通過upstream模塊來實現的,內置實現了三種負載策略,配置還是比較簡單的。官網負載均衡配置說明:http://nginx.org/en/docs/http/load_balancing.html

  • 輪循(默認)
    Nginx根據請求次數,將每個請求均勻分配到每臺服務器
  • 最少連接
    將請求分配給連接數最少的服務器。Nginx會統計哪些服務器的連接數最少。
  • IP Hash
    綁定處理請求的服務器。第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到集羣中的某一臺服務器上。後面該客戶端的所有請求,都將通過HASH算法,找到之前處理這臺客戶端請求的服務器,然後將請求交給它來處理。

1> 輪循

http {

    # ... 省略其它配置

    upstream tomcats {
        server 192.168.0.100:8080;
        server 192.168.0.101:8080;
        server example.com:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://tomcats;
        }
    }

    # ... 省略其它配置
}
  • proxy_pass http://tomcats:表示將所有請求轉發到tomcats服務器組中配置的某一臺服務器上。
  • upstream模塊:配置反向代理服務器組,Nginx會根據配置,將請求分發給組裏的某一臺服務器。tomcats是服務器組的名稱。
  • upstream模塊下的server指令:配置處理請求的服務器IP或域名,端口可選,不配置默認使用80端口。通過上面的配置,Nginx默認將請求依次分配給100,101,102來處理,可以通過修改下面這些參數來改變默認的分配策略:

    • weight
      默認爲1,將請求平均分配給每臺server

      upstream tomcats {
          server 192.168.0.100:8080 weight=2;  # 2/6次
          server 192.168.0.101:8080 weight=3;  # 3/6次
          server 192.168.0.102:8080 weight=1;  # 1/6次
      }

      上例配置,表示6次請求中,100分配2次,101分配3次,102分配1次

    • max_fails
      默認爲1。某臺Server允許請求失敗的次數,超過最大次數後,在fail_timeout時間內,新的請求將不會分配給這臺機器。如果設置爲0,Nginx會將這臺Server置爲永久無效狀態,然後將請求發給定義了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令來處理這次錯誤的請求。
    • fail_timeout
      默認爲10秒。某臺Server達到max_fails次失敗請求後,在fail_timeout期間內,nginx會認爲這臺Server暫時不可用,不會將請求分配給它

      upstream tomcats {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
          server 192.168.0.101:8080 weight=3;
          server 192.168.0.102:8080 weight=1;
      }

      192.168.0.100這臺機器,如果有3次請求失敗,nginx在15秒內,不會將新的請求分配給它。

    • backup
      備份機,所有服務器掛了之後纔會生效

      upstream tomcats {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
          server 192.168.0.101:8080 weight=3;
      
          server 192.168.0.102:8080 backup;
      }

      在100和101都掛了之前,102爲不可用狀態,不會將請求分配給它。只有當100和101都掛了,102纔會被啓用。

    • down
      標識某一臺server不可用。可能能通過某些參數動態的激活它吧,要不真沒啥用。

      upstream tomcats {
          server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
      
          server 192.168.0.101:8080 down;
      
          server 192.168.0.102:8080 backup;
      }

      表示101這臺Server爲無效狀態,不會將請求分配給它。

    • max_conns
      限制分配給某臺Server處理的最大連接數量,超過這個數量,將不會分配新的連接給它。默認爲0,表示不限制。注意:1.5.9之後的版本纔有這個配置

      upstream tomcats {
          server 192.168.0.100:8080 max_conns=1000;
      }

      表示最多給100這臺Server分配1000個請求,如果這臺Server正在處理1000個請求,nginx將不會分配新的請求給到它。假如有一個請求處理完了,還剩下999個請求在處理,這時nginx也會將新的請求分配給它。

    • resolve
      將server指令配置的域名,指定域名解析服務器。需要在http模塊下配置resolver指令,指定域名解析服務

      http {
          resolver 10.0.0.1;
      
          upstream u {
              zone ...;
              ...
              server example.com resolve;
          }
      }

      表示example.com域名,由10.0.0.1服務器來負責解析。
      upstream模塊server指令的其它參數和詳細配置說明,請參考官方文檔

二、第三方負載策略

1> fair

根據服務器的響應時間來分配請求,響應時間短的優先分配,即負載壓力小的優先會分配。

由於fair模塊是第三方提供的,所以在編譯nginx源碼的時候,需要將fair添加到nginx模塊中。

假設我的nginx是通過源碼安裝的,安裝在/opt/nginx目錄下,而且安裝時沒有添加fair模塊

1> 下載fair模塊源碼
下載地址:https://github.com/xyang0917/nginx-upstream-fair

cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip

解壓後的目錄名爲:nginx-upstream-fair-master

2> 重新編譯nginx,將fair模塊添加到編譯參數
我的nginx源碼目錄在/opt/nginx-1.10.0

cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make

注意:不要執行make install,這樣會覆蓋之前nginx的配置
3> 將新編譯的nginx可執行程序拷貝到/opt/nginx/sbin/目錄下,覆蓋之前安裝的nginx
編譯後的nginx執行程序,放在nginx源碼的objs目錄下

ps -aux | grep nginx
kill -9 nginx進程ID  # 停止nginx服務
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/  # 覆蓋舊的nginx
nginx # 啓動服務

配置使用fair負載策略模塊:

upstream tomcats {
    fair;
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
}

由於採用fair負載策略,配置weigth參數改變負載權重將無效。

2> url_hash

按請求url的hash結果來分配請求,使每個url定向到同一個後端服務器,服務器做緩存時比較有效。

1.7.2版本以後,url_hash模塊已經集成到了nginx源碼當中,不需要單獨安裝。之前的版本仍需要單獨安裝,下載地址:https://github.com/evanmiller/nginx_upstream_hash
安裝方法和fair模塊一樣,先下載url_hash源碼,然後重新編譯nginx源碼,將url_hash模塊添加到編譯配置參數當中,最後將編譯後生成的nginx二進制文件替換之前安裝的nginx二進制文件即可。

upstream tomcats {
    server 192.168.0.100:8080;
    server 192.168.0.101:8080;
    server 192.168.0.102:8080;
    hash $request_uri;
}
發佈了103 篇原創文章 · 獲贊 213 · 訪問量 172萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章