收录了这篇文章
一,ngx_http_limit_conn_module 模块,限制单IP并发连接数
ngx_http_limit_conn_module模块用于限制连接数量,特别是来自单个IP地址的连接数量。并非所有的连接都被计数。只有当服务器处理了请求并且已经读取了整个请求头时,连接才被计数。
示例配置:
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; } }
limit_conn_zone $binary_remote_addr zone=addr:10m;
为共享内存区域设置参数,该区域将保留各种键的状态。特别是,该状态包含当前的连接数。该key可以包含文本,变量,他们的组合。只能用于 http语法块。
$binary_remote_addr对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用32或64个字节,在64位平台上占用64个字节。一个兆字节的区域可以保持大约32000个32字节的状态或大约16000个64字节的状态。如果区域存储耗尽,服务器会将错误返回 给所有其他请求。10M可存储160000个状态
limit_conn addr 1
设置给定键值的共享内存区域和最大允许连接数。超过此限制时,服务器将返回 503 错误以回复请求。
语境用于http, server, location这些语法块内
二,ngx_http_limit_req_module 模块限制单IP请求次数
本模块用于限制每一个请求的处理速率,即每个IP地址的请求的处理速率。
(1)limit_req_zone 指令
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。 键的值就是指定的变量(空值不会被计算)
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; } }
平均每秒不超过1个请求,并且突发不超过5个请求。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP,使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
(2)limit_req 指令
limit_req zone=req_zone;
严格依照在limti_req_zone中配置的rate来处理请求,超过rate处理能力范围的,直接drop。表现为对收到的请求无延时。
(2.1)limit_req zone=req_zone burst=5;
依照在limti_req_zone中配置的rate来处理请求。
同时设置了一个大小为5的缓冲队列,在缓冲队列中的请求会等待慢慢处理。
超过了burst缓冲队列长度和rate处理能力的请求被直接丢弃。
表现为对收到的请求有延时。
(2.2)limit_req zone=req_zone burst=5 nodelay;
依照在limti_req_zone中配置的rate来处理请求
同时设置了一个大小为5的缓冲队列,当请求到来时,会爆发出一个峰值处理能力,对于峰值处理数量之外的请求,直接丢弃。
在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=10r/m,且这段时间内没有请求再到来,则每6 s 缓冲队列就能回复一个缓冲请求的能力,直到回复到能缓冲5个请求位置。
例子:
# 一分钟内,处理400个请求。完成峰值请求之后,缓冲队列不能再放入请求。每0.2秒回复一个请求 limit_req_zone $binary_remote_addr zone=test1_req:10m rate=300r/m; limit_req zone=test1_req burst=100 nodelay;
三,测试
http { limit_conn_zone $binary_remote_addr zone=addr:10m;#记录160000个请求 超过将返回失败 limit_req_zone $binary_remote_addr zone=one:10m rate=30r/s;#单个请求小于30r/s server { limit_conn addr 10; limit_req zone=one burst=50; } } limit_conn addr 50; limit_req zone=one burst=150;
ab -r -k -c 20 -n 100 http://127.0.0.1 ab -r -k -c 10 -n 100 http://127.0.0.1
100个请求在3.3秒完成符合30r/s
参考:
ngx_http_limit_conn_module模块文档:
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
ngx_http_limit_req_module模块文档:
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
http://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/
https://blog.csdn.net/hellow__world/article/details/78658041
关于limit_req和limit_conn的区别
https://www.cnblogs.com/zhoulujun/p/12183179.html
修改时间 2021-05-20