5 分鐘學會 Nginx 負載均衡實用知識點

陸陽陽,微醫(yī)前端技術(shù)部前端開發(fā)工程師,做一條安靜的咸魚。
前言
回復(fù)1,加入高級Node交流群
這篇文章需要一點點的 nginx 基礎(chǔ)知識~
不會也沒關(guān)系,先給各位貼一個最簡單的 nginx.conf 配置,看完就會
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;
}
}
}
并且起一個最簡單的 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('請求來了: ', n)
res.write('Hello World!!!');
res.end();
});
server.listen(port, host, function () {
console.log(`服務(wù)器啟動了,請訪問:http://${host}:${port}`);
})
訪問 http://localhost:8081/ , nginx 已經(jīng)能把請求正常打到 node 9000 端口的服務(wù)了
接下來進入正題,講講負載均衡了~
什么是負載均衡
舉個例子,工地上新到了一車磚,老板要求天黑之前需要搬完。但是工地上只有一個工人,這種情況下每趟要搬 1000 斤才有可能在天黑前搬完。但是如果 1000 斤的磚扛在肩上,那這個工人一下就被打死了。這個時候包工頭另外招了兩個人,三個人一起干,每個人扛 300 斤,那大家都很輕松的把活干完了,沒人會死。
放到服務(wù)器上也是同樣的道理。現(xiàn)在假設(shè)每秒鐘有 1000 個請求,一臺服務(wù)器處理不過來,分分鐘會掛掉。我們把服務(wù)器加到 3 臺,這樣每臺處理 300 個,每臺都輕輕松松。
那么問題來了,三個工人的身體強弱是有區(qū)別的。包工頭在安排活的時候是做到絕對的公平每人背 300 斤?還是按照實工人實際身體情況,能者多勞?
服務(wù)器也是一樣的道理,不同的服務(wù)器處理能力是不一樣的。nginx 負載均衡 做的事情就是根據(jù)服務(wù)器的能力去 平衡 大量請求到達各個服務(wù)器的數(shù)量。這里的 平衡 并不是絕對的 平均,具體怎么樣去平衡請求,我們可以根據(jù)自己的需求去設(shè)置不同的 平衡策略
負載均衡策略
輪詢策略(默認)
按照上面講的,要玩負載均衡,首先得是多臺機器,一臺也玩不起來啊。但是條件有限,我這邊在不同端口起多個相同的 node 服務(wù)來表示多臺機器:
如上圖,三個服務(wù)完全相同,分別用 9000、9001、9002 端口啟動,接下來修改 nginx.conf 文件,nginx 負載均衡 主要是通過配置 upstream 來實現(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;
}
}
}
從上面代碼可以看出,改動是比較簡單的,增加了一個 upsteam 配置。這個是最簡單的 輪詢策略,大量請求打過來后,nginx 將這些請求 平均 分配到 3 臺服務(wù)器上。接下來我們通過工具批量發(fā)送 600 個請求, 來測試下我們的配置是否生效:
從結(jié)果來看符合預(yù)期, 每個服務(wù)處理 200 個請求。
加權(quán)輪詢策略
這個也很簡單,從名字可以猜出來一些,這個是按照我們指定的權(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;
}
}
}
我們在每個服務(wù)地址后面加上 weight 參數(shù)來表示權(quán)重, 這里的意思是 9000 端口處理50%的請求, 9001 端口處理25%的請求, 9002 端口處理25%的請求。
再來測試下,批量發(fā)送 100 個請求看看結(jié)果:
符合預(yù)期
ip_hash 策略
這個也很簡單,看名字也能猜出來一點,根據(jù) ip 來分配請求。固定的客戶端發(fā)出的請求會被固定分配到一臺服務(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;
}
}
}
這里還是因為條件不允許,照理要用多個客戶端來訪問,并在控制臺打出 ip 來看結(jié)果,但是我只有本機一臺機器,所以做不了這個實驗。
用迂回一點的方式來驗證下,既然是根據(jù) ip 來分配請求的,那我本機發(fā) 100 個請求,這 100 個請求應(yīng)該會被打到同一臺服務(wù)器上,另外兩臺接收到的請求數(shù)量為 0,來測試下:
從結(jié)果來看也是符合預(yù)期的,這里只有 9002 端口起的服務(wù)收到了 100 個請求,其他兩個服務(wù)收到的請求數(shù)量為 0
總結(jié)
雖然短小了點,但是花5分鐘應(yīng)該能完全看懂 nginx 負載均衡 了,以后再也不怕別人裝逼了~

“分享、點贊、在看” 支持一波!
