前端代理怎么設(shè)置之負(fù)載均衡
以下部分內(nèi)容由小紅書(www.xiaohongshutuiguang.cn)轉(zhuǎn)載提供
我們先來看張圖吧:

使用集群是網(wǎng)站解決高并發(fā)、海量數(shù)據(jù)問題的常用手段。當(dāng)一臺服務(wù)器的處理能力、存儲空間不足時,不要企圖去換更強(qiáng)大的服務(wù)器,對大型網(wǎng)站而言,不管多么強(qiáng)大的服務(wù)器,都滿足不了網(wǎng)站持續(xù)增長的業(yè)務(wù)需求。這種情況下,更恰當(dāng)?shù)淖龇ㄊ窃黾右慌_服務(wù)器分擔(dān)原有服務(wù)器的訪問及存儲壓力。通過負(fù)載均衡調(diào)度服務(wù)器,將來自瀏覽器的訪問請求分發(fā)到應(yīng)用服務(wù)器集群中的任何一臺服務(wù)器上,如果有更多的用戶,就在集群中加入更多的應(yīng)用服務(wù)器,使應(yīng)用服務(wù)器的負(fù)載壓力不再成為整個網(wǎng)站的瓶頸。
那么下面,我們來看下,如何通過nginx服務(wù)器,配置集群。首先,我們需要在nginx服務(wù)器,同過不同的端口號,創(chuàng)建幾個node服務(wù)。node服務(wù)的代碼類似這樣:

varhttp = require( 'http' );varserver =http.createServer(function ( request ,response ){
? ? response.end('server3 000');
} );
server.listen( 3000 ,function(){
console.log( 'HTTP服務(wù)器啟動中,端口:3000' );
});

然后,nginx中可以這樣配置:

http{
upstream zhufeng {
? ? server 127.0.0.1:3000weight=10;
? ? server 127.0.0.1:4000;
? ? server 127.0.0.1:5000;
}
server {
? ? ? ? location / {
? ? ? ? ? ? proxy_pass http://zhufeng;? ? ? ? }
? ? }
}

然后呢,安裝一下pm2:
yuminstallpm2 -g
如果太慢的話,可以試試淘寶源。這里就不說怎么配置了哦。然后安裝好pm2后,通過pm2啟動各個node服務(wù)。pm2是一個node應(yīng)用的進(jìn)程管理器。
然后,可以通過以下命令來啟動和查看node服務(wù)進(jìn)程:
# 啟動node服務(wù)
pm2 start xxx.js name xxx
# 查看當(dāng)前服務(wù)
pm2 list
后端服務(wù)器調(diào)試狀態(tài):
狀態(tài)描述
down當(dāng)前的服務(wù)器不參與負(fù)載均衡
backup當(dāng)其它節(jié)點都無法使用時的備份的服務(wù)器
max_fails允許請求失敗的次數(shù),到達(dá)最大次數(shù)就會休眠
fail_timeout經(jīng)過max_fails失敗后,服務(wù)暫停的時間,默認(rèn)10秒
max_conns限制每個server最大的接收的連接數(shù),性能高的服務(wù)器可以連接數(shù)多一些
例子:
upstream webserver{
? server localhost:3000 down;
? server localhost:4000 backup;
? server localhost:5000max_fails=1fail_timeout=10s;
}
分配方式:
類型種類
輪詢(默認(rèn))每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動剔除
weight(加權(quán)輪詢)指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況
ip_hash每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題
least_conn哪個機(jī)器上連接數(shù)少就分發(fā)給誰
url_hash(第三方)按訪問的URL地址來分配 請求,每個URL都定向到同一個后端 服務(wù)器上(緩存)
fair(第三方)按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配
正定義hashhash自定義key
例子:

upstream webserver{
? ip_hash;
? server 127.0.0.1:3000;
}
upstream webserver{
? least_conn;
? server 127.0.0.1:3000;
}
upstream webserver{
? url_hash;
? server 127.0.0.1:3000;
}
upstream webserver{
? fair;
? server 127.0.0.1:3000;
}
upstream webserver{
? hash $request_uri;
? server 127.0.0.1:3000;
}

三、其他
一)緩存
首先啊,緩存有很多種,比如之前學(xué)過的瀏覽器緩存,還有應(yīng)用服務(wù)器緩存,代理緩存,客戶端緩存等等等等。我們可以在nginx中使用prxoy_cache來設(shè)置代理緩存。
http{?
? ? # 緩存路徑 目錄層級 緩存空間名稱和大小 失效時間為7天 最大容量為10g
? ? proxy_cache_path /data/nginx/cache levels=1:2keys_zone=cache:100m inactive=60m max_size=10g;?
}?
稍微復(fù)雜點的方式如下:

