OpenResty(nginx)限流配置实现
一般情況下,首頁的并發(fā)量是比較大的,即使有了多級緩存,如果有大量惡意的請求,也會對系統(tǒng)造成影響。而限流就是保護措施之一。
nginx提供兩種限流的方式:
-
一是控制速率
-
二是控制并發(fā)連接數(shù)
控制速率
控制速率的方式之一就是采用漏桶算法。
漏桶算法實現(xiàn)控制速率限流
漏桶(Leaky Bucket)算法思路很簡單,水(請求)先進入到漏桶里,漏桶以一定的速度出水(接口有響應速率),當水流入速度過大會直接溢出(訪問頻率超過接口響應速率),然后就拒絕請求,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率.示意圖如下:
漏桶算法實現(xiàn) nginx的配置
# 設置限流配置limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;server { listen 8081;server_name localhost;charset utf-8;location / {limit_req zone=myRateLimit;root html;index index.html index.htm;}}解釋:
?binary_remote_addr 是一種key,表示基于 remote_addr(客戶端IP) 來做限流,binary_ 的目的是壓縮內存占用量。
zone:定義共享內存區(qū)來存儲訪問信息, myRateLimit:10m 表示一個大小為10M,名字為myRateLimit的內存區(qū)域。1M能存儲16000 IP地址的訪問信息,10M可以存儲16W IP地址訪問信息。
rate 用于設置最大訪問速率,rate=10r/s 表示每秒最多處理10個請求。Nginx 實際上以毫秒為粒度來跟蹤請求信息,因此 10r/s 實際上是限制:每100毫秒處理一個請求。這意味著,自上一個請求處理完后,若后續(xù)100毫秒內又有請求到達,將拒絕處理該請求.我們這里設置成2 方便測試。
?
處理突發(fā)流量
# 設置限流配置limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;server {location / {limit_req zone=myRateLimit burst=20;root html;index index.html index.htm;} }?
上面例子限制 10r/s,如果有時正常流量突然增大,超出的請求將被拒絕,無法處理突發(fā)流量,可以結合 burst 參數(shù)使用來解決該問題。
例如,如下配置表示:
burst 譯為突發(fā)、爆發(fā),表示在超過設定的處理速率后能額外處理的請求數(shù),當 rate=10r/s 時,將1s拆成10份,即每100ms可處理1個請求。
此處,burst=20 ,若同時有21個請求到達,Nginx 會處理第一個請求,剩余20個請求將放入隊列,然后每隔100ms從隊列中獲取一個請求進行處理。若請求數(shù)大于21,將拒絕處理多余的請求,直接返回503.
不過,單獨使用 burst 參數(shù)并不實用。假設 burst=50 ,rate依然為10r/s,排隊中的50個請求雖然每100ms會處理一個,但第50個請求卻需要等待 50 * 100ms即 5s,這么長的處理時間自然難以接受。
因此,burst 往往結合 nodelay 一起使用。
例如:如下配置:
# 設置限流配置limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;server {location / {limit_req zone=myRateLimit burst=5 nodelay;root ? html;index ?index.html index.htm;} }如上表示:
平均每秒允許不超過2個請求,突發(fā)不超過5個請求,并且處理突發(fā)5個請求的時候,沒有延遲,等到完成之后,按照正常的速率處理。
?
如上兩種配置結合就達到了速率穩(wěn)定,但突然流量也能正常處理的效果。配置代碼如下:
# 設置限流配置limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;server { listen 8081;server_name localhost;charset utf-8;location / {limit_req zone=myRateLimit burst = 5 nodelay;root html;index index.html index.htm;}}測試:如下圖 在1秒鐘之內可以刷新5次,正常處理。 但是超過之后,連續(xù)刷新5次,拋出異常。
?
還可以做一些其他的限流
根據(jù)IP進行限流
或者
?
?
總結
以上是生活随笔為你收集整理的OpenResty(nginx)限流配置实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows 显示苹果分区_基准测试数
- 下一篇: python 检测文件更新失败_依赖错误