Nginx 并发设置 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块

一,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

真诚赞赏,手留余香
赞赏
随机推荐
CSS实现单行、多行文本溢出显示省略号
Node.JS 邮件发送模块 nodemailer
webpack使用vue与cordova
Javascript游戏中的“透视”
免安装版MySQL精简方式
Apache只在vhost文件设置虚拟主机的rewrite
jQuery. getJSON 跨域访问
Git 工作流程
input上选择同一文件change事件不生效
使用mint-ui开发项目的一些所得