if($request_uri ~ ^/cache/(login|logout)) {
? ? ? set $nocache 1;
? ? }
? ? location / {
? ? ? proxy_pass http://webserver;? ? }
? ? location ~ ^/cache/ {
? ? proxy_cache cache;
? ? proxy_cache_valid? 200206304301302 60m;? # 對哪些狀態(tài)碼緩存,過期時間為60分鐘
? ? proxy_cache_key $uri;? #緩存的維度
? ? proxy_no_cache $nocache;
? ? proxy_set_header Host $host:$server_port;? #設(shè)置頭
? ? proxy_set_header X-Real-IP $remote_addr;? #設(shè)置頭
? ? proxy_set_header? X-Forwarded-For $proxy_add_x_forwarded_for;? #設(shè)置頭
? ? proxy_pass http://127.0.0.1:6000;}

然后呢,上面的各個字段的含義如下:
鍵值含義
proxy_cache使用名為cache的對應(yīng)緩存配置
proxy_cache_valid 200 206 304 301 302 10d;對httpcode為200的緩存10天
proxy_cache_key $uri定義緩存唯一key,通過唯一key來進(jìn)行hash存取
proxy_set_header自定義http header頭,用于發(fā)送給后端真實服務(wù)器
proxy_pass指代理后轉(zhuǎn)發(fā)的路徑,注意是否需要最后的/
二)location
它的使用其實就是正則表達(dá)式,但是語法規(guī)則會有些特性,正則我就不在這里多說,咱們直接看下location的語法:
location僅匹配URI,忽略參數(shù)
前綴字符串
常規(guī)
= 精確匹配
^~ 匹配上后則不再進(jìn)行正則表達(dá)式的匹配
正則表達(dá)式
~ 大小寫敏感的正則表達(dá)式匹配
~*忽略大小寫的正則表達(dá)式匹配
內(nèi)部調(diào)轉(zhuǎn)
用于內(nèi)部跳轉(zhuǎn)的命名location @
Syntax location [=|~|~*|^~] uri {...}
? ? ? location @name{...}
default -Context server,location? ?
匹配的優(yōu)先級,按照上面的順序,從上到下,最上面的優(yōu)先級最高,我們來看個實際的例子:

location ~ /T1/$ {
? ? return 200'匹配到第一個正則表達(dá)式';
}
location ~* /T1/(\w+)$ {
? ? return 200'匹配到最長的正則表達(dá)式';
}
location ^~ /T1/ {
? ? return 200'停止后續(xù)的正則表達(dá)式匹配';
}
location? /T1/T2 {
? ? return 200'最長的前綴表達(dá)式匹配';
}
location? /T1 {
? ? return 200'前綴表達(dá)式匹配';
}
location = /T1 {
? ? return 200'精確匹配';
}

/T1// 精確匹配/T1/// 停止后續(xù)的正則表達(dá)式匹配/T1/T2// 匹配到最長的正則表達(dá)式/T1/T2/// 最長的前綴表達(dá)式匹配/t1/T2// 匹配到最長的正則表達(dá)式