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

1. 默認配置語法

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

nginx.conf作為主配置文件

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

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

user?設(shè)置使用用戶 worker_processes?進行增大并發(fā)連接數(shù)的處理?跟cpu保持一致?八核設(shè)置八個 Error_log?nginx的錯誤日志 pid?nginx服務(wù)啟動時候pid

1.2 Event事件的模塊

worker_connections一個進程允許處理的最大連接數(shù) use定義使用的內(nèi)核模型

1.3 server

root?首頁的路徑 index?首頁默認訪問哪個頁面 error_page?500?502?503?504?/50x.html?錯誤頁面?前面的500是**`http狀態(tài)碼`** systemctl?restart?nginx.service?重啟nginx systemctl?reload?nginx.service?不關(guān)閉服務(wù)柔和地重啟

2. http

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

curl-v?http://www.baidu.com?>/dev/null?#-v?同時顯示狀態(tài)碼等信息 nginx?-v?#顯示nginx版本及配置文件等信息

3. 日志

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

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

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

access_log配置在http中。

4. 變量

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

連接限制 limit_conn_module

limit_conn_module:tcp連接頻率限制, 一次tcp連接可以建立多次http請求。
配置語法:

limit_conn_module語法 范圍 說明
limit_conn_zone 標識 zone=空間名:空間大小; http 用于聲明一個存儲空間
limit_conn 空間名 并發(fā)限制數(shù); http、server或location 用于限制某個存儲空間的并發(fā)數(shù)量
limit_conn_log_level 日志等級; http、server或location 當達到最大限制連接數(shù)后, 記錄日志的等級
limit_conn_status 狀態(tài)碼; http、server或location 當超過限制后,返回的響應(yīng)狀態(tài)碼,默認是503

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

zone是存儲連接狀態(tài)的空間, 以鍵值對存儲, 通常以客戶端地址$binary_remote_addr作為key來標識每一個連接。
當zone空間被耗盡,服務(wù)器將會對后續(xù)所有的請求返回503(service temporarily unavailable)錯誤。

請求限制 limit_req_mudule

limit_req_mudule:http請求頻率限制, 一次tcp連接可以建立多次http請求。
配置語法:

limit_req_mudule語法 范圍 說明
limit_req_zone key zone=空間名:空間大小 rate=每秒請求數(shù); http 用于聲明一個存儲空間
limit_req zone=空間名 [burst=隊列數(shù)] [nodelay]; http、server或location 用于限制某個存儲空間的并發(fā)數(shù)量

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

burst 和 nodelay

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

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

情況 1:limit_req zone=req_zone;

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

  • 第1秒發(fā)送13個請求, 前10個請求正常響應(yīng), 后3個請求返回503(service temporarily unavailable)。

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

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

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

  • 第1秒發(fā)送13個請求, 前10個請求正常響應(yīng), 后3個請求放入brust等待響應(yīng)。

  • 第1秒發(fā)送20個請求, 前10個請求正常響應(yīng), 后5個請求放入brust等待響應(yīng), 最后5個請求返回503(service temporarily unavailable), 第2秒執(zhí)行brust中的5個請求。

  • 第1秒發(fā)送20個請求, 前10個請求正常響應(yīng), 后5個請求放入brust等待響應(yīng), 最后5個請求返回503(service temporarily unavailable), 第2秒發(fā)送6個請求, 執(zhí)行brust中的5個請求, 將5個請求放入brust等待響應(yīng), 剩下的1個請求返回503(service temporarily unavailable)。

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

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

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

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

  • 第1秒發(fā)送20個請求, 前15個請求正常響應(yīng), 后5個請求返回503(service temporarily unavailable)。

  • 第1秒發(fā)送20個請求, 前15個請求正常響應(yīng), 后5個請求返回503(service temporarily unavailable), 第2秒發(fā)送6個請求, 正常響應(yīng)。

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

基于 ip 的訪問控制

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

http_access_module語法 范圍 說明
allow ip地址 | cidr網(wǎng)段 | unix: | all; http、server、location和limit_except 允許ip地址、cidr格式的網(wǎng)段、unix套接字或所有來源訪問
deny ip地址 | cidr網(wǎng)段 | unix: | all; http、server、location和limit_except 禁止ip地址、cidr格式的網(wǎng)段、unix套接字或所有來源訪問

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

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; http、server、location和limit_except 顯示用戶登錄提示 (有些瀏覽器不顯示提示)
auth_basic_user_file 存儲帳號密碼的文件路徑; http、server、location和limit_except 從文件中匹配帳號密碼

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

#?-c?創(chuàng)建新文件,?-b在參數(shù)中直接輸入密碼 $?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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊13 分享