- ngx_http_limit_req_module (通过IP地址限制请求)
- ngx_http_limit_conn_module (通过IP地址限制连接(tcp))
1.ngx_http_limit_req_module (通过IP地址限制请求)
启动请求频率限制
1.1测试未限制情况下的访问
yum install -y httpd-tools 安装http网络测试工具
ab -n 100 -c 10 http://tianyun.me/ 向某个网站分10次发起100次请求
1.2启动限制:vim /etc/nginx/nginx.conf
(一) 解释
定义:
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
限制请求 二进制地址 限制策略的名称 占用10M空间 允许每秒1次请求引用:
limit_req zone=req_zone;
引用 限制策略的名称
(二)配置:
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; 定义 server {
location / {
root /usr/share/nginx/html;
index index.html index.htm;
limit_req zone=req_zone; 引用限制
#limit_req zone=req_zone burst=5; 引用限制,但是令牌桶有5个。有延迟。速度慢
#limit_req zone=req_zone burst=5 nodelay; 无延迟。速度快
}
}
}
burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。
(三)重启服务,并测试
ab -n 100 -c 10 http://tianyun.me/ 向某个网站分10次发起100次请求
(四)观察错误日志
2023/02/01 23:55:11 [error] 2220#2220: *100 limiting requests, excess: 0.969 by zone "req_zone", client: 192.168.26.147, server: a.com, request: "GET / HTTP/1.0", host: "a.com"
limiting requests
由于限制请求导致。
2.ngx_http_limit_conn_module (通过IP地址限制连接(tcp))
启动连接频率限制
2.1启动连接频率限制:vim /etc/nginx/nginx.conf
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}
server {
location / {
...
limit_conn conn_zone 1;
}
}
limit_conn_zone:全局定义限制对象(IP),存储区限制空间(10M)字节
limit_conn:该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有2个连接):
客户端的IP地址作为键。注意,这里使用的是 binary_remote_addr 变量,而不是 remote_addr 变量。
remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn_zone $binary_remote_addr zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 $binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接。
2.2测试:yum install -y httpd-tools
ab -n 100 -c 10 http://服务器IP地址/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Benchmarking localhost (be patient).....doneServer Software: nginx/1.12.1
Server Hostname: tianyun.me
Server Port: 80Document Path: /
Document Length: 671 bytes 文档长度Concurrency Level: 10 当前并发数
Time taken for tests: 0.006 seconds 消耗总时间
Complete requests: 100 完成请求数
Failed requests: 0 失败请求数
Write errors: 0
Total transferred: 90400 bytes 总的传输大小
HTML transferred: 67100 bytes http传输大小
Requests per second: 15873.02 [#/sec] (mean) 每秒钟处理多少个请求。