ngx_http_limit_req_module模块(0.7.21)用于限制每个定义的键的请求处理速率,特别是来自单个IP地址的请求的处理速率。这种限制是通过“漏桶”方法实现的。
ngx_http_limit_conn_module模块用于限制每个定义的键的连接数,特别是来自单个IP地址的连接数。并不是所有的连接都被计算在内。只有当服务器正在处理请求并且整个请求头已经读取时,连接才被计数。
令牌桶算法
令牌桶算法是一种常见的限流算法,它基于一个桶来存储令牌,每个令牌代表着一次请求的许可。当请求到来时,如果桶中有令牌,则将令牌取出,请求可以通过;否则,请求被拒绝。
Nginx 实现令牌桶算法的方法是使用 limit_req 模块,并设置 rate 和 burst 参数。rate 表示令牌桶每秒填充的令牌数,burst 表示桶的容量大小。例如,下面的配置表示限流速率为 10r/s,桶的大小为 20:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location / {
limit_req zone=mylimit burst=20;
# 处理请求的逻辑
}
}
漏桶算法
漏桶算法也是一种常见的限流算法,它基于一个固定容量的桶,以固定的速率流出请求。当请求到来时,如果桶中还有空间,则请求可以通过;否则,请求被拒绝。也就是说流量流入的速度是不定的,但是流出的速度是恒定的。
Nginx 实现漏桶算法的方法是使用 limit_req 模块,并设置 delay 参数。delay 表示请求被拒绝后需要等待的时间(以秒为单位)。例如,下面的配置表示限流速率为 10r/s,桶的大小为 20,请求被拒绝后等待 1s:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location / {
limit_req zone=mylimit burst=20 delay=1s;
# 处理请求的逻辑
}
}
计数器算法
计数器算法是一种简单的限流算法,它基于一个计数器来记录请求的数量。当请求到来时,如果计数器的值小于限制的数量,则请求可以通过;否则,请求被拒绝。
Nginx 实现计数器算法的方法是使用 limit_conn 模块,并设置 conn 参数。conn 表示最大允许的连接数。例如,下面的配置表示最多只允许 100 个连接:
limit_conn_zone $binary_remote_addr zone=mylimit:10m;
server {
location / {
limit_conn mylimit 100;
# 处理请求的逻辑
}
}
评论区