<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx系列:負載均衡

          共 4337字,需瀏覽 9分鐘

           ·

          2020-08-17 09:25


          及閱讀文本大概需要3分鐘。

          0x01:負載均衡

          ? ? ? Nginx的負載均衡使用upstream定義服務(wù)器組,后面跟著組名,組名后面是大括號包起來的服務(wù)器列表,每個服務(wù)器使用server開頭,后面跟定義的服務(wù)器名字、服務(wù)器ip:port、參數(shù);一個基本的upstream模塊如下:

          upstream?[服務(wù)器組名稱]{
            server?[IP地址]:[端口號];
            server?[IP地址]:[端口號];
            ....
          }

          在upstream模塊定義完成后,要讓指定的訪問反向代理到服務(wù)器列表,格式如下:

          location?~?.*$?{
            index?index.jsp?index.html;
            proxy_pass?http://[服務(wù)器組名稱];
          }


          0x02:SpringBoot項目準備

          在進行Nginx負載均衡配置前,先搭建一個簡單的后端應(yīng)用項目:nginx-upstream

          • pom.xml文文件

          <project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          ????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">

          ????<modelVersion>4.0.0modelVersion>


          ????<groupId>com.sentinelgroupId>
          ????<artifactId>nginx-upstreamartifactId>
          ????<version>0.0.1-SNAPSHOTversion>
          ????<packaging>jarpackaging>

          ????<parent>
          ????????<groupId>org.springframework.bootgroupId>
          ????????<artifactId>spring-boot-starter-parentartifactId>
          ????????<version>2.1.3.RELEASEversion>
          ????????<relativePath/>?
          ????parent>

          ????<name>nginx-upstreamname>
          ????<url>http://maven.apache.orgurl>

          ????<properties>
          ????????<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
          ????????<java.version>1.8java.version>
          ????properties>

          ????<dependencies>
          ????????<dependency>
          ????????????<groupId>org.springframework.bootgroupId>
          ????????????<artifactId>spring-boot-starter-webartifactId>
          ????????dependency>

          ????dependencies>

          ????<dependencyManagement>
          ????????<dependencies>
          ????????????<dependency>
          ????????????????<groupId>org.springframework.cloudgroupId>
          ????????????????<artifactId>spring-cloud-dependenciesartifactId>
          ????????????????<version>Greenwich.SR3version>
          ????????????????<type>pomtype>
          ????????????????<scope>importscope>
          ????????????dependency>
          ????????dependencies>
          ????dependencyManagement>

          project>
          • 控制器controller

          • application.yml配置文件

          server:
          ??port:?8866
          #??port:?8867

          spring:
          ??application:
          ????name:?nginx-upstream
          • SpringBoot啟動類

          package?com.olive;

          import?org.springframework.boot.SpringApplication;
          import?org.springframework.boot.autoconfigure.SpringBootApplication;

          @SpringBootApplication
          public?class?Application?{

          ????public?static?void?main(String[]?args)?{
          ????????SpringApplication.run(Application.class,?args);
          ????}

          }

          因為只有一臺電腦,為了演示Nginx負載均衡,后文會通過修改application.yml配置文件的端口和控制器controller的返回值來標識不同的應(yīng)用服務(wù)器。

          驗證項目是否搭建成功

          http://127.0.0.1:8866/getUser

          http://127.0.0.1:8867/getUser


          0x03:配置負載均衡

          以下命令均在root用戶下操作

          進入Nginx的配置文件目錄

          cd?/usr/local/nginx/conf/
          • 增加upstream模塊配置

          upstream?myserver?{
          ?????server?192.168.56.1:8866;
          ?????server?192.168.56.1:8867;
          }

          注意在http模塊添加upstream

          upstream可以有多個,名稱不同即可。

          • 配置location轉(zhuǎn)發(fā)規(guī)則

          location?/?{???#首頁負載之后端服務(wù)器
          ?????proxy_pass??http://myserver;??#通過upstrean定義的服務(wù)器組名調(diào)用后端服務(wù)器
          ?????proxy_set_header?X-Real-IP?$remote_addr;??#傳遞客戶端的ip地址
          }

          配置完成后可以使用如下命令啟動Nginx

          /usr/local/nginx/sbin/nginx?-c???\
          /usr/local/nginx/conf/nginx.conf


          0x04:驗證

          使用命令ifconfig查下CentOS系統(tǒng)的ip地址


          從上圖可以看出CentOS和Windows的ip地址分別為

          192.168.56.9??#CentOS
          192.168.56.1? #Windows

          訪問http://192.168.56.9/getUser

          返回出現(xiàn)的結(jié)果是隨意的,有可能訪問192.168.56.1:8866,可有可能192.168.56.1:8867。


          0x05: 知識擴展

           這樣就完成了最基本的負載均衡,但是這并不能滿足實際需求。目前Nginx的upstream模塊支持6種方式的負載均衡策略(算法):輪詢(默認方式)、weight(權(quán)重方式)、ip_hash(依據(jù)ip分配方式)、least_conn(最少連接方式)、fair(第三方提供的響應(yīng)時間方式)、url_hash(第三方通過的依據(jù)URL分配方式)。

          1)輪詢

            最基本的配置方法,是upstream模塊默認的負載均衡策略。每個請求會按時間順序平均分配到不同的后端服務(wù)器。有如下參數(shù):

          • fail_timeout: 與max_fails結(jié)合使用

          • max_fails: 在fail_timeout參數(shù)設(shè)置的時間內(nèi)最大失敗次數(shù)。如果在這個時間內(nèi),所有該服務(wù)器的請求都失敗了,那么認為該服務(wù)器停機

          • fail_time: 服務(wù)器被認為停機的時長,默認10s(被認為停機的服務(wù)器嘗試間隔?)

          • backup: 標記該服務(wù)器為備用服務(wù)器。當主服務(wù)器停止時,請求會被發(fā)送到它這里

          • down: 標記服務(wù)器永久停機

          注意:

          • down標記的服務(wù)器會自動剔除;

          • 缺省就是輪詢;

          • 此策略適合服務(wù)器配置無狀態(tài)且短平塊的服務(wù)使用

          2)weight

          ? ? 權(quán)重方式,在輪詢策略的基礎(chǔ)上指定輪詢的幾率。也可以認為是在輪詢的基礎(chǔ)上新增了一個weight的參數(shù),此參數(shù)指定輪詢的幾率,值為number。upstream模塊配置模板如下:

          upstream?[服務(wù)器組名稱]{
            server?[IP地址]:[端口號]?weight=2;
            server?[IP地址]:[端口號];
            ....
          }

          ? ? ? ?在該例子中,沒有weight參數(shù)的服務(wù)器默認為1,weight的數(shù)值與訪問比例成正比,所有weight值的總和為一個循環(huán)單位,服務(wù)器自身的weight值為循環(huán)單位內(nèi)的輪詢次數(shù)。

          注意:

          • 權(quán)重越高分配到的請求越多;

          • 此策略可以和least_conn策略、iphash策略結(jié)合使用;

          • 此策略比較適合服務(wù)器硬件配置差距較大的情況。

          3)ip_hash

            依據(jù)ip分配方式,指定負載均衡器按照基于客戶端IP的分配方式,這個方法確保了相同的客戶端請求一致發(fā)送到相同的服務(wù)器,以保證session會話。這樣每個訪客都固定訪問一個后端服務(wù)器,可以解決session不能跨服務(wù)器的問題。upstream模塊配置模板如下:

          upstream?[服務(wù)器組名稱]{
            ip_hash;
            server?[IP地址]:[端口號]?weight=2;
            server?[IP地址]:[端口號];
            ....
          }

          注意:

          • nginx1.3.1之前的版本不能在ip_hash中使用權(quán)重(weight);

          • ip_hash不能與backup同時使用;

          • 此策略適合有狀態(tài)服務(wù)的程序,比如session;

          • 當有服務(wù)器需要剔除,必須手動down掉。

          4)least_conn

            最少連接方式,把請求發(fā)給鏈接數(shù)最少的后端服務(wù)器。輪詢是把請求平均分配給各個后端,使它們的負載大致相同。但是,有些請求占用的時間很長,會導(dǎo)致其所在的后端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。upstream模塊配置模板如下:

          upstream?[服務(wù)器組名稱]{
            least_conn;
            server?[IP地址]:[端口號]?weight=2;
            server?[IP地址]:[端口號];
            ....
          }

          注意:

          • 此策略適合請求處理時間長短不一造成的服務(wù)器過載情況;

          5)fair

            響應(yīng)時間方式,按照服務(wù)器端的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。upstream模塊配置模板如下:

          upstream?[服務(wù)器組名稱]{
            server?[IP地址]:[端口號]?weight=2;
            server?[IP地址]:[端口號];
            ....
            fair;
          }

          注意:

          • 需要安裝第三方插件';

          6)url_hash

            url分配方式,按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,要配合緩存命中來使用。同一個資源多次請求可能會到達不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一臺服務(wù)器,一旦緩存住了資源,再次收到請求,就可以在緩存中讀取。upstream模塊配置模板如下:

          upstream?[服務(wù)器組名稱]{
            hash?$request_uri;
            server?[IP地址]:[端口號]?weight=2;
            server?[IP地址]:[端口號];
            ....
          }

          注意:

          • 需要安裝第三方插件;

          • uri,是i,不是小寫的L。


          這兩位小伙伴把郵寄地址及書名發(fā)一下:




          往期精彩



          01?Sentinel如何進行流量監(jiān)控

          02?Nacos源碼編譯

          03?基于Apache Curator框架的ZooKeeper使用詳解

          04?spring boot項目整合xxl-job

          05?互聯(lián)網(wǎng)支付系統(tǒng)整體架構(gòu)詳解

          關(guān)注我

          每天進步一點點

          喜歡!在看?


          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  啊v在线色 | 国产精品午夜福利视频 | 成人蜜桃av | 大鸡巴成人性爱在线视频 | 国产精品白虎 |