Linux Nginx 負載均衡

負載均衡,英文名稱爲Load Balance,其含義就是指將負載(工作任務)進行平衡、分攤到多個操作單元上進行運行,例如FTP服務器、Web服務器、企業核心應用服務器和其它主要任務服務器等,從而協同完成工作任務。負載均衡構建在原有網絡結構之上,它提供了一種透明且廉價有效的方法擴展服務器和網絡設備的帶寬、加強網絡數據處理能力、增加吞吐量、提高網絡的可用性和靈活性。

  • 軟/硬件負載均衡

軟件負載均衡解決方案是指在一臺或多臺服務器相應的操作系統上安裝一個或多個附加軟件來實現負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基於特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。

軟件解決方案缺點也較多,因爲每臺服務器上安裝額外的軟件運行會消耗系統不定量的資源,越是功能強大的模塊,消耗得越多,所以當連接請求特別大的時候,軟件本身會成爲服務器工作成敗的一個關鍵;軟件可擴展性並不是很好,受到操作系統的限制;由於操作系統本身的Bug,往往會引起安全問題。

硬件負載均衡解決方案是直接在服務器和外部網絡間安裝負載均衡設備,這種設備通常稱之爲負載均衡器,由於專門的設備完成專門的任務,獨立於操作系統,整體性能得到大量提高,加上多樣化的負載均衡策略,智能化的流量管理,可達到最佳的負載均衡需求。

負載均衡器有多種多樣的形式,除了作爲獨立意義上的負載均衡器外,有些負載均衡器集成在交換設備中,置於服務器與Internet鏈接之間,有些則以兩塊網絡適配器將這一功能集成到PC中,一塊連接到Internet上,一塊連接到後端服務器羣的內部網絡上。一般而言,硬件負載均衡在功能、性能上優於軟件方式,不過成本昂貴。

  • 本地/全局負載均衡

負載均衡從其應用的地理結構上分爲本地負載均衡(Local Load Balance)和全局負載均衡(Global Load Balance,也叫地域負載均衡),本地負載均衡針對本地範圍的服務器羣做負載均衡,全局負載均衡針對不同地理位置、不同網絡結構的服務器羣做負載均衡。

本地負載均衡不需要花費高額成本購置高性能服務器,只需利用現有設備資源,就可有效避免服務器單點故障造成數據流量的損失,通常用來解決數據流量過大、網絡負荷過重的問題。同時它擁有形式多樣的均衡策略把數據流量合理均衡的分配到各臺服務器。如果需要在現在服務器上升級擴充,不需改變現有網絡結構、停止現有服務,僅需要在服務羣中簡單地添加一臺新服務器。

全局負載均衡主要解決全球用戶只需一個域名或IP地址就能訪問到離自己距離最近的服務器獲得最快的訪問速度,它在多區域都擁有自己的服務器站點,同時也適用於那些子公司站點分佈廣的大型公司通過企業內部網(Intranet)達到資源合理分配的需求。

全局負載均衡具備的特點:

  1. 提高服務器響應速度,解決網絡擁塞問題,達到高質量的網絡訪問效果。

  2. 能夠遠距離爲用戶提供完全的透明服務,真正實現與地理位置無關性

  3. 能夠避免各種單點失效,既包括數據中心、服務器等的單點失效,也包括專線故障引起的單點失效

負載均衡部署方式

負載均衡有三種部署方式:路由模式、橋接模式、服務直接返回模式。路由模式部署靈活,約60%的用戶採用這種方式部署;橋接模式不改變現有的網絡架構;服務直接返回(DSR)比較適合吞吐量大特別是內容分發的網絡應用。約30%的用戶採用這種模式。

  • 路由模式(推薦)

路由模式的部署方式,服務器的網關必須設置成負載均衡機的LAN口地址,且與WAN口分署不同的邏輯網絡。因此所有返回的流量也都經過負載均衡。這種方式對網絡的改動小,能均衡任何下行流量。

  • 橋接模式

橋接模式配置簡單,不改變現有網絡。負載均衡的WAN口和LAN口分別連接上行設備和下行服務器。LAN口不需要配置IP(WAN口與LAN口是橋連接),所有的服務器與負載均衡均在同一邏輯網絡中。

由於這種安裝方式容錯性差,網絡架構缺乏彈性,對廣播風暴及其他生成樹協議循環相關聯的錯誤敏感,因此一般不推薦這種安裝架構。

  • 服務直接返回模式

