Nginx 連接限制和訪問控制Nginx 連接限制和訪問控制


Nginx 連接限制和訪問控制

前言

Nginx自帶的模塊支持對並發請求數進行限制, 還有對請求來源進行限制。可以用來防止DDOS攻擊。
閱讀本文須知道nginx的配置文件結構和語法。

連接限制 limit_conn_module

limit_conn_moduleTCP連接頻率限制, 一次TCP連接可以建立多次HTTP請求。
配置語法:

limit_conn_module語法 范圍 說明
limit_conn_zone 標識 zone=空間名:空間大小; http 用於聲明一個存儲空間
limit_conn 空間名 並發限制數; httpserverlocation 用於限制某個存儲空間的並發數量
limit_conn_log_level 日志等級; httpserverlocation 當達到最大限制連接數后, 記錄日志的等級
limit_conn_status 狀態碼; httpserverlocation 當超過限制后,返回的響應狀態碼,默認是503

limit_conn_zone會聲明一個zone空間來記錄連接狀態, 才能限制數量。
zone是存儲連接狀態的空間, 以鍵值對存儲, 通常以客戶端地址$binary_remote_addr作為key來標識每一個連接。
zone空間被耗盡,服務器將會對后續所有的請求返回503(Service Temporarily Unavailable) 錯誤。

請求限制 limit_req_mudule

limit_req_muduleHTTP請求頻率限制, 一次TCP連接可以建立多次HTTP請求。
配置語法:

limit_req_mudule語法 范圍 說明
limit_req_zone key zone=空間名:空間大小 rate=每秒請求數; http 用於聲明一個存儲空間
limit_req zone=空間名 [burst=隊列數] [nodelay]; httpserverlocation 用於限制某個存儲空間的並發數量

這里的zone也是用來存儲連接的一個空間。

burst 和 nodelay

burstnodelay對並發請求設置了一個緩沖區和是否延遲處理的策略。
先假設有如下zone配置。

1
2
3
http {
limit_req_zone $binan_remote_addr zone=req_zone:1m rate=10r/s;
}

 

情況 1: limit_req zone=req_zone;

  1. 1秒發送10個請求, 正常響應。
  2. 1秒發送13個請求, 前10個請求正常響應, 后3個請求返回503(Service Temporarily Unavailable)

不加brustnodelay的情況下, rate=10r/s每秒只能執行10次請求, 多的直接返回503錯誤。


情況 2: limit_req zone=req_zone brust=5;

  1. 1秒發送10個請求, 正常響應。
  2. 1秒發送13個請求, 前10個請求正常響應, 后3個請求放入brust等待響應。
  3. 1秒發送20個請求, 前10個請求正常響應, 后5個請求放入brust等待響應, 最后5個請求返回503(Service Temporarily Unavailable), 第2秒執行brust中的5個請求。
  4. 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. 1秒發送10個請求, 正常響應。
  2. 1秒發送13個請求, 13個請求正常響應。
  3. 1秒發送20個請求, 前15個請求正常響應, 后5個請求返回503(Service Temporarily Unavailable)
  4. 1秒發送20個請求, 前15個請求正常響應, 后5個請求返回503(Service Temporarily Unavailable), 第2秒發送6個請求, 正常響應。

brust=5nodelay的情況下, 有一個容量為5的緩沖區, rate=10r/s每秒能執行15次請求, 15=10+5。多的直接返回503錯誤。


基於 IP 的訪問控制

http_access_module: 基於IP的訪問控制, 通過代理可以繞過限制, 防君子不防小人。

http_access_module語法 范圍 說明
allow IP地址 | CIDR網段 | unix: | all; httpserverlocationlimit_except 允許IP地址CIDR格式的網段、unix套接字或所有來源訪問
deny IP地址 | CIDR網段 | unix: | all; httpserverlocationlimit_except 禁止IP地址CIDR格式的網段、unix套接字或所有來源訪問

allowdeny會按照順序, 從上往下, 找到第一個匹配規則, 判斷是否允許訪問, 所以一般把all放最后。

1
2
3
4
5
6
7
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}

 

基於用戶密碼的訪問控制

http_auth_basic_module: 基於文件匹配用戶密碼的登錄

http_auth_basic_module語法 范圍 說明
auth_basic 請輸入你的帳號密碼 | off; httpserverlocationlimit_except 顯示用戶登錄提示 (有些瀏覽器不顯示提示)
auth_basic_user_file 存儲帳號密碼的文件路徑; httpserverlocationlimit_except 從文件中匹配帳號密碼

密碼文件可以通過htpasswd生成, htpasswd需要安裝yum install -y httpd-tools

1
2
3
4
5
6
7
8
# -c 創建新文件, -b在參數中直接輸入密碼
$ htpasswd -bc /etc/nginx/conf.d/passwd user1 pw1
Adding password for user user1
$ htpasswd -b /etc/nginx/conf.d/passwd user2 pw2
Adding password for user user2
$ cat /etc/nginx/conf.d/passwd
user1:$apr1$7v/m0.IF$2kpM9NVVxbAv.jSUvUQr01
user2:$apr1$XmoO4Zzy$Df76U0Gzxbd7.5vXE0UsE0

 

參考資料

  1. limit_conn_module
  2. limit_req_mudule
  3. http_access_module
  4. http_auth_basic_module


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM