人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

nginx 流量控制以及訪問控制的實(shí)現(xiàn)

發(fā)布日期:2022-01-29 17:51 | 文章來源:站長之家

nginx 流量控制

流量限制 (rate-limiting),是Nginx中一個(gè)非常實(shí)用,卻經(jīng)常被錯(cuò)誤理解和錯(cuò)誤配置的功能。我們可以用來限制用戶在給定時(shí)間內(nèi)HTTP請(qǐng)求的數(shù)量。請(qǐng)求,可以是一個(gè)簡單網(wǎng)站首頁的GET請(qǐng)求,也可以是登錄表單的 POST 請(qǐng)求。流量限制可以用作安全目的,比如可以減慢暴力密碼破解的速率。通過將傳入請(qǐng)求的速率限制為真實(shí)用戶的典型值,并標(biāo)識(shí)目標(biāo)URL地址(通過日志),還可以用來抵御 DDOS 攻擊。更常見的情況,該功能被用來保護(hù)上游應(yīng)用服務(wù)器不被同時(shí)太多用戶請(qǐng)求所壓垮。

以下將會(huì)介紹Nginx的 流量限制 的基礎(chǔ)知識(shí)和高級(jí)配置,”流量限制”在Nginx Plus中也適用。

1、Nginx如何限流

Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm),該算法在通訊和分組交換計(jì)算機(jī)網(wǎng)絡(luò)中廣泛使用,用以處理帶寬有限時(shí)的突發(fā)情況。就好比,一個(gè)桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水將會(huì)溢出;同樣,在請(qǐng)求處理方面,水代表來自客戶端的請(qǐng)求,水桶代表根據(jù)”先進(jìn)先出調(diào)度算法”(FIFO)等待被處理的請(qǐng)求隊(duì)列,桶底漏出的水代表離開緩沖區(qū)被服務(wù)器處理的請(qǐng)求,桶口溢出的水代表被丟棄和不被處理的請(qǐng)求。

2、配置基本的限流

“流量限制”配置兩個(gè)主要的指令,limit_req_zonelimit_req,如下所示:

192.168.62.155配置:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
upstream myweb {
    server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
    }
server {
    listen 80;
    server_name localhost;
    location /login {
        limit_req zone=mylimit;
        proxy_pass http://myweb;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}
192.168.62.157配置:
server {
    listen 80;
    server_name localhost;
    location /login {
        root  /usr/share/nginx/html;
        index  index.html index.html;
        }
}


連點(diǎn)兩次后

limit_req_zone指令定義了流量限制相關(guān)的參數(shù),而limit_req指令在出現(xiàn)的上下文中啟用流量限制(示例中,對(duì)于”/login/”的所有請(qǐng)求)。

limit_req_zone指令通常在HTTP塊中定義,使其可在多個(gè)上下文中使用,它需要以下三個(gè)參數(shù):

  • Key - 定義應(yīng)用限制的請(qǐng)求特性。示例中的 Nginx 變量$binary_remote_addr,保存客戶端IP地址的二進(jìn)制形式。這意味著,我們可以將每個(gè)不同的IP地址限制到,通過第三個(gè)參數(shù)設(shè)置的請(qǐng)求速率。(使用該變量是因?yàn)楸茸址问降目蛻舳薎P地址$remote_addr,占用更少的空間)
  • Zone - 定義用于存儲(chǔ)每個(gè)IP地址狀態(tài)以及被限制請(qǐng)求URL訪問頻率的共享內(nèi)存區(qū)域。保存在內(nèi)存共享區(qū)域的信息,意味著可以在Nginx的worker進(jìn)程之間共享。定義分為兩個(gè)部分:通過zone=keyword標(biāo)識(shí)區(qū)域的名字,以及冒號(hào)后面跟區(qū)域大小。16000個(gè)IP地址的狀態(tài)信息,大約需要1MB,所以示例中區(qū)域可以存儲(chǔ)160000個(gè)IP地址。
  • Rate - 定義最大請(qǐng)求速率。在示例中,速率不能超過每秒1個(gè)請(qǐng)求。Nginx實(shí)際上以毫秒的粒度來跟蹤請(qǐng)求,所以速率限制相當(dāng)于每1000毫秒1個(gè)請(qǐng)求。因?yàn)椴辉试S”突發(fā)情況”(見下一章節(jié)),這意味著在前一個(gè)請(qǐng)求1000毫秒內(nèi)到達(dá)的請(qǐng)求將被拒絕。