這種安裝方式負載均衡的LAN口不使用,WAN口與服務器在同一個網絡中,互聯網的客戶端訪問負載均衡的虛IP(VIP),虛IP對應負載均衡機的WAN口,負載均衡根據策略將流量分發到服務器上,服務器直接響應客戶端的請求。因此對於客戶端而言,響應他的IP不是負載均衡機的虛IP(VIP),而是服務器自身的IP地址。也就是說返回的流量是不經過負載均衡的。因此這種方式適用大流量高帶寬要求的服務。


Nginx 是一款高性能的HTTP和反向代理服務工具,現在很多大型網站都使用 Nginx 做負載均衡,由於支持高併發和資源佔用低,越來越受到歡迎,下面介紹 Nginx 幾種常用的負載均衡策略

u=1389434123,735908471&fm=26&gp=0.jpg

  • Nginx常用的幾種負載均衡配置

  • 輪詢模式:這種方式是nginx.conf配置文件的默認配置方式,當客戶端訪問服務的時候,請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除
  • weight權重模式:這種方式比較靈活,當後端服務器性能存在差異的時候,通過配置權重,可以讓服務器的性能得到充分發揮,有效利用資源。weight和訪問比率成正比,用於後端服務器性能不均的情況。權重越高,在被訪問的概率越大
  • ip_hash:配置很簡單,在upstream中採用ip_hash指令,如果客戶已經訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。此種策略,可以實現同一個用戶訪問同一臺服務器,會話不會丟失,但是可能會分配不均
  • fair(第三方插件):這種方式根據後端服務器的響應時間進行分配,響應快的優先分配請求
  • url  hash(第三方插件):此種方式和ip_hash比較類似,根據url的hash值進行分配,將url分配到同一個後端服務器,當服務器存在緩存時比較有效
  • nginx.conf 中命令說明

    down 表示單前的server暫時不參與負載 

    weight 默認爲1.weight越大,負載的權重就越大。 

    max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤 

    fail_timeout:max_fails次失敗後,暫停的時間。 

    backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕


  • 實驗環境
  • Server 192.168.1.2 CentOS 7.5 Nginx+負載均衡
  • Web 1 192.168.1.3 CentOS 7.5 Nginx+PHP
  • Web 2 192.168.1.4 CentOS 7.5 Nginx+PHP
  • Web 3 192.168.1.5 CentOS 7.5 Nginx+PHP

  • 分別在 Server 和 Web 端安裝 Nginx,使用 Nginx 官網提供的 Yum 方式安裝
  • Nginx  Yum 官方源   http://nginx.org/packages/    
    CentOS 7.X :

    rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

    CentOS 6.X :

    rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

  • yum -y install nginx PS:確保 /etc/yum.repo.d/nginx.repo 爲 enabled = 1 開啓狀態

  • Nginx+PHP 安裝詳細設置請參照拙作:Linux Nginx + PHP 安裝及調優https://blog.csdn.net/gaofei0428/article/details/104058580


  • 安裝完成後,首先在 Server 192.168.1.2 端配置 Nginx 負載均衡
  • vim /etc/nginx/nginx.conf
  • 在 http {......} 字段添加以下信息
  • http {

..........

    upstream myweb{    #開啓負載均衡及定義名稱
        ip_hash;     #採用 ip_hash 方式的負載均衡配置
        server 192.168.1.3 max_fails=10 fail_timeout=60s;
        server 192.168.1.4 max_fails=10 fail_timeout=60s;
        server 192.168.1.5 max_fails=10 fail_timeout=60s;
        }

#連接探測設置,如果發現後端異常,在單位週期爲fail_timeout設置的時間,中達到max_fails次數,這個週期次數內,如果後端同一個節點不可用,那麼接將把節點標記爲不可用,並等待下一個週期(同樣時常爲fail_timeout)再一次去請求,判斷是否連接是否成功
    include /etc/nginx/conf.d/*.conf;
}

  • 確認無誤保存退出,接下來編輯 /etc/nginx/conf.d/default.conf 
  • vim /etc/nginx/conf.d/default.conf
  • server {
        listen      *:80;
        server_name  www.myweb.com;
        location / {
            proxy_pass  http://myweb;     #使用前面定義的負載均衡配置
            proxy_set_header Host $host;    #允許重新定義或者添加發往後端服務器的請求頭。$host變量值在請求包含“Host”請求頭時爲“Host”字段的值,在請求未攜帶“Host”請求頭時爲虛擬主機的主域名
            proxy_set_header X-Forwarded-For $remote_addr;    #增加節點服務器記錄的IP字段
        }
    }
  • 確認無誤保存退出,啓動 Nginx


  • 下面開始測試,這裏爲了測試效果,暫時把 #ip_hash; 設置註釋掉
  • 更改物理機的 HOSTS 文件 添加 192.168.1.2 www.myweb.com
  • 打開瀏覽器輸入 www.myweb.com 按住 F5 可以看到變化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章