Nginx反向代理中基于時間窗口的訪問控制

隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的應用程序部署在云端,如何保證云端服務的安全性和穩(wěn)定性成為了關(guān)鍵問題。其中,nginx作為一個高性能的web服務器和反向代理,廣泛應用于云端服務的部署和管理中。在實際應用中,有些場景下需要對訪問進行限制,例如頻繁訪問的ip,惡意訪問的請求,大流量的訪問等等。本文將介紹一種基于時間窗口的訪問控制方法,通過限制在一定時間內(nèi)的訪問次數(shù),保證云端服務的安全性和穩(wěn)定性。

一、什么是時間窗口

時間窗口是指在一定時間內(nèi)對事件進行限制的方法。在訪問控制中,可以根據(jù)時間窗口對訪問進行限制,例如:1分鐘內(nèi)最多訪問10次,5分鐘內(nèi)最多訪問100次,1個小時最多訪問1000次等。時間窗口可以根據(jù)實際情況進行調(diào)整,具有靈活性和可定制性。

二、nginx反向代理中的時間窗口訪問控制

  1. 安裝ngx_http_limit_req_module模塊

在使用nginx時間窗口訪問控制之前,需要安裝ngx_http_limit_req_module模塊。該模塊可以控制同一時間段內(nèi)客戶端請求到達的頻率。通常我們安裝nginx時會同時安裝該模塊,如果沒有安裝則需要重新編譯安裝nginx,安裝方式如下:

$ wget http://nginx.org/download/nginx-1.14.0.tar.gz  $ tar zxvf nginx-1.14.0.tar.gz  $ cd nginx-1.14.0/  $ ./configure --prefix=/usr/local/nginx --add-module=../nginx-limit-req-module-master  $ make  $ sudo make install
  1. 配置Nginx反向代理

在Nginx反向代理的配置文件中加入以下內(nèi)容:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  server{     ...     location /{         limit_req zone=one burst=5;         proxy_pass http://backend;     } }

該配置中,limit_req_zone定義了限制區(qū)域one,其中10m是內(nèi)存大小,可以根據(jù)實際需要進行調(diào)整。rate=1r/s定義了每秒鐘處理一個請求。在location中添加了limit_req zone=one burst=5,表示當超過1秒鐘1個請求的數(shù)量時,會將多余的請求以5個請求為峰值在后續(xù)時間內(nèi)處理。

  1. 驗證時間窗口訪問控制

配置完成后,可以使用ab工具進行測試,如下:

$ ab -n 100 -c 10 http://localhost/  This is ApacheBench, Version 2.3  Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/  Benchmarking localhost (be patient) Finished 100 requests

該命令意為:發(fā)送100個請求,并發(fā)數(shù)為10個。測試結(jié)果:如果在1秒鐘內(nèi)發(fā)送10個請求,則其余的請求將會被限制,產(chǎn)生429錯誤,如下:

$ ab -n 100 -c 10 http://localhost/  This is ApacheBench, Version 2.3  Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/  Benchmarking localhost (be patient) Finished 100 requests  Server Software:        nginx/1.14.0 Server Hostname:        localhost Server Port:            80  Document Path:          / Document Length:        0 bytes  Concurrency Level:      10 Time taken for tests:   0.062 seconds Complete requests:      100 Failed requests:        9    (Connect: 0, Receive: 0, Length: 0, Exceptions: 9) Non-2xx responses:      9 Requests per second:    1617.28 [#/sec] (mean) Time per request:       6.173 [ms] (mean) Time per request:       0.617 [ms] (mean, across all concurrent requests) Transfer rate:          0.00 [Kbytes/sec] received  Connection Times (ms)               min  mean[+/-sd] median   max Connect:        0    1   0.2      1       1 Processing:     1    5   9.8      3      47 Waiting:        1    5   9.8      3      47 Total:          1    6   9.8      4      47  Percentage of the requests served within a certain time (ms)   50%      4   66%      5   75%      5   80%      6   90%     15   95%     47   98%     47   99%     47  100%     47 (longest request)

三、總結(jié)

在云端服務的部署和管理中,訪問控制至關(guān)重要。通過Nginx反向代理中基于時間窗口的訪問控制,可以有效地控制訪問頻率,保證云端服務的安全性和穩(wěn)定性。該方法不僅可以限制頻率較高的請求,還可以對惡意訪問的請求進行限制,有效地提高了云端服務的可靠性和安全性。

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