Nginx限流配置總結

0.三種實現方式

  • limit_conn_zone
  • limit_req_zone
  • ngx_http_upstream_module
    前兩種只能對客戶端(即單一ip限流)

1.limit_conn_zone

這個模塊用來限制單個IP的連接數,並非所有的連接都被計數,只有在服務器處理了請求並已經讀取了完整的請求頭時,才被計數。
參數配置:

Syntax: limit_conn_zone key zone=name:size; 
Default: — 
Context: http
Syntax: limit_conn zone number; 
Default: — 
Context: http, server, location

示例:
只允許每個IP保持一個連接

limit_conn_zone $binary_remote_addr zone=addr:10m; 
server {
    location /download/ { 
        limit_conn addr 1; 
    }

可以配置多個limit_coon指令,例如配置客戶端每個IP連接數,同時限制服務端最大保持連接數

limit_conn_zone $binary_remote_addr zone=perip:10m; 
limit_conn_zone $server_name zone=perserver:10m; 
server {
    ... 
    limit_conn perip 10; 
    limit_conn perserver 100; 
    ...
}

在這裏,客戶端IP地址作爲鍵,不是$remote_addr,而是使用
$binary_remote_addr變量。
$remote_addr 變量的大小可以從7到15個字節不等。存儲的狀態在32位平臺上佔用32或64字節的內存,在64位平臺上總是佔用64字節。對於IPv4地址,$binary_remote_addr變量的大小始終爲4個字節,對於IPv6地址則爲16個字節。存儲狀態在32位平臺上始終佔用32或64個字節,在64位平臺上佔用64個字節。一個兆字節的區域可以保持大約32000個32字節的狀態或大約16000個64字節的狀態。如果區域存儲耗盡,服務器會將錯誤返回給所有其他請求。

其他參數

  • limit_conn_log_level 當超出連接數時,設置日誌記錄級別
Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
  • limit_conn_status 設置拒絕請求時返回碼
Syntax: limit_conn_status code; 
Default: limit_conn_status 503; 
Context: http, server, location

2.limit_req_zone

參數配置

Syntax: limit_req_zone key zone=name:size rate=req/time; 
Default: — 
Context: http
# 語法
Syntax: limit_req zone=name [burst=number] [nodelay];
# 默認值(無)
Default: -
# 作用域
Context: http, server, location

示例

http{

 # 聲明請求限流存儲區
 limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s
 server{
  ...
  limit_req zone=req_one burst=5 nodelay;
  ...
 }
}

配置說明:

limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s

  • 第一個參數:$binary_remote_addr 表示通過remote_addr這個標識來做限制,“binary_”目的是縮寫內存佔用量,是限制同一客戶端ip地址。
  • 第二個參數:zone=one:10m 表示生成一個大小爲10M,名字爲one的內存區域,用來存儲訪問的頻次信息。
  • 第三個參數:rate=1r/s表示允許相同標識的客戶端的訪問頻次,這裏限制的是每秒1次,還可以有比如30r/m的。

limit_req zone=one burst=5 nodelay;

  • 第一個參數:zone=one 設置使用哪個配置區域來做限制,與上面limit_req_zone 裏的name對應。
  • 第二個參數:burst=5,重點說明一下這個配置,burst爆發的意思,這個配置的意思是設置一個大小爲5的緩衝區當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩衝區內,緩衝區容量爲5。
  • 第三個參數:nodelay 該參數允許請求在排隊的時候就立即被處理,也就是說只要請求能夠進入burst隊列,就會立即被後臺worker處理,請注意,這意味着burst設置了nodelay時,系統瞬間的QPS可能會超過rate設置的閾值。nodelay參數要跟burst一起使用纔有作用。否則所有請求會等待排隊按漏桶固定速度處理。

其他參數:

  • limit_req_log_level 當服務器由於限速或緩存,設置寫入日誌的級別。
Syntax: limit_req_log_level info | notice | warn | error;
Default: limit_req_log_level error; 
Context: http, server, location
  • limit_req_status 設置拒絕請求的返回值,只能設置400-599之間
Syntax: limit_req_status code; 
Default: limit_req_status 503;
Context: http, server, location

3.ngx_http_upstream_module(推薦)

該模塊是提供了我們需要的後端限流功能的
• 該模塊有一個參數:max_conns可以對服務端進行限流,1.11.5版本之前商業版nginx中才能使用
• 在nginx1.11.5版本以後,官方已經將該參數從商業版中脫離出來了,也就是說只要我們將生產
上廣泛使用的nginx1.9.12版本和1.10版本升級即可使用

upstream backend{ 
    server 127.0.0.1:8081 max_conns=10; 
    server 127.0.0.1:8082 max_conns=10; 
} 
發佈了21 篇原創文章 · 獲贊 22 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章