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

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

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

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

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

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


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

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

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


限流系統(tǒng)會提前拒絕請求,因此,我們在業(yè)務服務器上是肯定看不到這些請求的。假如我們收到一個報告說某用戶在使用網(wǎng)站的時候出現(xiàn)錯誤,但是我們在業(yè)務服務器上又找不到相關(guān)的日志,我們?nèi)绾未_定是不是限流造成的呢?
只有限流系統(tǒng)的日志才能說明問題。因此,我們需要Nginx打印出它拒絕掉的請求的信息。但同時,Nginx打印的限流日志默認是錯誤(error),如果我們設置了一個基于日志錯誤掃描的警報,它掃到的限流錯誤,真的是我們希望給自己發(fā)警報的情況嗎?
配置請求的位置就在資源中,使用的命令是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)。

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

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


前文我們就說過,從語義上來說,限流的HTTP標準響應狀態(tài)碼是429,但是如果讀者拿上述的配置文件直接去測試,會發(fā)現(xiàn)Nginx返回的是503(服務不可用)。到底應該返回什么狀態(tài)碼,是一個偏程序哲學的問題,此處我們不討論,我們只討論:如何讓Nginx返回我們指定的狀態(tài)碼?
答案也是在同一個資源中,它的配置命令是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還支持很多復雜先進的限流功能,感興趣的讀者可以訪問 https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/ 作進一步的了解。
本文節(jié)選自電子工業(yè)出版社出版的《深入淺出大型網(wǎng)站架構(gòu)設計》,經(jīng)出版社授權(quán)發(fā)布。需要進一步學習相關(guān)內(nèi)容的讀者,可以點擊購買下面這本書閱讀。


贈書福利



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



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

掃碼回復 程序員 , 實戰(zhàn):使用Nginx限流
第1,50,100,150,200名獲得該獎勵

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

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

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