前面的話
常常聽說負載均衡與反向代理,通過這篇文章一起體驗一番。文章後面的小實例,可以體驗一把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後,全局安裝
express
:npm 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個簡單的服務器,端口分別爲:8566
、8867
、8700
。
-
-
修改
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
的次數最多。
參考文章: