日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SLB和nginx

發(fā)布時(shí)間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SLB和nginx 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SLB
Q:什么是slb?

A:負(fù)載均衡(Server Load Balancer)是將訪(fǎng)問(wèn)流量根據(jù)轉(zhuǎn)發(fā)策略分發(fā)到后端多臺(tái)云服務(wù)器(ECS實(shí)例)的流量分發(fā)控制服務(wù)。負(fù)載均衡擴(kuò)展了應(yīng)用的服務(wù)能力,增強(qiáng)了應(yīng)用的可用性。

Q:組成部分?

A:

負(fù)載均衡實(shí)例 (Server Load Balancer instances)
一個(gè)負(fù)載均衡實(shí)例是一個(gè)運(yùn)行的負(fù)載均衡服務(wù),用來(lái)接收流量并將其分配給后端服務(wù)器。要使用負(fù)載均衡服務(wù),您必須創(chuàng)建一個(gè)負(fù)載均衡實(shí)例,并至少添加一個(gè)監(jiān)聽(tīng)和兩臺(tái)ECS實(shí)例。

監(jiān)聽(tīng) (Listeners)
監(jiān)聽(tīng)用來(lái)檢查客戶(hù)端請(qǐng)求并將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器。監(jiān)聽(tīng)也會(huì)對(duì)后端服務(wù)器進(jìn)行健康檢查。

后端服務(wù)器(Backend Servers)
一組接收前端請(qǐng)求的ECS實(shí)例。您可以單獨(dú)添加ECS實(shí)例到服務(wù)器池,也可以通過(guò)虛擬服務(wù)器組或主備服務(wù)器組來(lái)批量添加和管理。

Nginx-負(fù)載均衡

1、RR(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。
簡(jiǎn)單配置
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 81;
server_name localhost;
client_max_body_size 1024M;

location / {proxy_pass http://test;proxy_set_header Host $host:$server_port;}

}

這里配置了2臺(tái)服務(wù)器,當(dāng)然實(shí)際上是一臺(tái),只是端口不一樣而已,而8081的服務(wù)器是不存在的,也就是說(shuō)訪(fǎng)問(wèn)不到,但是我們?cè)L問(wèn) http://localhost 的時(shí)候,也不會(huì)有問(wèn)題,會(huì)默認(rèn)跳轉(zhuǎn)到http://localhost:8080 具體是因?yàn)镹ginx會(huì)自動(dòng)判斷服務(wù)器的狀態(tài),如果服務(wù)器處于不能訪(fǎng)問(wèn)(服務(wù)器掛了),就不會(huì)跳轉(zhuǎn)到這臺(tái)服務(wù)器,所以也避免了一臺(tái)服務(wù)器掛了影響使用的情況,由于 Nginx 默認(rèn)是RR策略,所以我們不需要其他更多的設(shè)置。

2、權(quán)重
指定輪詢(xún)幾率,weight和訪(fǎng)問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況。 例如
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
那么10次一般只會(huì)有1次會(huì)訪(fǎng)問(wèn)到8081,而有9次會(huì)訪(fǎng)問(wèn)到8080。

3、ip_hash
上面的2種方式都有一個(gè)問(wèn)題,那就是下一個(gè)請(qǐng)求來(lái)的時(shí)候請(qǐng)求可能分發(fā)到另外一個(gè)服務(wù)器,當(dāng)我們的程序不是無(wú)狀態(tài)的時(shí)候(采用了session保存數(shù)據(jù)),這時(shí)候就有一個(gè)很大的很問(wèn)題了,比如把登錄信息保存到了session中,那么跳轉(zhuǎn)到另外一臺(tái)服務(wù)器的時(shí)候就需要重新登錄了,所以很多時(shí)候我們需要一個(gè)客戶(hù)只訪(fǎng)問(wèn)一個(gè)服務(wù)器,那么就需要用iphash了,iphash的每個(gè)請(qǐng)求按訪(fǎng)問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪(fǎng)客固定訪(fǎng)問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}

4、fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}

5、url_hash(第三方)
按訪(fǎng)問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。 在upstream中加入hash語(yǔ)句,server語(yǔ)句中不能寫(xiě)入weight等其他的參數(shù),hash_method是使用的hash算法。
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}

以上5種負(fù)載均衡各自適用不同情況下使用,所以可以根據(jù)實(shí)際情況選擇使用哪種策略模式,不過(guò)fair和url_hash需要安裝第三方模塊才能使用,由于本文主要介紹Nginx能做的事情,所以Nginx安裝第三方模塊不會(huì)再本文介紹。

