詳解nginx的請求限制(連線限制和請求限制)

03ngnntds發表於2019-03-04

這篇文章主要介紹了詳解nginx的請求限制(連線限制和請求限制),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
一,背景

我們經常會遇到這種情況,伺服器流量異常,負載過大等等。對於大流量惡意的攻擊訪問,會帶來頻寬的浪費,伺服器壓力,影響業務,往往考慮對同一個ip的連線數,併發數進行限制。http_limit_conn_module 模組來實現。該模組可以根據定義的鍵來限制每個鍵值的連線數,如同一個IP來源的連線數。並不是所有的連線都會被該模組計數,只有那些正在被處理的請求(這些請求的頭資訊已被完全讀入)所在的連線才會被計數。http_limit_req_module 模組來實現,該模組可以透過定義的 鍵值來限制請求處理的頻率。特別的,可以限制來自單個IP地址的請求處理頻率。 限制的方法如同漏斗,每秒固定處理請求數,推遲過多請求。1

二,配置語法

1,http_limit_conn_module指令解釋

limit_conn_zone
語法: limit_conn_zone $variable zone=name:size;
預設值: none
配置段: http

該指令描述會話狀態儲存區域。鍵的狀態中儲存了當前連線數,鍵的值可以是特定變數的任何非空值(空值將不會被考慮)。$variable定義鍵,zone=name定義區域名稱,後面的limit_conn指令會用到的。size定義各個鍵共享記憶體空間大小。如:

limit_conn_zone  b i n a r y r e m o t e a d d r z o n e = a d d r : 10 m ; I P 使 binary_remote_addr zone=addr:10m;註釋:客戶端的IP地址作為鍵。注意,這裡使用的是 b i n a r y r e m o t e a d d r z o n e = a d d r : 1 m ; I P 使 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_zone 指令和limit_conn_zone指令同等意思,已經被棄用,就不再做說明了。

limit_conn_log_level
語法:limit_conn_log_level info | notice | warn | error
預設值:error

配置段:http, server, location

當達到最大限制連線數後,記錄日誌的等級。
limit_conn
語法:limit_conn zone_name number
預設值:none
配置段:http, server, location

指定每個給定鍵值的最大同時連線數,當超過這個數字時被返回503 (Service Temporarily Unavailable)錯誤。如:

limit_conn_zone $binary_remote_addrzone=addr:10m;server{ location /{ limit_conn addr 1; }}
同一IP同一時間只允許有一個連線。

當多個 limit_conn 指令被配置時,所有的連線數限制都會生效。比如,下面配置不僅會限制單一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;}

[warning]limit_conn指令可以從上級繼承下來。[/warning]

limit_conn_status


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69911024/viewspace-2637505/,如需轉載,請註明出處,否則將追究法律責任。

相關文章