关于nginx的限速模块

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:nginx 使用 ngx_http_limit_req_module和ngx_http_limit_conn_module 来限制对资源的请求这种方法,对于CC攻击(Challenge Collapsar)or DDOS(分布式拒绝服务)有一定的用处限制request 事实上就是 the processing rate of requests coming from a single IP address,使用的是漏桶算法(Leaky Bucket)

nginx 使用 ngx_http_limit_req_module和ngx_http_limit_conn_module 来限制对资源的请求

这种方法,对于CC攻击(Challenge Collapsar)or DDOS(分布式拒绝服务)有一定的用处

1、HttpLimitReqModule

限制request 事实上就是 the processing rate of requests coming from a single IP address,使用的是漏桶算法(Leaky Bucket)

Leaky Bucket有两种处理方式,具体可以看wiki

Traffic Shaping和Traffic Policing

在桶满水之后,常见的两种处理方式为:

1)暂时拦截住上方水的向下流动,等待桶中的一部分水漏走后,再放行上方水

2)溢出的上方水直接抛弃

将水看作网络通信中数据包的抽象,则方式1起到的效果称为Traffic Shaping,方式2起到的效果称为Traffic Policing

由此可见,Traffic Shaping的核心理念是"等待",Traffic Policing的核心理念是"丢弃"。它们是两种常见的流速控制方法

										Syntax: limit_req zone=name [burst=number] [nodelay];
									

										Default:    —
									

										Context:    http, server, location
									

示例

										limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
									

										 
									

										server {
									

										    location /search/ {
									

										        limit_req zone=one burst=5 nodelay;
									

										    }
									

第一段配置

第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址

第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息

第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的

第二段配置

第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应

第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内

第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队

下面这个配置可以限制特定UA(比如搜索引擎)的访问

									limit_req_zone  $anti_spider  zone=one:10m   rate=10r/s;
								

									limit_req zone=one burst=100 nodelay;
								

									if ($http_user_agent ~* "googlebot|bingbot|Feedfetcher-Google") {
								

									    set $anti_spider $http_user_agent;
								

									}
								

2、ngx_http_limit_conn_module

这个模块就是 limit  the number of connections from a single IP address

Not all connections are counted. A connection is counted only if it has a request processed by the server and the whole request header has already been read

									Syntax: limit_conn zone number;
								

									Default:    —
								

									Context:    http, server, location
								

示例

									http {
								

									    limit_conn_zone $binary_remote_addr zone=addr:10m;
								

									    ...
								

									    server {
								

									        ...
								

									        location /download/ {
								

									            limit_conn addr 1;
								

									            #带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
								

									            limit_rate 100k;  
								

									        }
								

									    }
								

									}
								

Sets the shared memory zone and the maximum allowed number of connections for a given key value. When this limit is exceeded, the server will return the 503 (Service Temporarily Unavailable) error in reply to a request

  • $binary_remote_addr是限制同一客户端ip地址
  • $server是限制同一server最大并发数
  • limit_conn为限制并发连接数,nginx 1.18以后用limit_conn_zone替换了limit_conn

配置完之后,我们可以使用ab或者webbench来测试一下

									ab -n 5 -c 1 http://www.test.org/test.php
								

正常情况下可以这样来配置

									map $remote_addr $rt_filtered_ip {
								

									        default $binary_remote_addr;
								

									        1.2.3.4 "";
								

									        4.4.4.4 "";
								

									}
								

									 
								

									or
								

									 
								

									geo $rt_filtered_ip {
								

									    default        $binary_remote_addr;
								

									 
								

									    127.0.0.1      "";
								

									    192.168.1.0/24 "";
								

									    10.1.0.0/16    "";
								

									 
								

									    ::1            "";
								

									    2001:0db8::/32 "";
								

									 
								

									    1.2.3.4        ""
								

									}
								

									 
								

									limit_conn_zone $binary_remote_addr zone=perip:10m;
								

									limit_conn_zone $server_name zone=perserver:10m;
								

									limit_conn_zone $host$uri zone=peruri:10m;
								

									limit_req_zone $rt_filtered_ip zone=qps:10m rate=1r/s;
								

									 
								

									server {
								

									 
								

									 
								

									        location = /wp-login.php {
								

									            limit_req zone=qps burst=5 nodelay;
								

									            limit_conn perip 10;
								

									            limit_conn perserver 100;
								

									            limit_rate 500k;
								

									            include fastcgi_params;
								

									            fastcgi_pass 127.0.0.1:9000;
								

									        }
								

									}
								

									 
								

									ab -n 100 -c 10 example.com/wp-login.php
								

									 
								

									$binary_remote_addr是限制同一客户端ip地址;
								

									$server_name是限制同一server最大并发数;
								

									limit_conn为限制并发连接数;
								

									limit_rate为限制下载速度;
								

参考

https://en.wikipedia.org/wiki/Leaky_bucket

http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

https://rtcamp.com/tutorials/nginx/block-wp-login-php-bruteforce-attack/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

认知盈余

认知盈余

[美] 克莱·舍基 / 胡泳、哈丽丝 / 中国人民大学出版社 / 2011-12 / 49.80元

“互联网革命最伟大的思考者”克莱•舍基 继《未来是湿的》之后最新力作 看自由时间如何变革世界的未来 如果说《未来是湿的》揭示的是“无组织的组织力量”, 那么《认知盈余》揭示的就是 “无组织的时间力量”。 腾讯董事会主席兼首席执行官马化腾首度亲笔作序倾情推荐 克莱•舍基说,美国人一年花在看电视上的时间大约2 000亿个小时,而这几乎是2 000个维基百科项目一年所需要的......一起来看看 《认知盈余》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码