Nginx-location和rewrite

location正則寫(xiě)法
例子 展開(kāi)源碼
已=開(kāi)頭表示精確匹配
如 A 中只匹配根目錄結(jié)尾的請(qǐng)求,后面不能帶任何字符串。
^~ 開(kāi)頭表示uri以某個(gè)常規(guī)字符串開(kāi)頭,不是正則匹配
~ 開(kāi)頭表示區(qū)分大小寫(xiě)的正則匹配;
~* 開(kāi)頭表示不區(qū)分大小寫(xiě)的正則匹配
/ 通用匹配, 如果沒(méi)有其它匹配,任何請(qǐng)求都會(huì)匹配到
順序 no優(yōu)先級(jí):
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (/)

上面的匹配結(jié)果
按照上面的location寫(xiě)法,以下的匹配示例成立:

/ -> config A
精確完全匹配,即使/index.html也匹配不了
/downloads/download.html -> config B
匹配B以后,往下沒(méi)有任何匹配,采用B
/images/1.gif -> configuration D
匹配到F,往下匹配到D,停止往下
/images/abc/def -> config D
最長(zhǎng)匹配到G,往下匹配D,停止往下
你可以看到 任何以/images/開(kāi)頭的都會(huì)匹配到D并停止,FG寫(xiě)在這里是沒(méi)有任何意義的,H是永遠(yuǎn)輪不到的,這里只是為了說(shuō)明匹配順序
/documents/document.html -> config C
匹配到C,往下沒(méi)有任何匹配,采用C
/documents/1.jpg -> configuration E
匹配到C,往下正則匹配到E
/documents/Abc.jpg -> config CC
最長(zhǎng)匹配到C,往下正則順序匹配到CC,不會(huì)往下到E

實(shí)際使用建議
常見(jiàn)配置使用 展開(kāi)源碼
Rewrite規(guī)則
rewrite功能就是,使用nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達(dá)式和標(biāo)志位實(shí)現(xiàn)url重寫(xiě)以及重定向。rewrite只能放在server{},location{},if{}中,并且只能對(duì)域名后邊的除去傳遞的參數(shù)外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只對(duì)/a/we/index.php重寫(xiě)。語(yǔ)法rewrite regex replacement [flag];

如果相對(duì)域名或參數(shù)字符串起作用,可以使用全局變量匹配,也可以使用proxy_pass反向代理。

表明看rewrite和location功能有點(diǎn)像,都能實(shí)現(xiàn)跳轉(zhuǎn),主要區(qū)別在于rewrite是在同一域名內(nèi)更改獲取資源的路徑,而location是對(duì)一類(lèi)路徑做控制訪(fǎng)問(wèn)或反向代理,可以proxy_pass到其他機(jī)器。很多情況下rewrite也會(huì)寫(xiě)在location里,它們的執(zhí)行順序是:

執(zhí)行server塊的rewrite指令
執(zhí)行l(wèi)ocation匹配
執(zhí)行選定的location中的rewrite指令
如果其中某步URI被重寫(xiě),則重新循環(huán)執(zhí)行1-3,直到找到真實(shí)存在的文件;循環(huán)超過(guò)10次,則返回500 Internal Server Error錯(cuò)誤。

flag標(biāo)志位
last : 相當(dāng)于Apache的[L]標(biāo)記,表示完成rewrite
break : 停止執(zhí)行當(dāng)前虛擬主機(jī)的后續(xù)rewrite指令集
redirect : 返回302臨時(shí)重定向,地址欄會(huì)顯示跳轉(zhuǎn)后的地址
permanent : 返回301永久重定向,地址欄會(huì)顯示跳轉(zhuǎn)后的地址
因?yàn)?01和302不能簡(jiǎn)單的只返回狀態(tài)碼,還必須有重定向的URL,這就是return指令無(wú)法返回301,302的原因了。這里 last 和 break 區(qū)別有點(diǎn)難以理解:

last一般寫(xiě)在server和if中,而break一般使用在location中
last不終止重寫(xiě)后的url匹配,即新的url會(huì)再?gòu)膕erver走一遍匹配流程,而break終止重寫(xiě)后的匹配
break和last都能組織繼續(xù)執(zhí)行后面的rewrite指令
if指令與全局變量
if判斷指令
語(yǔ)法為if(condition){…},對(duì)給定的條件condition進(jìn)行判斷。如果為真,大括號(hào)內(nèi)的rewrite指令將被執(zhí)行,if條件(conditon)可以是如下任何內(nèi)容:

