基于Nginx實現(xiàn)訪問控制、連接限制

0 前言

Nginx自帶的模塊支持對并發(fā)請求數(shù)進(jìn)行限制, 還有對請求來源進(jìn)行限制??梢杂脕矸乐笵DOS攻擊。閱讀本文須知道nginx的配置文件結(jié)構(gòu)和語法。

1. 默認(rèn)配置語法

image

<mpchecktext style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word !important;">
image

</mpchecktext>

nginx.conf作為主配置文件

include /etc/nginx/conf.d/*.conf讀到這會把該目錄的.conf也讀進(jìn)來

1.1 全局性的和服務(wù)級別的

user 設(shè)置使用用戶

1.2 event對事件的模塊

worker_connections一個進(jìn)程允許處理的最大連接數(shù)

1.3 server

root 首頁的路徑

2. HTTP

image
curl-v http://www.baidu.com >/dev/null #-v 同時顯示狀態(tài)碼等信息

3. 日志

日志類型:error.log和access.log

error.log(記錄處理http請求的錯誤狀態(tài)以及nginx本身服務(wù)的錯誤狀態(tài))

log_format:設(shè)置了日志的記錄格式,定義日志以什么樣的樣式記錄到error.log、access.log中,log_format的配置只能配置在http模塊中。

access_log配置在http中。

4. 變量

image

1 ****連接限制 limit_conn_module

limit_conn_module: TCP連接頻率限制, 一次TCP連接可以建立多次HTTP請求。

配置語法:

image

limit_conn_zone會聲明一個zone空間來記錄連接狀態(tài), 才能限制數(shù)量。

zone是存儲連接狀態(tài)的空間, 以鍵值對存儲, 通常以客戶端地址$binary_remote_addr作為key來標(biāo)識每一個連接。

當(dāng)zone空間被耗盡,服務(wù)器將會對后續(xù)所有的請求返回503(Service Temporarily Unavailable) 錯誤。

2 ****請求限制 limit_req_mudule

limit_req_mudule: HTTP請求頻率限制, 一次TCP連接可以建立多次HTTP請求。

配置語法:

image

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

burst 和 nodelay

burst和nodelay對并發(fā)請求設(shè)置了一個緩沖區(qū)和是否延遲處理的策略。

先假設(shè)有如下zone配置。

<pre class="code-snippet__js" data-lang="nginx" style="margin: 0px; padding: 1em 1em 1em 0px; max-width: 1000%; box-sizing: border-box !important; word-wrap: break-word !important; overflow-x: auto; white-space: normal; -webkit-box-flex: 1; flex: 1 1 0%;">http { limit_req_zone $binan_remote_addr zone=req_zone:1m rate=10r/s;}br</pre>

情況 1: limit_req zone=req_zone;

第1秒發(fā)送10個請求, 正常響應(yīng)。

不加brust和nodelay的情況下, rate=10r/s每秒只能執(zhí)行10次請求, 多的直接返回503錯誤。

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

第1秒發(fā)送10個請求, 正常響應(yīng)。

加brust=5不加nodelay的情況下, 有一個容量為5的緩沖區(qū), rate=10r/s每秒只能執(zhí)行10次請求, 多的放到緩沖區(qū)中, 如果緩沖區(qū)滿了, 就直接返回503錯誤。而緩沖區(qū)在下一個時間段會取出請求進(jìn)行響應(yīng), 如果還有請求進(jìn)來, 則繼續(xù)放緩沖區(qū), 多的就返回503錯誤。

情況 3: limit_req zone=req_zone brust=5 nodelay;

第1秒發(fā)送10個請求, 正常響應(yīng)。

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

3 ****基于 IP 的訪問控制

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

image

allow和deny會按照順序, 從上往下, 找到第一個匹配規(guī)則, 判斷是否允許訪問, 所以一般把a(bǔ)ll放最后。

<pre class="code-snippet__js" data-lang="nginx" style="margin: 0px; padding: 1em 1em 1em 0px; max-width: 1000%; box-sizing: border-box !important; word-wrap: break-word !important; overflow-x: auto; white-space: normal; -webkit-box-flex: 1; flex: 1 1 0%;">location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all;}br</pre>

4 ****基于用戶密碼的訪問控制

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

image

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

# -c 創(chuàng)建新文件, -b在參數(shù)中直接輸入密碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容