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请求次数

ngx_http_limit_req_module 模块用于限制每一个请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。


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”。


limit_req 指令

limit_req zone=req_zone;

严格依照在limti_req_zone中配置的rate来处理请求

超过rate处理能力范围的,直接drop

表现为对收到的请求无延时


limit_req zone=req_zone burst=5;

依照在limti_req_zone中配置的rate来处理请求

同时设置了一个大小为5的缓冲队列,在缓冲队列中的请求会等待慢慢处理

超过了burst缓冲队列长度和rate处理能力的请求被直接丢弃

表现为对收到的请求有延时


limit_req zone=req_zone burst=5 nodelay;

依照在limti_req_zone中配置的rate来处理请求

同时设置了一个大小为5的缓冲队列,当请求到来时,会爆发出一个峰值处理能力,对于峰值处理数量之外的请求,直接丢弃

在完成峰值请求之后,缓冲队列不能再放入请求。如果rate=10r/m,且这段时间内没有请求再到来,则每6 s 缓冲队列就能回复一个缓冲请求的能力,直到回复到能缓冲5个请求位置。



三,测试

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

真诚赞赏,手留余香
赞赏
随机推荐
Sequelize 事务的使用与Transaction类
前端生成验证码
Electron小试
macOS 系统常用目录
npm warn package.json @1.0.0 no repository field
PHPExcel读取和写入Excel文件
PHP 如何防止 CSRF 跨站域请求伪造
国内互联网公司的APP起名套路大全
php5.4环境下安装ECshop出现Strict Standards的解决方案
使用FormData无刷新上传文件