當(dāng)表達(dá)式只是一個(gè)變量時(shí),如果值為空或任何以0開(kāi)頭的字符串都會(huì)當(dāng)做false
直接比較變量和內(nèi)容時(shí),使用=或!=
正則表達(dá)式匹配,*不區(qū)分大小寫(xiě)的匹配,!~區(qū)分大小寫(xiě)的不匹配
-f和!-f用來(lái)判斷是否存在文件
-d和!-d用來(lái)判斷是否存在目錄
-e和!-e用來(lái)判斷是否存在文件或目錄
-x和!-x用來(lái)判斷文件是否可執(zhí)行

例子:

例子 展開(kāi)源碼

全局變量
下面是可以用作if判斷的全局變量
KaTeX parse error: Expected 'EOF', got '#' at position 8: args : #?這個(gè)變量等于請(qǐng)求行中的參數(shù),同query_string
$content_length : 請(qǐng)求頭中的Content-length字段。
$content_type : 請(qǐng)求頭中的Content-Type字段。
$document_root : 當(dāng)前請(qǐng)求在root指令中指定的值。
$host : 請(qǐng)求主機(jī)頭字段,否則為服務(wù)器名稱(chēng)。
$http_user_agent : 客戶(hù)端agent信息
$http_cookie : 客戶(hù)端cookie信息
$limit_rate : 這個(gè)變量可以限制連接速率。
$request_method : 客戶(hù)端請(qǐng)求的動(dòng)作,通常為GET或POST。
$remote_addr : 客戶(hù)端的IP地址。
$remote_port : 客戶(hù)端的端口。
$remote_user : 已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶(hù)名。
$request_filename : 當(dāng)前請(qǐng)求的文件路徑,由root或alias指令與URI請(qǐng)求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 請(qǐng)求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值。
$server_name : 服務(wù)器名稱(chēng)。
$server_port : 請(qǐng)求到達(dá)服務(wù)器的端口號(hào)。
$request_uri : 包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,如:”/foo/bar.php?arg=baz”。
uri:不帶請(qǐng)求參數(shù)的當(dāng)前URI,uri : 不帶請(qǐng)求參數(shù)的當(dāng)前URI,uri請(qǐng)數(shù)當(dāng)URIuri不包含主機(jī)名,如”/foo/bar.html”。
documenturi:與document_uri : 與documentu?riuri相同。

常用正則
. : 匹配除換行符以外的任意字符
? : 重復(fù)0次或1次

  • : 重復(fù)1次或更多次
  • : 重復(fù)0次或更多次
    \d :匹配數(shù)字
    ^ : 匹配字符串的開(kāi)始
    $ : 匹配字符串的介紹
    {n} : 重復(fù)n次
    {n,} : 重復(fù)n次或更多次
    [c] : 匹配單個(gè)字符c
    [a-z] : 匹配a-z小寫(xiě)字母的任意一個(gè)
    小括號(hào)()之間匹配的內(nèi)容,可以在后面通過(guò)$1來(lái)引用,$2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。

rewrite實(shí)例
rewrite實(shí)例 展開(kāi)源碼

對(duì)形如/images/ef/uh7b3/test.png的請(qǐng)求,重寫(xiě)到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在則正常響應(yīng),如果不存在則重寫(xiě)tryfiles到新的image404 location,直接返回404狀態(tài)碼。

例2: rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

對(duì)形如/images/bla_500x400.jpg的文件請(qǐng)求,重寫(xiě)到/resizer/bla.jpg?width=500&height=400地址,并會(huì)繼續(xù)嘗試匹配location。

具體使用

server{listen 10088; ##域名通過(guò)slb解析到此服務(wù)器的10088端口server_name localhost;location /{add_header Access-Control-Allow-Origin *; ##通過(guò)nginx配置,解決跨域問(wèn)題root /usr/local/web/web-kf-10088/;index index.html index.htm;try_files $uri $uri/ /index.html last;}location ^~/kfApi/{ ##通過(guò)攔截改域名下kfApi的url,通過(guò)代理訪(fǎng)問(wèn)到后端的java服務(wù)#rewrite ^.+a/?(.*)$ /$1 break;include uwsgi_params;proxy_pass http://172.17.126.139:9088/;}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

總結(jié)

以上是生活随笔為你收集整理的SLB和nginx的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。