前端也需要懂,負載均衡與Nginx反向代理

前面的話

常常聽說負載均衡與反向代理,通過這篇文章一起體驗一番。文章後面的小實例,可以體驗一把Nginx是如何負載均衡的。

正向代理

舉個例子: 比如你要直接訪問一個外網,但是被限制了,你只好去找一個代理服務器(這個代理服務器可以與你要訪問的網站通信),把請求發給代理服務器,由代理服務器代替你去請求,最終再由代理服務器將響應返回給你。這個過程就是一次正向代理。

正向代理的特點代理的是客戶端,代客戶端發請求,客戶端明確知道它所訪問的服務器地址,而服務器卻不明確處理請求究竟來自哪個具體的客戶端

反向代理

我們知道,一般電商網站,比如某寶,每天的訪問量那是相當大的,如果用戶發的請求全部發到單個服務器上,服務器很容易崩潰,所以一般會部署多臺服務器來分擔。

同樣,我們還是不能直接去訪問這些服務器,還是要將請求發到代理服務器上,代理服務器按一定的規則將請求發給各個服務器,最後再由代理服務將響應發回來。這個過程就是反向代理。

反向代理的特點: 代理的是服務器,代服務器接收請求,客戶端不知道自己最終請求的是哪一個服務器

負載均衡

均衡這個詞,可以理解爲保持每個服務器的壓力均等,不要出現,有的服務器承載了很大的負載,而有的服務器幾乎0負載。

那麼負載均衡實際上就是將大量的請求進行分佈式處理,按規則分發給每個服務器,使得每個服務器都不會出現過大負載

Nginx是什麼?

Nginx作爲一個基於C實現的高性能Web服務器,可以通過一系列算法 來實現負載均衡。

具有高性能、高併發、低內存佔用的特點。通常被用爲反向代理的工具。也就是說Nginx作爲反向代理服務器,它會選擇一臺壓力小的服務器來處理你的請求。

總結: 用戶訪問網站時,首先會訪問Nginx服務器,然後Nginx服務器再從服務器集羣中選擇壓力較小的服務器,來處理用戶的請求

Nginx的協議支持

Nginx工作在網絡的第7層,支持HTTP/HTTPS協議的負載均衡。

Nginx支持的負載均衡調度算法
  • weighted round robin(加權輪詢): 每個服務器有自己的權重weght, weight值越大意味着該服務器的性能越好,可以承載更多的請求。該算法中 ,Nginx會將請求都分配給高權重的服務器,直到該服務器權重降到比其他服務器低,再將請求分配給下一個高權重的服務器。
  • IP 哈希(IP hash): 根據客戶端的ip的hash值將請求分類,同一ip發出的請求映射到同一服務器上。在一定程度上解決了集羣部署環境下Session不共享的問題。
  • fair: 智能動態調度算法,動態的根據後端服務器的響應時間來判斷負載情況,響應時間長表示負載高,分配的請求就會少。(Nginx默認不支持fair算法,如果要使用,要安裝upstream_fair模塊)
  • URL hash: 根據請求的URL的hash值來分配服務器,相同的URL的請求會分配給固定的服務器當存在緩存的時候,效率一般較高。(同樣要注意Nginx默認不支持這種調度算法,要使用的話需要安裝Nginx的hash軟件包)
Nginx反向代理與負載均衡的實現
  • 安裝Nginx
    去官網下載對應的nginx版本,解壓,注意:放置的路徑不要有中文
    在這裏插入圖片描述
    小柒這裏直接放置E盤:
    在這裏插入圖片描述
    修改conf目錄下的nginx.conf文件,將端口修改,以免端口衝突,小柒這裏設置爲8888.
    在這裏插入圖片描述

    打開cmd命令行,進入目錄,使用nginx -t檢查配置是否正確:
    在這裏插入圖片描述
    正確後,使用nginx -start 命令啓動,訪問剛剛設置的localhost:8888,就可以看到歡迎頁面:
    在這裏插入圖片描述

    常用命令:啓動nginx : nginx -start ;重啓nginx: nginx -s reload;關閉nginx:nginx -s stop;檢查配置:nginx -t

  • nginx.conf文件的簡單說明:

    • worker_processes: 工作進程數,和CPU核數相同

    • worker_connections: 每個進程允許的最大連接數

    • upstream模塊: 負載均衡就靠它。(下面我們會用到)

        upstream firstdemo {
              server  xxx;
              server  xxx;
              server  xxx;
          }
      
      語法格式:upstream xxx {
        // 裏面的server分別對應着不同的服務器
       } 
      
    • server模塊 :實現反向代理(主要依靠proxy_pass來配置)。

      server {
              listen 8080; // 監聽的端口號
              location / {
              	root   html;
      			index  index.html index.htm;
                  proxy_pass http://xxx; // 代理哪些服務器(上面upstream 對應的名字)
              }
          }
      
  • 基於Node + Express 來搭建簡單的服務器

    • 安裝node後,全局安裝expressnpm i express

    • 新建index.js文件,搭建一個簡單的服務器,多建幾個

      // server1.js
      const express = require('express');
      const app = express();
      
      const port = '8566';
      
      app.get('/', (req, res) =>res.end(`Hello, i am prot ${prot}`));
      
      app.listen(port, () =>console.log(`運行在: ${port}`));
      

      運行:node server1.js 。小柒這裏建了3個簡單的服務器,端口分別爲:856688678700

  • 修改nginx.conf文件

    • 在http模塊裏,添加upstream對象,不同的server設置了不同的權重。

      upstream webServer {
      	server localhost:8566 weight=10; 
        	server localhost:8867 weight=2;
        	server localhost:8700;
          }
      
    • 在http模塊的server對象,寫上代理地址:

       location / {
                  root   html;
                  index  index.html index.htm;
      	    proxy_pass http://webServer; // 與上面一致
              }
      
  • 重啓Nginx服務,每修改一次配置文件,就要重新啓動。再次打開http://localhost:8888
    在這裏插入圖片描述

    嘗試的多刷新幾次,可以發現權重越高的服務器,接受的請求越多,這裏返回8566的次數最多。

參考文章:

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