www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]?注:文末有送書福利?。?! Nginx不僅可以做Web服務(wù)器、做反向代理、負(fù)載均衡,還可以做限流系統(tǒng)。此處我們就Nginx為例,介紹一下如何配置一個(gè)限流系統(tǒng)。 Nginx使用的限流算法是漏桶算法。 (1)是安裝Nginx。Nginx的安裝我們?cè)?.5.7中已經(jīng)詳細(xì)敘述過,此處簡(jiǎn)

 注:文末有送書福利?。?!

Nginx不僅可以做Web服務(wù)器、做反向代理、負(fù)載均衡,還可以做限流系統(tǒng)。此處我們就Nginx為例,介紹一下如何配置一個(gè)限流系統(tǒng)。
Nginx使用的限流算法是漏桶算法。
1)是安裝Nginx。Nginx的安裝我們?cè)?/span>8.5.7中已經(jīng)詳細(xì)敘述過,此處簡(jiǎn)單再提一下:
如果你的LinuxUbuntuDebian,使用apt-get安裝,在命令行中輸入以下命令:
$ sudo apt-get update$ sudo apt-get install nginx
如果是CentOS,使用yum安裝,在命令行中輸入以下命令:
$ sudo yum install epel-release$ sudo yum update$ sudo yum install nginx
2)找到Nginx所使用的配置文件所在的位置。在UbuntuDebian是在如下位置:
$ cd /etc/nginx/sites-available/
CentOS則是在如下位置:
$ cd /etc/nginx/conf.d/
3)在http塊中,配置基礎(chǔ)的限流配置:
01 http {02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;03 04 server {05 location /test/ {06 limit_reqzone=mylimit;07 08 proxy_passhttp://backend;09 }10 }11 }
其中48行定義的是一個(gè)服務(wù)器接口。而第2行和第6行配合完成了一個(gè)限流設(shè)置,下面解釋一下這兩行做的事情:
 limit_req_zone命令在Nginx的配置文件中專門用于定義限流,它必須被放在http塊中,否則無法生效,因?yàn)樵撁钪辉?/span>http中被定義。
該字段包含三個(gè)參數(shù)
第一個(gè)參數(shù),就是鍵(key),即值$binary_remote_addr所在的位置,它代表的是我們的限流系統(tǒng)限制請(qǐng)求所用的鍵。
此處,我們使用了$binary_remote_addr,它是Nginx內(nèi)置的一個(gè)值,代表的是客戶端的IP地址的二進(jìn)制表示。因此換言之,我們的示例配置,是希望限流系統(tǒng)以客戶端的IP地址為鍵進(jìn)行限流。
對(duì)Nginx有經(jīng)驗(yàn)的讀者可能還知道有一個(gè)Nginx內(nèi)置值為$remote_addr,它同樣表示客戶端的IP地址,因此我們也可以使用這個(gè)值。$binary_remote_addrNginx的社區(qū)推薦用值,因?yàn)樗嵌M(jìn)制表達(dá),占用的空間一般比字符串表達(dá)的$remote_addr要短一些,在寸土寸金的限流系統(tǒng)中尤為重要。
第二個(gè)參數(shù)是限流配置的共享內(nèi)存占用(zone)。為了性能優(yōu)勢(shì),Nginx將限流配置放在共享內(nèi)存中,供所有Nginx的進(jìn)程使用,因?yàn)樗加玫氖莾?nèi)存,所以我們希望開發(fā)者能夠指定一個(gè)合理的、既不浪費(fèi)又能存儲(chǔ)足夠信息的空間大小。根據(jù)實(shí)踐經(jīng)驗(yàn),1MB的空間可以儲(chǔ)存16000個(gè)IP地址。
該參數(shù)的語法是用冒號(hào)隔開的兩個(gè)部分,第一部分是給該部分申請(qǐng)的內(nèi)存一個(gè)名字,第二部分是我們希望申請(qǐng)的內(nèi)存大小。
因此,在該聲明中,我們聲明了一個(gè)名叫mylimit(我的限制)的內(nèi)存空間,然后它的大小是10M,即可以存儲(chǔ)160000個(gè)IP地址,對(duì)于實(shí)驗(yàn)來說足夠了。
第三個(gè)配置就是訪問速率(rate)了,格式是用左斜杠隔開的請(qǐng)求數(shù)和時(shí)間單位。這里的訪問速率就是最大速率,因此10r/s就是每秒10個(gè)請(qǐng)求。通過這臺(tái)Nginx服務(wù)器訪問后端服務(wù)器的請(qǐng)求速率無法超過每秒10個(gè)請(qǐng)求。
注意到第5行聲明了一個(gè)資源位置/test/,因此我們第6行的配置就是針對(duì)這個(gè)資源的,通俗地說,我們?cè)诘?/span>6行的配置是針對(duì)特定API的,這個(gè)API就是路徑為/test/API,而其真正路徑就是第8行聲明的 http://backend 。注意,這個(gè)URL是不存在的,實(shí)際操作中,讀者需要將它換成你已經(jīng)開發(fā)好的業(yè)務(wù)邏輯所在的位置,Nginx在這里的作用只是一個(gè)反向代理,它自己本身沒有資源。
6行中,我們使用limit_req命令,聲明該API需要一個(gè)限流配置,而該限流配置所在位置(zone)就是mylimit。
這樣一來,所有發(fā)往該API的請(qǐng)求會(huì)先讀到第6行的限流配置,然后根據(jù)該限流配置mylimit的名稱找到聲明在第2行的參數(shù),然后決定該請(qǐng)求是否應(yīng)該被拒絕。
但是這樣還不夠。不要忘了,Nginx使用的漏桶算法,不是時(shí)間窗口算法,我們前文介紹中說過,漏桶算法是有兩個(gè)參數(shù)可以配置的!
4)配置峰值。Nginx漏桶算法的峰值屬性在API中設(shè)置。參數(shù)名為burst。如下:
01 http {02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;0304 server {05 location /test/ {06 limit_reqzone=mylimit burst=20;0708 proxy_passhttp://backend;09 }10 }11 }
在第6行中,我們只需要在聲明limit_req的同時(shí),指定burst就可以了,此處我們指定burst20,即漏桶算法中我們的“桶”最多可以接受20個(gè)請(qǐng)求。
這樣一個(gè)Nginx的限流系統(tǒng)就配置完畢了,但實(shí)際操作中,我們還可能需要很多別的功能,下面筆者就介紹幾個(gè)很有用的配置技巧。

實(shí)戰(zhàn):使用Nginx限流

1.加快Nginx轉(zhuǎn)發(fā)速度


相對(duì)于傳統(tǒng)的漏桶算法慢吞吞地轉(zhuǎn)發(fā)請(qǐng)求的缺陷,Nginx實(shí)現(xiàn)了一種漏桶算法的優(yōu)化版,允許開發(fā)者指定快速轉(zhuǎn)發(fā),而且還不影響正常的限流功能。開發(fā)者只需要在指定limit_req的一行中指定burst之后指定另一個(gè)參數(shù)nodelay,就可以在請(qǐng)求總數(shù)沒有超過burst指定值的情況下,迅速轉(zhuǎn)發(fā)所有請(qǐng)求了。如下所示:
01 http {02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;0304 server {05 location /test/ {06 limit_reqzone=mylimit burst=20 nodelay;0708 proxy_passhttp://backend;09 }10 }11 }
讀者可能會(huì)擔(dān)憂:這種情況下,會(huì)不會(huì)出現(xiàn)所有請(qǐng)求都被快速轉(zhuǎn)發(fā),然后接下來又有沒有超過burst數(shù)量的請(qǐng)求出現(xiàn),再次被快速轉(zhuǎn)發(fā),就好像固定窗口算法的漏洞一樣,從而超過我們本來希望它能限制到的上限數(shù)量呢?答案是不會(huì)。Nginx的快速轉(zhuǎn)發(fā)是這樣實(shí)現(xiàn)的:
·       當(dāng)有沒有超過burst上限的請(qǐng)求數(shù)量進(jìn)入系統(tǒng)時(shí),快速轉(zhuǎn)發(fā),然后將當(dāng)前桶中可以填充的數(shù)量標(biāo)為0
·       按照我們?cè)O(shè)置的rate1秒中內(nèi)緩慢增加桶中余額,以我們的配置為例,每隔100毫秒,增加1個(gè)空位;
·       在增加空位的過程中,進(jìn)來超過空位數(shù)量的請(qǐng)求,直接拒絕。
舉例而言,配置如上所示,假如在某個(gè)瞬時(shí)有25個(gè)請(qǐng)求進(jìn)入系統(tǒng),Nginx會(huì)先轉(zhuǎn)發(fā)20個(gè)(或21個(gè),取決于瞬時(shí)情況),然后拒絕剩下的4個(gè)請(qǐng)求,并將當(dāng)前桶中數(shù)量標(biāo)為0,然后接下來的每100毫秒,緩慢恢復(fù)1個(gè)空位。
這樣我們可以看到,Nginx既做到了快速轉(zhuǎn)發(fā)消息,又不會(huì)讓后端服務(wù)器承擔(dān)過多的流量。

實(shí)戰(zhàn):使用Nginx限流

2.為限流系統(tǒng)配置日志級(jí)別


限流系統(tǒng)會(huì)提前拒絕請(qǐng)求,因此,我們?cè)跇I(yè)務(wù)服務(wù)器上是肯定看不到這些請(qǐng)求的。假如我們收到一個(gè)報(bào)告說某用戶在使用網(wǎng)站的時(shí)候出現(xiàn)錯(cuò)誤,但是我們?cè)跇I(yè)務(wù)服務(wù)器上又找不到相關(guān)的日志,我們?nèi)绾未_定是不是限流造成的呢?
只有限流系統(tǒng)的日志才能說明問題。因此,我們需要Nginx打印出它拒絕掉的請(qǐng)求的信息。但同時(shí),Nginx打印的限流日志默認(rèn)是錯(cuò)誤(error),如果我們?cè)O(shè)置了一個(gè)基于日志錯(cuò)誤掃描的警報(bào),它掃到的限流錯(cuò)誤,真的是我們希望給自己發(fā)警報(bào)的情況嗎?
配置請(qǐng)求的位置就在資源中,使用的命令是limit_req_log_level,如下:
01 http {02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;0304 server {05 location /test/ {06 limit_reqzone=mylimit burst=20;07 limit_req_log_level warn;0809 proxy_passhttp://backend;10 }11 }12 }
在第7行中,我們將Nginx的日志改為了警告(warn)。

實(shí)戰(zhàn):使用Nginx限流

3.更換Nginx的限流響應(yīng)狀態(tài)碼


前文我們就說過,從語義上來說,限流的HTTP標(biāo)準(zhǔn)響應(yīng)狀態(tài)碼是429,但是如果讀者拿上述的配置文件直接去測(cè)試,會(huì)發(fā)現(xiàn)Nginx返回的是503(服務(wù)不可用)。到底應(yīng)該返回什么狀態(tài)碼,是一個(gè)偏程序哲學(xué)的問題,此處我們不討論,我們只討論:如何讓Nginx返回我們指定的狀態(tài)碼?
答案也是在同一個(gè)資源中,它的配置命令是limit_req_status,然后我們指定它為429即可:
01 http {02 limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;0304 server {05 location /test/ {06 limit_reqzone=mylimit burst=20;07 limit_req_log_level warn;08 limit_req_status 429;0910 proxy_passhttp://backend;11 }12 }13 }
除了以上功能以外,Nginx還支持很多復(fù)雜先進(jìn)的限流功能,感興趣的讀者可以訪問 https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/ 作進(jìn)一步的了解。
本文節(jié)選自電子工業(yè)出版社出版的《深入淺出大型網(wǎng)站架構(gòu)設(shè)計(jì)》,經(jīng)出版社授權(quán)發(fā)布。需要進(jìn)一步學(xué)習(xí)相關(guān)內(nèi)容的讀者,可以點(diǎn)擊購買下面這本書閱讀。


贈(zèng)書福利



實(shí)戰(zhàn):使用Nginx限流



本書從架構(gòu)設(shè)計(jì)的角度出發(fā),涵蓋了以高性能、高可用、高并發(fā)等多個(gè)業(yè)內(nèi)標(biāo)準(zhǔn)為目標(biāo)的網(wǎng)站設(shè)計(jì)和建設(shè)手段,并在每個(gè)方面追本溯源,從理論方法到生產(chǎn)實(shí)踐,在力求簡(jiǎn)明易懂、適用于盡可能多的場(chǎng)合的前提下深入到實(shí)踐中,為讀者提供實(shí)用操作指南。
如何免費(fèi)獲得該書呢?

掃碼回復(fù) 程序員 , 實(shí)戰(zhàn):使用Nginx限流
第1,50,100,150,200名獲得該獎(jiǎng)勵(lì)

實(shí)戰(zhàn):使用Nginx限流

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