limit_req_zone指令設(shè)置流量限制和共享內(nèi)存區(qū)域的參數(shù),但實(shí)際上并不限制請(qǐng)求速率。所以需要通過添加

limit_req指令,將流量限制應(yīng)用在特定的location或者server塊。在上面示例中,我們對(duì)/login/請(qǐng)求進(jìn)行流量限制。

現(xiàn)在每個(gè)IP地址被限制為每秒只能請(qǐng)求1次/login/,更準(zhǔn)確地說,在前一個(gè)請(qǐng)求的1000毫秒內(nèi)不能請(qǐng)求該URL。

3、處理突發(fā)

如果我們?cè)?000毫秒內(nèi)接收到2個(gè)請(qǐng)求,怎么辦?對(duì)于第二個(gè)請(qǐng)求,Nginx將給客戶端返回錯(cuò)誤。這可能并不是我們想要的結(jié)果,因?yàn)閼?yīng)用本質(zhì)上趨向于突發(fā)性。相反地,我們希望緩沖任何超額的請(qǐng)求,然后及時(shí)地處理它們。我們更新下配置,在limit_req中使用burst參數(shù):

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
    upstream myweb {
        server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
        }
       
    server {
        listen 80;
        server_name localhost;
        location /login {
            limit_req zone=mylimit burst=20;
            proxy_pass http://myweb;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

burst參數(shù)定義了超出zone指定速率的情況下(示例中的mylimit區(qū)域,速率限制在每秒10個(gè)請(qǐng)求,或每100毫秒一個(gè)請(qǐng)求),客戶端還能發(fā)起多少請(qǐng)求。上一個(gè)請(qǐng)求100毫秒內(nèi)到達(dá)的請(qǐng)求將會(huì)被放入隊(duì)列,我們將隊(duì)列大小設(shè)置為20。

這意味著,如果從一個(gè)給定IP地址發(fā)送21個(gè)請(qǐng)求,Nginx會(huì)立即將第一個(gè)請(qǐng)求發(fā)送到上游服務(wù)器群,然后將余下20個(gè)請(qǐng)求放在隊(duì)列中。然后每100毫秒轉(zhuǎn)發(fā)一個(gè)排隊(duì)的請(qǐng)求,只有當(dāng)傳入請(qǐng)求使隊(duì)列中排隊(duì)的請(qǐng)求數(shù)超過20時(shí),Nginx才會(huì)向客戶端返回錯(cuò)誤。

4、配置流量控制相關(guān)功能

1、配置日志記錄

默認(rèn)情況下,Nginx會(huì)在日志中記錄由于流量限制而延遲或丟棄的請(qǐng)求,如下所示:

2019/02/13 04:20:00 [error] 120315#0: *32086 limiting requests, excess: 1.000 by zone "mylimit", client: 192.168.1.2, server: nginx.com, request: "GET / HTTP/1.0", host: "nginx.com"

日志條目中包含的字段:

  • limiting requests - 表明日志條目記錄的是被“流量限制”請(qǐng)求
  • excess - 每毫秒超過對(duì)應(yīng)“流量限制”配置的請(qǐng)求數(shù)量
  • zone - 定義實(shí)施“流量限制”的區(qū)域
  • client - 發(fā)起請(qǐng)求的客戶端IP地址
  • server - 服務(wù)器IP地址或主機(jī)名
  • request - 客戶端發(fā)起的實(shí)際HTTP請(qǐng)求
  • host - HTTP報(bào)頭中host的值

默認(rèn)情況下,Nginx以error級(jí)別來記錄被拒絕的請(qǐng)求,如上面示例中的[error]所示(Nginx以較低級(jí)別記錄延時(shí)請(qǐng)求,一般是info級(jí)別)。如要更改Nginx的日志記錄級(jí)別,需要使用limit_req_log_level指令。這里,我們將被拒絕請(qǐng)求的日志記錄級(jí)別設(shè)置為warn

一定要定義日志位置和級(jí)別才可以:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
    upstream myweb {
        server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
        }
    server {
        listen 80;
        server_name localhost;
        location /login {
            limit_req zone=mylimit burst=20;
            limit_req_log_level warn;
            proxy_pass http://myweb;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

繼續(xù)訪問測(cè)試,看error.log日志

2、發(fā)送到客戶端的錯(cuò)誤代碼

一般情況下,客戶端超過配置的流量限制時(shí),Nginx響應(yīng)狀態(tài)碼為503(Service Temporarily Unavailable)??梢允褂?code>limit_req_status指令來設(shè)置為其它狀態(tài)碼(例如下面的404狀態(tài)碼):

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
	upstream myweb {
    	server 192.168.62.157:80 weight=1 max_fails=1 fail_timeout=1;
		}
	server {
    	listen 80;
    	server_name localhost;
		
    	location /login {
			limit_req zone=mylimit;
			limit_req_log_level warn;
			limit_req_status 404;
        	proxy_pass http://myweb;
          proxy_set_header Host $host:$server_port;
	      	proxy_set_header X-Real-IP $remote_addr;
      		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        	}
	}


5、nginx 流量控制總結(jié)

以上已經(jīng)涵蓋了Nginx和Nginx Plus提供的“流量限制”的很多功能,包括為HTTP請(qǐng)求的不同location設(shè)置請(qǐng)求速率,給“流量限制”配置burst參數(shù)。

nginx 訪問控制

1、nginx 訪問控制模塊

(1)基于IP的訪問控制:http_access_module
(2)基于用戶的信任登錄:http_auth_basic_module

2、基于IP的訪問控制

1、配置語法

Syntax:allow address | CIDR | unix: | all;
default:默認(rèn)無
Context:http,server,location
Syntax:deny address | CIDR | unix: | all;
default:默認(rèn)無
Context:http,server,location

2、修改/etc/nginx/conf.d/access_mod.conf內(nèi)容如下:

server {
    listen 80;
    server_name localhost;
    location ~ ^/admin {
        root /home/www/html;
        index index.html index.hml;
        deny 192.168.1.8;
        allow all;
        #deny 192.168.1.8;
        }
}
#需要注意:
如果先允許訪問,在定義拒絕訪問。那么拒絕訪問不生效。

虛擬機(jī)宿主機(jī)IP為192.168.1.8,虛擬機(jī)IP為192.168.1.11,故這里禁止宿主機(jī)訪問,允許其他所有IP訪問。
宿主機(jī)訪問http://192.168.1.11/admin,顯示403 Forbidden
當(dāng)然也可以反向配置,同時(shí)也可以使用IP網(wǎng)段的配置方式,如allow 192.168.1.0/24;,表示滿足此網(wǎng)段的IP都可以訪問。

3、指定location拒絕所有請(qǐng)求

如果你想拒絕某個(gè)指定URL地址的所有請(qǐng)求,而不是僅僅對(duì)其限速,只需要在location塊中配置deny all指令:

server {
    listen 80;
    server_name localhost;
    location /foo.html {
        root /home/www/html;
        deny all;
        }
}

3、基于用戶的信任登錄

1、配置語法

Syntax:auth_basic string | off;
default:auth_basic off;
Context:http,server,location,limit_except
Syntax:auth_basic_user_file file;
default:默認(rèn)無
Context:http,server,location,limit_except
file:存儲(chǔ)用戶名密碼信息的文件。

2、配置示例

改名access_mod.confauth_mod.conf,內(nèi)容如下:

server {
	listen 80;
	server_name localhost;
	location ~ ^/admin {
		root /home/www/html;
		index index.html index.hml;
		auth_basic "Auth access test!";
		auth_basic_user_file /etc/nginx/auth_conf;
		}
}

auth_basic不為off,開啟登錄驗(yàn)證功能,auth_basic_user_file加載賬號(hào)密碼文件。

3、建立口令文件

[root@192 ~]# mkdir /home/www/html/admin -p
[root@192 ~]# vim /home/www/html/admin
hello qf
[root@192 ~]# yum install -y httpd-tools #htpasswd 是開源 http 服務(wù)器 apache httpd 的一個(gè)命令工具,用于生成 http 基本認(rèn)證的密碼文件
[root@192 ~]# htpasswd -cm /etc/nginx/auth_conf user10	//第一次新建用戶
[root@192 ~]# htpasswd -m /etc/nginx/auth_conf user20	//第二次添加用戶
[root@192 ~]# cat /etc/nginx/auth_conf
user10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40
user20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb0

4、訪問測(cè)試

5、局限性

(1)用戶信息依賴文件方式
(2)操作管理機(jī)械,效率低下

到此這篇關(guān)于nginx 流量控制以及訪問控制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)nginx 流量控制及訪問控制內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

美國服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部