nginx限制請求之一:(ngx_http_limit_conn_module)模塊

相關文章:php

高可用服務設計之二:Rate limiting 限流與降級html

nginx限制請求之一:(ngx_http_limit_conn_module)模塊前端

nginx限制請求之二:(ngx_http_limit_req_module)模塊nginx

nginx限制請求之三:Nginx+Lua+Redis 對請求進行限制算法

nginx限制請求之四:目錄進行IP限制後端

 

對應nginx接入層限流可使用Nginx自帶的兩個模塊:服務器

  • 鏈接數限流模塊ngx_http_limit_conn_module:
  • 漏桶算法實現的請求限流模塊ngx_http_limit_req_module

 

ngx_http_limit_conn_module 對於一些服務器流量異常、負載過大,甚至是大流量的惡意攻擊訪問等,進行併發數的限制;該模塊能夠根據定義的鍵來限制每一個鍵值的鏈接數,只有那些正在被處理的請求(這些請求的頭信息已被徹底讀入)所在的鏈接纔會被計數。網絡

該模塊提供了兩個配置參數,limit_conn_zone 和 limit_conn ,併發

其中 limit_conn_zone 只能配置在 http{} 段,而 limit_conn 則能夠配置於http{},server{},location{} 區段中。post


三方模塊編譯安裝參數:

這裏寫圖片描述


、 limit_conn_zone

語法:limit_conn_zone $variable zone=name:size; 
配置段:http

參數說明:

  • $variable:定義鍵,要限流的維度;
  • zone=name: 定義區域名稱(名稱隨意起名),主要做用與後面的 limit_conn中對應就好。
  • size: 定義各個鍵共享內存空間大小。

該指令描述會話狀態存儲區域。鍵的狀態中保存了當前鏈接數,鍵的值能夠是特定變量的任何非空值(空值不會被考慮)。

如:

#限制鏈接數
limit_conn_zone $binary_remote_addr zone=showjoy_conn:20m;

 

註釋:

客戶端的IP地址做爲鍵。注意,這裏使用的是 binary_remote_addr 變量,而不是 remote_addr 變量。 
remote_addr變量的長度爲7字節到15字節,而存儲狀態在32位平臺中佔用32字節或64字節,在64位平臺中佔用64字節。 
binary_remote_addr變量的長度是固定的4字節,存儲狀態在32位平臺中佔用32字節或64字節,在64位平臺中佔用64字節。 
1M共享空間能夠保存3.2萬個32位的狀態,1.6萬個64位的狀態。 
若是共享內存空間被耗盡,服務器將會對後續全部的請求返回 503 (Service Temporarily Unavailable) 錯誤。


、limit_conn

語法:limit_conn zone_name number 
配置段:http,server,location

參數說明:

  • zone_name是上面limit_conn_zone中的zone定義的;
  • number:是併發鏈接數量;

該指令指定每一個給定鍵值的最大同時鏈接數,當超過這個數字時返回503(Service )錯誤。limit_conn是對某個key對應的總的網絡鏈接數進行限流。能夠按照IP來限制IP維度的總鏈接數,或者按照服務域名來限制某個域名的總的鏈接數。(只有那些被nginx處理的且已經讀取了整個請求頭的請求鏈接纔會被計數器統計)。

如(同一IP同一時間只容許有20個鏈接):

這裏寫圖片描述


、配置使用示例

limit_conn_zone $binary_remote_addr zone=showjoy_conn:20m; 
主要用來定義變量、zone名稱、共享內存大小

limit_conn showjoy_conn 20; 
將前面定義的showjoy_conn進行配置,而且限制同一IP併發鏈接數爲20

這裏寫圖片描述

配置方法以下:

一、在nginx.conf裏的http{}里加上以下代碼:

  1. #ip limit
  2. limit_conn_zone $binary_remote_addr zone=perip:10m;
  3. limit_conn_zone $server_name zone=perserver:10m;

二、在須要限制併發數下載帶寬的網站配置server{}里加上以下代碼:

  1. limit_conn perip 2;
  2. limit_conn perserver 20;
  3. limit_rate 100k;

補充說明下參數:

    • $binary_remote_addr是限制同一客戶端ip地址;
    • $server_name是限制同一server最大併發數;
    • limit_conn爲限制併發鏈接數;
    • limit_rate爲限制下載速度;

注意:
nginx 1.1.8 以後的版本的語法改成limit_conn_zone $binary_remote_addr zone=NAME:10m;
NAME 就是 zone 的名字詳情請看這裏 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
限制鏈接數:
要限制鏈接,必須先有一個容器對鏈接進行計數,在http段加入以下代碼:
"zone=" 給它一個名字,能夠隨便叫,這個名字要跟下面的 limit_conn 一致
$binary_remote_addr = 用二進制來儲存客戶端的地址,1m 能夠儲存 32000 個併發會話
... 省掉 N 字
http
{
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    接下來須要對server不一樣的位置(location段)進行限速,好比限制每一個IP併發鏈接數爲1,則
server
{
    listen 80;
    server_name 192.168.11.128;
    index index.html index.htm index.php;
    limit_conn addr 1; #是限制每一個IP只能發起1個鏈接 (addr 要跟 limit_conn_zone 的變量對應)
    limit_rate 100k; #限速爲 100KB/秒
    root html;
注意事項:
limit_rate 100k; //是對每一個鏈接限速100k。這裏是對鏈接限速,而不是對IP限速!若是一個IP容許兩個併發鏈接,那麼這個IP就是限速limit_rate *

 

 

 


、使用注意事項

事務都具備兩面性的。ngx_http_limit_conn_module 模塊雖然說能夠解決當前面臨的併發問題,可是會引入另一些問題的。如前端若是有作LVS或反代,而咱們後端啓用了該模塊功能,那不是很是多503錯誤了?這樣的話,能夠在前端啓用該模塊,要麼就是設置白名單。

模塊地址:https://yunpan.cn/cqSKP6BrJ2AeT 訪問密碼 4f50

相關文章
相關標籤/搜索