云计算学习之路——Nginx流量控制
Nginx流量控制
文章目錄
- Nginx流量控制
- 一、流量控制概念
- 二、Nginx流量限制實戰
- 1、普通的nginx流量限制
- 2、基于代理的nginx流量限制
- 三、Nginx流量限制實戰(基于代理的白名單的流量限制)
一、流量控制概念
?流量控制:是Nginx中一個很實用的功能,我們可以用來限制用戶在給定時間內http請求數量,可用作安全目的,比如減慢暴力破解速率,主要是為了保護上游服務器不被同時太多用戶請求壓垮。
?nginx如何限流:Nginx的流量限制使用漏桶算法,該算法在通訊和分組交換計算機網絡中廣泛使用,用以處理帶寬有限時的突發情況。就好比,向一個桶底漏水的水桶里倒水一樣。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水將會溢出;同樣,在請求處理方面,水代表來自客戶端的請求,水桶代表根據”先進先出調度算法”(FIFO)等待被處理的請求隊列,桶底漏出的水代表離開緩沖區被服務器處理的請求,桶口溢出的水代表被丟棄和不被處理的請求。
流量限制通過ngx_http_limit_req_module模塊實現
兩個主要指令是 limit_req_zone和limit_req
limit_req_zone 定義流量限制相關的參數,通常在http塊中定義,使其可以在多個上下文中使用。
limit_req 啟用流量限制
limit_req_zone需要以下三個參數:
Key——定義應用限制的請求特征,$binary_remote_addr,以二進制的形式保存客戶端IP地址。
Zone——定義用于存儲每個IP地址狀態以及被限制請求URL訪問頻率的共享內存區域。定義分為兩個部分:通過zone=keyword標識區域的名字,以及冒號后面跟區域大小。
Rate——定義最大請求速率。
示例:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
這定義了流量限制,意思是定義了一個名字為mylimit大小為10M的區域,每個IP地址被限制為每秒只能請求10次,更準確地說,在前一個請求的100毫秒內不能請求該URL,$binary_remote_addr,以二進制的形式保存客戶端IP地址。
二、Nginx流量限制實戰
1、普通的nginx流量限制
環境:
兩臺虛擬機:
虛擬機1:服務端,安裝nginx,完成流量限制配置。
虛擬機2:充當客戶端,訪問服務端,驗證流量限制。
操作:
虛擬機1
1)安裝并啟動nginx
2)修改主配置文件nginx.conf,在http塊中添加流量限制功能
[root@localhost ~]# vim /etc/nginx/nginx.conf
每個IP地址被限制為每秒只能請求1次,若一秒內請求多次將進行流量限制。
3)編寫子配置文件limit.conf
[root@localhost ~]# vim /etc/nginx/conf.d/limit.conf
4)重新加載nginx的配置文件
[root@localhost ~]# nginx -s reload
5)創建默認發布目錄以及網頁內容,需與配置相對應
[root@localhost ~]# mkdir /limit
[root@localhost ~]# echo "limit,limit,limit" > /limit/index.html
虛擬機2
快速多次訪問虛擬機1,驗證流量限制
當快速訪問服務器時,第一次正常,后面的訪問速率超出了速率1r/sd的設置,顯示503,說明流量限制配置成功
2、基于代理的nginx流量限制
環境:
三臺虛擬機:
虛擬機1:服務端,安裝nginx,充當真正的web服務。
虛擬機2:代理服務器,安裝nginx,配置代理功能和流量限制功能。
虛擬機3:充當客戶端,訪問代理服務器,驗證流量限制。
操作:
虛擬機1
1)安裝并啟動nginx
2)主配置文件內容,默認的就好
3)編寫子配置文件limit.conf
[root@localhost ~]# vim /etc/nginx/conf.d/limit.conf
4)重新加載nginx的配置文件
[root@localhost ~]# nginx -s reload
5)創建默認發布目錄以及網頁內容,需與配置相對應
[root@localhost ~]# mkdir /limit
[root@localhost ~]# echo "limit,limit,limit" > /limit/index.html
虛擬機2
1)安裝并啟動nginx
2)修改主配置文件nginx.conf
[root@localhost ~]# vim /etc/nginx/nginx.conf
3)編寫子配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/proxy.conf
4)重新加載nginx的配置文件
[root@localhost ~]# nginx -s reload
虛擬機3
快速多次訪問虛擬機2,驗證基于代理的流量限制
當快速訪問代理服務器時,第一次正常,后面的訪問速率超出了速率1r/sd的設置,顯示503,說明基于代理的流量限制配置成功
三、Nginx流量限制實戰(基于代理的白名單的流量限制)
?通過將基本的“流量限制”與Nginx的白名單功能配合使用,從而可以實現更細粒度的流量限制。
?通過使用白名單功能,對任何不在白名單內的ip請求強制執行流量限制。
環境:
四臺虛擬機:
虛擬機1:服務器端。安裝nginx充當真正的web服務。
虛擬機2:代理服務器。安裝nginx,配置代理功能,流量限制功能和白名單功能。
虛擬機3:充當白名單里允許的客戶端,訪問代理服務器,驗證白名單流量限制。
虛擬機3:充當白名單以外的客戶端,訪問代理服務器,驗證白名單流量限制。
虛擬機1
與上文的基于代理的流量限制一樣,這里不再贅述。
虛擬機2
與上文的基于代理的流量限制一樣,只需修改主配合文件nginx.conf
這個例子同時使用了geo和map指令。geo塊將給在白名單中的IP地址對應的 $ limit變量分配一個值0,給其它不在白名單中的分配一個值1。然后我們使用一個map映射將這些值轉為key,如下:
如果$ limit變量的值是0,$ limit_key變量將被賦值為空字符串
如果$ limit變量的值是1,$ limit_key變量將被賦值為客戶端二進制形式的IP地址
兩個指令配合使用,白名單內IP地址的$limit_key變量被賦值為空字符串,不在白名單內的被賦值為客戶端的IP地址。當limit_req_zone后的第一個參數是空字符串時,不會啟用“流量限制”功能,所以虛擬機3:192.168.58.155不會被限制。其它所有IP地址都會被限制到每秒只能有1個請求。
重新加載nginx的配置文件
[root@localhost ~]# nginx -s reload
虛擬機3
快速多次訪問代理服務器虛擬機2,驗證基于白名單的流量限制
虛擬機4
快速多次訪問代理服務器虛擬機2,驗證基于白名單的流量限制
總結
以上是生活随笔為你收集整理的云计算学习之路——Nginx流量控制的全部內容,希望文章能夠幫你解決所遇到的問題。