首頁  >  文章  >  運維  >  Nginx如何實現負載平衡

Nginx如何實現負載平衡

WBOY
WBOY轉載
2023-05-11 20:07:044450瀏覽

    一、Nginx介紹

    Nginx是一款高效能的Http和反向代理伺服器,也是一個IMAP/POP3 /SMTP伺服器(電子郵件代理),最早開發這個產品的目的之一也是作為郵件代理伺服器。因它的穩定性、豐富的功能集、範例設定檔和低系統資源的消耗及其高並發性能強而廣泛應用於各種生產部署。而且nginx是基於事件驅動模型(epoll)實現的I/O多路復用,並透過非同步、非阻塞的方式處理請求。在高連線並發的情況下,Nginx是Apache伺服器不錯的替代品。而我們為什麼要選擇Nginx呢?

    二、Nginx特點

    • 高並發、高效能;

    • 高可靠(可以7*24小時不間斷運行);

    • 可擴展性強(高度模組化設計,添加模組平穩);

    • 作為Web 伺服器:相比Apache, Nginx 使用更少的資源,支援更多的並發連線;

    • 作為負載平衡伺服器:可以進行自訂配置,支援虛擬主機、支援URL重定向、支援網路監控等。

    • Nginx 安裝非常的簡單,設定檔非常簡潔(也能夠支援perl語法),Bugs少;

    • ##處理靜態文件,索引檔案以及自動索引;

    • 反向代理加速(無快取),簡單的負載平衡和容錯;

    • 支援熱部署(可在不停止伺服器的情況下升級nginx)。

    這就是為什麼要選擇Nginx的原因。而且Nginx的功能特點不只這些,上面只是簡單列舉了幾點常見功能。

    三、Nginx負載平衡

    在我們實際生產中,一台伺服器的處理能力、儲存空間是有限的, 不要企圖去換更強大的伺服器,對大型網站而言,不管多麼強大的伺服器,都滿足不了網站持續成長的業務需求。在這種情況下,更恰當的做法是增加一台伺服器來分擔原有伺服器的存取及儲存壓力。實際上這就是我們所謂的

    負載平衡,Nginx作為負載平衡伺服器,它透過反向代理來對後端多台伺服器負載平衡。首先來說一下Nginx負載平衡策略及負載平衡演算法。

    3.1 認識upstream 模組

    upstream 這個模組是寫一組被代理的伺服器位址(也就是定義的後端伺服器清單中選取一台伺服器接受使用者的請求),然後設定負載均衡的算法。來看看最基本的負載平衡實例:

    upstream test { 
          server 10.20.151.114:80;
          server 10.20.151.115:80;
    }
    server {
          ....
          location / {         
                 proxy_pass  http://test;     --请求转向 test 定义的服务器列表         
          }

    3.2 Nginx負載平衡策略

    (1)輪詢

    最基本的設定方法,上面的例子就是輪詢的方式,它是upstream模組預設的負載平衡預設策略。每個請求會依時間順序逐一分配到不同的後端伺服器。

    upstream test { 
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;
    }

    (2)ip_hash

    每個請求按存取IP的hash結果分配,同一個IP客戶端固定存取一個後端伺服器。可以保證來自同一ip的請求被打到固定的機器上,可以解決session問題。

    upstream test { 
    	  ip_hash;  --同一个IP客户端固定访问一个后端服务器
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;
    }

    (3)url_hash

    按存取url的hash結果來分配請求,使每個url定向到同一個後端伺服器。一旦快取住了資源,再此收到請求,就可以從快取中讀取。

    upstream test { 
    	  hash $request_uri;  --实现每个url定向到同一个后端服务器
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;
    }

    (4)least_conn

    把請求轉送給連線數較少的後端伺服器。輪詢演算法是把請求平均的轉送給各個後端,使它們的負載大致相同;但是,有些請求佔用的時間很長,會導致其所在的後端負載較高。在這種情況下,least_conn這種方式就可以達到更好的負載平衡效果。

    upstream test { 
    	  least_conn;  --把请求转发给连接数较少的后端服务器
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;
    }

    (5)weight

    權重方式,在輪詢策略的基礎上指定輪詢的幾率。

    upstream test { 
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;  --轮询的几率相对上一条要大
    }

    (6)fair

    此種演算法可以依據頁面大小和載入時間長短智慧地進行負載平衡,也就是根據後端伺服器的回應時間來分配請求,回應時間短的優先分配。

    upstream test { 
          server 10.20.151.114:80; weight=1;
          server 10.20.151.115:80; weight=2;
          fair;  --实现响应时间短的优先分配
    }

    nginx負載平衡配置狀態參數

    • #down:表示目前的server暫時不參與負載平衡。

    • backup:預留的備份機器。當其他所有的非backup機器故障或忙碌的時候,才會要求backup機器,因此這台機器的壓力最輕。

    • max_fails:允許請求失敗的次數,預設為1。當超過最大次數時,傳回proxy_next_upstream 模組定義的錯誤。

    • fail_timeout:經歷了max_fails次失敗後,暫停服務的時間單位秒。 max_fails可以和fail_timeout一起使用。

    Nginx可分为二层、三层、四层、七层负载均衡。 所谓的二层就是基于MAC地址的负载均衡, 三层就是基于IP地址的负载均衡,四层就是基于IP+端口的负载均衡,七层就是基于URL等应用层信息的负载均衡。因篇幅较长这里不再做具体的介绍,有兴趣的可自行百度。这里以七层负载均衡来做实例。

    3.3 Nginx负载均衡实例

    环境准备:准备3台Nginx服务器,一台作为负载均衡服务器,其它两台作为后端服务器。

    10.20.151.240 ----proxy_server(负载均衡服务器)

    10.20.151.112 ----server1(后端服务器1)

    10.20.151.113 ----server2(后端服务器2)

    (1)负载均衡服务器配置

    vim /etc/nginx/nginx.conf        --配置主配置文件
    vim /etc/nginx/conf.d/test.conf  --配置子配置文件

    Nginx如何實現負載平衡

    Nginx如何實現負載平衡

    (2)后端服务器配置

    vim /usr/local/nginx/conf/nginx.conf    --修改配置文件
    vim /usr/local/nginx/html/index.html    --添加测试数据

    Nginx如何實現負載平衡

    Nginx如何實現負載平衡

    (3)负载均衡测试

    在浏览器端访问http://10.20.151.240/,在实际生产中,这两个页面返回的结果是一样的,这里是为了测试效果,所以返回了不同的内容。而为什么刷新后又会返回不同结果呢?那是因为负载均衡默认的均衡策略(或算法)是轮询,所以每刷新一次就会从不同的后端服务器返回不同的请求结果,减轻单个后端服务器的访问量,提升客户端的访问效率,从而达到负载均衡的效果。

    Nginx如何實現負載平衡

    Nginx如何實現負載平衡

    当我添加权重(weight)时

    Nginx如何實現負載平衡

    再次访问http://10.20.151.240/

    Nginx如何實現負載平衡

    Nginx如何實現負載平衡

    加权重和没加权重有什么区别呢?在实际生产中,我们一般会将配置较高的服务器的权重设置高一点,其实就是客户端在访问时,权重较高的服务器会被多次请求,这样能减轻配置较低的服务器的请求量,从而更好的实现负载均衡。

    当我添加backup状态参数时

    Nginx如何實現負載平衡

    再次访问http://10.20.151.240/

    Nginx如何實現負載平衡

    此时我故意停掉第一台后端服务器,继续访问http://10.20.151.240/

    Nginx如何實現負載平衡

    当我给113这台后端服务器添加backup后,它就会作为热备服务器,添加的主要目的就是当我其他后端服务器都宕机的情况下,我的热备服务器还能继续提供同样的服务(注意:在其他后端服务器还未宕机之前,该热备服务器是不工作的)。因此负载均衡不仅能达到各个后端服务器负载的均衡,同时通过配置相关转态参数还能保证客户端请求时不造成服务器宕机的情况,保证了后端服务器的稳定性。其他状态参数这里我不再做演示(因为配置方式都一样)。

    以上是Nginx如何實現負載平衡的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除