陸陽陽,微醫前端技術部前端開發工程師,作一條安靜的鹹魚。html
這篇文章須要一點點的 nginx 基礎知識前端
不會也不要緊,先給各位貼一個最簡單的 nginx.conf
配置,看完就會node
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 服務:nginx
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(`服務器啓動了,請訪問:http://${host}:${port}`);
})
複製代碼
訪問 http://localhost:8081/
, nginx
已經能把請求正常打到 node 9000
端口的服務了服務器
接下來進入正題,講講負載均衡了markdown
舉個例子,工地上新到了一車磚,老闆要求天黑以前須要搬完。可是工地上只有一個工人,這種狀況下每趟要搬 1000 斤纔有可能在天黑前搬完。可是若是 1000 斤的磚扛在肩上,那這個工人一下就被打死了。這個時候包工頭另外招了兩我的,三我的一塊兒幹,每一個人扛 300 斤,那你們都很輕鬆的把活幹完了,沒人會死app
放到服務器上也是一樣的道理。如今假設每秒鐘有 1000 個請求,一臺服務器處理不過來,分分鐘會掛掉。咱們把服務器加到 3 臺,這樣每臺處理 300 個,每臺都輕輕鬆鬆。負載均衡
那麼問題來了,三個工人的身體強弱是有區別的。包工頭在安排活的時候是作到絕對的公平每人背 300 斤?仍是按照實工人實際身體狀況,能者多勞?工具
服務器也是同樣的道理,不一樣的服務器處理能力是不同的。nginx 負載均衡
作的事情就是根據服務器的能力去 平衡
大量請求到達各個服務器的數量。這裏的 平衡
並非絕對的 平均
,具體怎麼樣去平衡請求,咱們能夠根據本身的需求去設置不一樣的 平衡策略
測試
按照上面講的,要玩負載均衡,首先得是多臺機器,一臺也玩不起來啊。可是條件有限,我這邊在不一樣端口起多個相同的 node 服務來表示多臺機器
如上圖,三個服務徹底相同,分別用 9000
、9001
、9002
端口啓動,接下來修改 nginx.conf
文件,nginx 負載均衡
主要是經過配置 upstream
來實現的:
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 臺服務器上。接下來咱們經過工具批量發送 600 個請求, 來測試下咱們的配置是否生效:
從結果來看符合預期, 每一個服務處理 200 個請求。
這個也很簡單,從名字能夠猜出來一些,這個是按照咱們指定的權重來輪詢,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;
}
}
}
複製代碼
咱們在每一個服務地址後面加上 weight
參數來表示權重, 這裏的意思是 9000
端口處理50%
的請求, 9001
端口處理25%
的請求, 9002
端口處理25%
的請求。
再來測試下,批量發送 100 個請求看看結果:
符合預期
這個也很簡單,看名字也能猜出來一點,根據 ip 來分配請求。固定的客戶端發出的請求會被固定分配到一臺服務器。接着修改 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 來看結果,可是我只有本機一臺機器,因此作不了這個實驗。
用迂迴一點的方式來驗證下,既然是根據 ip 來分配請求的,那我本機發 100 個請求,這 100 個請求應該會被打到同一臺服務器上,另外兩臺接收到的請求數量爲 0,來測試下:
從結果來看也是符合預期的,這裏只有 9002 端口起的服務收到了 100 個請求,其餘兩個服務收到的請求數量爲 0
雖然短小了點,可是花5分鐘應該能徹底看懂 nginx 負載均衡
了,之後不再怕別人裝逼了