高併發系統有三把利器用來保護系統:緩存、降級和限流html
今天咱們這裏說說限流。通常會在應用層配合redis作限流策略,這裏咱們聊聊nginx層限流。node
限流的目的是經過對併發訪問/請求進行限速或者一個時間窗口內的的請求進行限速來保護系統,一旦達到限制速率則能夠拒絕服務,以防止非預期的請求對系統壓力過大而引發的系統癱瘓(友好點好比直接返回相應的json或則頁面提示用戶訪問高峯,稍後再試)nginx
限流通常有三種: 計數器 、漏桶算法、令牌桶算redis
關於限流算法不是本文討論範圍,定義網上有大把介紹算法
1.先說下nginx裏面配置直接返回json如何操做。json
location /json/ { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; return 200 '{"code":"6666,"msg":"訪問高峯期..."}'; }
Nginx限流配置緩存
#限流 limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s; location / { #限流 limit_req zone=myRateLimit burst=2 nodelay; root html; index index.html index.htm; }
名詞解釋:併發
第1個參數:limit_req_zone定義在http塊中,$binary_remote_addr表示保存客戶端IP地址的二進制形式。
第2個參數:Zone定義IP狀態及URL訪問頻率的共享內存區域。zone=keyword標識區域的名字,以及冒號後面跟區域大小。16000個IP地址的狀態信息約1MB,因此示例中區域能夠存儲160000個IP地址。
第3個參數:Rate定義最大請求速率。示例中速率不能超過每秒2個請求。app
超過限流,默認返回503狀態高併發
而後咱們在503錯誤頁面配置返回相應json或者html頁面便可。這裏咱們返回json
error_page 503 /503; location = /503 { default_type application/json; add_header Content-Type 'text/html; charset=utf-8'; return 200 '{"code":"6666,"msg":"訪問高峯期..."}'; }
展現結果以下
正常返回結果
限流後返回結果
至此nginx限流搞定