Nginx 連接限制和訪問控制
前言
Nginx
自帶的模塊支持對並發請求數進行限制, 還有對請求來源進行限制。可以用來防止DDOS
攻擊。
閱讀本文須知道nginx
的配置文件結構和語法。
連接限制 limit_conn_module
limit_conn_module
: TCP
連接頻率限制, 一次TCP
連接可以建立多次HTTP
請求。
配置語法:
limit_conn_module 語法 |
范圍 | 說明 |
---|---|---|
limit_conn_zone 標識 zone=空間名:空間大小; |
http |
用於聲明一個存儲空間 |
limit_conn 空間名 並發限制數; |
http 、server 或location |
用於限制某個存儲空間的並發數量 |
limit_conn_log_level 日志等級; |
http 、server 或location |
當達到最大限制連接數后, 記錄日志的等級 |
limit_conn_status 狀態碼; |
http 、server 或location |
當超過限制后,返回的響應狀態碼,默認是503 |
limit_conn_zone
會聲明一個zone
空間來記錄連接狀態, 才能限制數量。zone
是存儲連接狀態的空間, 以鍵值對存儲, 通常以客戶端地址$binary_remote_addr
作為key
來標識每一個連接。
當zone
空間被耗盡,服務器將會對后續所有的請求返回503(Service Temporarily Unavailable)
錯誤。
請求限制 limit_req_mudule
limit_req_mudule
: HTTP
請求頻率限制, 一次TCP
連接可以建立多次HTTP
請求。
配置語法:
limit_req_mudule 語法 |
范圍 | 說明 |
---|---|---|
limit_req_zone key zone=空間名:空間大小 rate=每秒請求數; |
http |
用於聲明一個存儲空間 |
limit_req zone=空間名 [burst=隊列數] [nodelay]; |
http 、server 或location |
用於限制某個存儲空間的並發數量 |
這里的zone
也是用來存儲連接的一個空間。
burst 和 nodelay
burst
和nodelay
對並發請求設置了一個緩沖區和是否延遲處理的策略。
先假設有如下zone
配置。
1 |
http { |
情況 1: limit_req zone=req_zone;
- 第
1
秒發送10
個請求, 正常響應。 - 第
1
秒發送13
個請求, 前10
個請求正常響應, 后3
個請求返回503(Service Temporarily Unavailable)
。
不加brust
和nodelay
的情況下, rate=10r/s
每秒只能執行10
次請求, 多的直接返回503
錯誤。
情況 2: limit_req zone=req_zone brust=5;
- 第
1
秒發送10
個請求, 正常響應。 - 第
1
秒發送13
個請求, 前10
個請求正常響應, 后3
個請求放入brust
等待響應。 - 第
1
秒發送20
個請求, 前10
個請求正常響應, 后5
個請求放入brust
等待響應, 最后5
個請求返回503(Service Temporarily Unavailable)
, 第2
秒執行brust
中的5
個請求。 - 第
1
秒發送20
個請求, 前10
個請求正常響應, 后5
個請求放入brust
等待響應, 最后5
個請求返回503(Service Temporarily Unavailable)
, 第2
秒發送6
個請求, 執行brust
中的5
個請求, 將5
個請求放入brust
等待響應, 剩下的1
個請求返回503(Service Temporarily Unavailable)
。
加brust=5
不加nodelay
的情況下, 有一個容量為5
的緩沖區, rate=10r/s
每秒只能執行10
次請求, 多的放到緩沖區中, 如果緩沖區滿了, 就直接返回503
錯誤。而緩沖區在下一個時間段會取出請求進行響應, 如果還有請求進來, 則繼續放緩沖區, 多的就返回503
錯誤。
情況 3: limit_req zone=req_zone brust=5 nodelay;
- 第
1
秒發送10
個請求, 正常響應。 - 第
1
秒發送13
個請求,13
個請求正常響應。 - 第
1
秒發送20
個請求, 前15
個請求正常響應, 后5
個請求返回503(Service Temporarily Unavailable)
。 - 第
1
秒發送20
個請求, 前15
個請求正常響應, 后5
個請求返回503(Service Temporarily Unavailable)
, 第2
秒發送6
個請求, 正常響應。
加brust=5
和nodelay
的情況下, 有一個容量為5
的緩沖區, rate=10r/s
每秒能執行15
次請求, 15=10+5
。多的直接返回503
錯誤。
基於 IP 的訪問控制
http_access_module
: 基於IP
的訪問控制, 通過代理可以繞過限制, 防君子不防小人。
http_access_module 語法 |
范圍 | 說明 |
---|---|---|
allow IP地址 | CIDR網段 | unix: | all; |
http 、server 、location 和limit_except |
允許IP地址 、CIDR 格式的網段、unix 套接字或所有來源訪問 |
deny IP地址 | CIDR網段 | unix: | all; |
http 、server 、location 和limit_except |
禁止IP地址 、CIDR 格式的網段、unix 套接字或所有來源訪問 |
allow
和deny
會按照順序, 從上往下, 找到第一個匹配規則, 判斷是否允許訪問, 所以一般把all
放最后。
1 |
location / { |
基於用戶密碼的訪問控制
http_auth_basic_module
: 基於文件匹配用戶密碼的登錄
http_auth_basic_module 語法 |
范圍 | 說明 |
---|---|---|
auth_basic 請輸入你的帳號密碼 | off; |
http 、server 、location 和limit_except |
顯示用戶登錄提示 (有些瀏覽器不顯示提示) |
auth_basic_user_file 存儲帳號密碼的文件路徑; |
http 、server 、location 和limit_except |
從文件中匹配帳號密碼 |
密碼文件可以通過htpasswd
生成, htpasswd
需要安裝yum install -y httpd-tools
。
1 |
# -c 創建新文件, -b在參數中直接輸入密碼 |