<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>

          【實(shí)戰(zhàn)】5 分鐘學(xué)會(huì) Nginx 負(fù)載均衡

          共 7611字,需瀏覽 16分鐘

           ·

          2021-06-22 08:11


          陸陽陽,微醫(yī)前端技術(shù)部前端開發(fā)工程師,做一條安靜的咸魚。

          前言

          這篇文章需要一點(diǎn)點(diǎn)的 nginx 基礎(chǔ)知識(shí)~

          不會(huì)也沒關(guān)系,先給各位貼一個(gè)最簡(jiǎn)單的 nginx.conf 配置,看完就會(huì)

              
          http {
              include       mime.types;
              default_type  application/octet-stream;
              sendfile        on;
              keepalive_timeout  65;
              server {

                  listen       8081;
                  server_name  localhost;

                  location / {
                      proxy_pass      http://0.0.0.0:9000;
                  }

                  error_page   500 502 503 504  /50x.html;
                  location = /50x.html {
                      root   html;
                  }
              }
          }

          并且起一個(gè)最簡(jiǎn)單的 node 服務(wù):

          const http = require('http');
          const server = http.createServer();
          const host = '0.0.0.0'
          const port = 9000
          let n = 0
          server.on('request'function (req, res{
            n += 1
            console.log('請(qǐng)求來了: ', n)
            res.write('Hello World!!!');
            res.end();
          });
          server.listen(port, host, function ({
            console.log(`服務(wù)器啟動(dòng)了,請(qǐng)?jiān)L問:http://${host}:${port}`);
          })

          訪問 http://localhost:8081/ , nginx 已經(jīng)能把請(qǐng)求正常打到 node 9000  端口的服務(wù)了

          image.png

          接下來進(jìn)入正題,講講負(fù)載均衡了~

          什么是負(fù)載均衡

          舉個(gè)例子,工地上新到了一車磚,老板要求天黑之前需要搬完。但是工地上只有一個(gè)工人,這種情況下每趟要搬 1000 斤才有可能在天黑前搬完。但是如果 1000 斤的磚扛在肩上,那這個(gè)工人一下就被打死了。這個(gè)時(shí)候包工頭另外招了兩個(gè)人,三個(gè)人一起干,每個(gè)人扛 300 斤,那大家都很輕松的把活干完了,沒人會(huì)死。

          放到服務(wù)器上也是同樣的道理?,F(xiàn)在假設(shè)每秒鐘有 1000 個(gè)請(qǐng)求,一臺(tái)服務(wù)器處理不過來,分分鐘會(huì)掛掉。我們把服務(wù)器加到 3 臺(tái),這樣每臺(tái)處理 300 個(gè),每臺(tái)都輕輕松松。

          那么問題來了,三個(gè)工人的身體強(qiáng)弱是有區(qū)別的。包工頭在安排活的時(shí)候是做到絕對(duì)的公平每人背 300 斤?還是按照實(shí)工人實(shí)際身體情況,能者多勞?

          服務(wù)器也是一樣的道理,不同的服務(wù)器處理能力是不一樣的。nginx 負(fù)載均衡 做的事情就是根據(jù)服務(wù)器的能力去 平衡 大量請(qǐng)求到達(dá)各個(gè)服務(wù)器的數(shù)量。這里的 平衡 并不是絕對(duì)的 平均,具體怎么樣去平衡請(qǐng)求,我們可以根據(jù)自己的需求去設(shè)置不同的 平衡策略

          負(fù)載均衡策略

          輪詢策略(默認(rèn))

          按照上面講的,要玩負(fù)載均衡,首先得是多臺(tái)機(jī)器,一臺(tái)也玩不起來啊。但是條件有限,我這邊在不同端口起多個(gè)相同的 node 服務(wù)來表示多臺(tái)機(jī)器:

          如上圖,三個(gè)服務(wù)完全相同,分別用 9000、90019002 端口啟動(dòng),接下來修改 nginx.conf 文件,nginx 負(fù)載均衡 主要是通過配置 upstream 來實(shí)現(xiàn)的:

              
          http {
              include       mime.types;
              default_type  application/octet-stream;
              sendfile        on;
              keepalive_timeout  65;
              
              upstream test {
           server 0.0.0.0:9000;
           server 0.0.0.0:9001
           server 0.0.0.0:9002;
              }
              
              server {

                  listen       8081;
                  server_name  localhost;

                  location / {
                      proxy_pass      http://test;
                  }

                  error_page   500 502 503 504  /50x.html;
                  location = /50x.html {
                      root   html;
                  }
              }
          }

          從上面代碼可以看出,改動(dòng)是比較簡(jiǎn)單的,增加了一個(gè) upsteam 配置。這個(gè)是最簡(jiǎn)單的 輪詢策略,大量請(qǐng)求打過來后,nginx 將這些請(qǐng)求 平均 分配到 3 臺(tái)服務(wù)器上。接下來我們通過工具批量發(fā)送 600 個(gè)請(qǐng)求, 來測(cè)試下我們的配置是否生效:

          從結(jié)果來看符合預(yù)期, 每個(gè)服務(wù)處理 200 個(gè)請(qǐng)求。

          加權(quán)輪詢策略

          這個(gè)也很簡(jiǎn)單,從名字可以猜出來一些,這個(gè)是按照我們指定的權(quán)重來輪詢,nginx.conf 修改如下:

              
          http {
              include       mime.types;
              default_type  application/octet-stream;
              sendfile        on;
              keepalive_timeout  65;
              
              upstream test {
           server 0.0.0.0:9000 weight=2;
           server 0.0.0.0:9001 weight=1
           server 0.0.0.0:9002 weight=1;
              }
              
              server {

                  listen       8081;
                  server_name  localhost;

                  location / {
                      proxy_pass      http://test;
                  }

                  error_page   500 502 503 504  /50x.html;
                  location = /50x.html {
                      root   html;
                  }
              }
          }

          我們?cè)诿總€(gè)服務(wù)地址后面加上 weight 參數(shù)來表示權(quán)重, 這里的意思是 9000 端口處理50%的請(qǐng)求, 9001 端口處理25%的請(qǐng)求, 9002 端口處理25%的請(qǐng)求。

          再來測(cè)試下,批量發(fā)送 100 個(gè)請(qǐng)求看看結(jié)果:

          符合預(yù)期

          ip_hash 策略

          這個(gè)也很簡(jiǎn)單,看名字也能猜出來一點(diǎn),根據(jù) ip 來分配請(qǐng)求。固定的客戶端發(fā)出的請(qǐng)求會(huì)被固定分配到一臺(tái)服務(wù)器。接著修改 nginx.conf 配置

              
          http {
              include       mime.types;
              default_type  application/octet-stream;
              sendfile        on;
              keepalive_timeout  65;
              
              upstream test {
                  ip_hash;
           server 0.0.0.0:9000;
           server 0.0.0.0:9001
           server 0.0.0.0:9002;
              }
              
              server {

                  listen       8081;
                  server_name  localhost;

                  location / {
                      proxy_pass      http://test;
                  }

                  error_page   500 502 503 504  /50x.html;
                  location = /50x.html {w
                      root   html;
                  }
              }
          }

          這里還是因?yàn)闂l件不允許,照理要用多個(gè)客戶端來訪問,并在控制臺(tái)打出 ip 來看結(jié)果,但是我只有本機(jī)一臺(tái)機(jī)器,所以做不了這個(gè)實(shí)驗(yàn)。

          用迂回一點(diǎn)的方式來驗(yàn)證下,既然是根據(jù) ip 來分配請(qǐng)求的,那我本機(jī)發(fā) 100 個(gè)請(qǐng)求,這 100 個(gè)請(qǐng)求應(yīng)該會(huì)被打到同一臺(tái)服務(wù)器上,另外兩臺(tái)接收到的請(qǐng)求數(shù)量為 0,來測(cè)試下:

          從結(jié)果來看也是符合預(yù)期的,這里只有 9002 端口起的服務(wù)收到了 100 個(gè)請(qǐng)求,其他兩個(gè)服務(wù)收到的請(qǐng)求數(shù)量為 0

          總結(jié)

          雖然短小了點(diǎn),但是花5分鐘應(yīng)該能完全看懂 nginx 負(fù)載均衡 了,以后再也不怕別人裝逼了~


          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  欧美日韩三级片免费观看 | 成人自拍偷拍 | 黄色一级片色大师 | 国产精品九九九九九九九九九 | 日韩黄色在线观看 |