一.ngx_http_limit_conn_module
对同一个ip/server的连接数做限制.
配置指令:
limit_conn_zone
语法: limit_conn_zone $variable zone=name:size;
默认值: none
配置段: http

$veriable:常见取值
a.$binary_remote_addr 以客户端ip作为key
b.$server_name 以server作为key

示例:

limit_conn_zone $binary_remote_addr zone=addr:10m;

以客户端的ip地址做key,配置了一个名称为addr的共享内存为10m空间的限制域.如果内存空间被耗尽,则返回503错误.

使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录

当多个 limit_conn 指令被配置时,所有的连接数限制都会生效

http, server, location段配置:

limit_conn addr ; #同一ip,同一时间,只允许有4个连接
limit_rate 200k;#每个连接的下载速度

二.ngx_http_limit_req_module
对同一个ip的请求数做限制
配置指令:
limit_req_zone
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http

示例:

limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;

说明:
以客户端ip为key,建立了一个共享内存为10m的limit限制域.每秒可新增1个请求.

http, server, location段配置:
limit_req zone=limit burst=5; //漏桶原理,使用limit限制域限制的速率,每秒1个来处理请求,在处理未完成时,允许有5个请求放在缓存区,其余的请求都要等待.所以单个ip限制的最高峰值为5.

如果不希望这些请求等待,直接返回拒绝结果,加nodelay;则其余请求直接返回默认的503;

limit_req zone=limit burst= nodelay;

如果不加nodelay:

单个ip需要把并发在控制在burst限制内

如果加了nodelay:

单个ip不但需要把并发控制在burst内,而且不超出rate(速率)限制.

三.两者的区别
1.limit_conn是针对连接,即tcp连接,通过三次握手而建立的一个完整状态机制,来建立一个连接。(keep-alive的出现就是为了减少这种握手的次数,是同一连接可以复用.减少开销)
2.limit_req是针对请求,即http请求.

打开一个网页,图文并茂的那种,通常浏览器可能同时建立1-4个连接(依据不同浏览器和传输协议和keep-alive等,实际有所不同),然后由这些连接来发出几十个乃至上百个请求.

浏览器尽管同时能打开多个连接,但limit_conn限制了同时打开的连接个数.如同时只有1个,则其余的都需要等待.
连接打开后,就会尽快处理请求,比如返回文本或图片;limit_req则限制了同一ip在同一时间内请求的速度.比如每秒1个,超过这个速率限制,都会等待或不处理.

如果配置了keep-alive,则一个连接可以处理很多个请求,只要这些请求在limit_req的限制下.

简而言之,如果将web server比作游乐场,limit_conn限制了通道数目,有几条;limit_req限制了每个通道,可以通行速度.

因为limit_conn限制了连接数,同时还可以限制下载速度,一般用作下载方面的限制.
limit_req则一般用作cc攻击防护.

Nginx限制连接和请求的更多相关文章

  1. 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器

    现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...

  2. nginx长连接设置

    http { keepalive_timeout 20; --长连接timeout keepalive_requests 8192; --每个连接最大请求数} events { worker_conn ...

  3. Nginx是如何处理一个请求

    首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到 ...

  4. 从压测碰到的诡异断连问题聊聊Nginx的连接管理

    本文主要分享一个在压测Nginx反向代理服务过程中碰到的连接异常断开问题,包括问题的定位与复现,最后由这个实际问题引申聊一下Nginx的连接管理. 本博客已迁移至CatBro's Blog,那是我自己 ...

  5. Nginx+Lua+Redis 对请求进行限制

    Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...

  6. nginx源代码分析--读请求主体(1)

    首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...

  7. 记一次nginx强制将https请求重定向http

    公司要做小程序,但是发现小程序只允许https请求 所以查了查资料使用nginx重定向请求得方式做 以下是过程: 阿里云ssl证书管理控制台申请ssl证书 下载nginx 证书: 解压后得到后缀为ke ...

  8. nginx反向代理导致请求header头信息丢失

    背景:前端与后端调试接口,后端拿不到前段发过去的请求头信息,导致接口不通.(但是在本地是可以拿到的) 原因:nginx做了反向代理,没有请求时候加头信息的配置 报错如下: 解决方法: 方法一:NGIN ...

  9. Nginx 流量带宽等请求状态统计( ngx_req_status)

    Nginx 流量带宽等请求状态统计 ( ngx_req_status)  插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git c ...

随机推荐

  1. C# 技巧收藏

    IIS HTTP Error 500.21 - Internal Server Error 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:开始- ...

  2. 简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)

    众所周知毒瘤的锐捷会定时强制关闭NAT服务,导致虚拟机连不上网,进而你的虚拟机就成了孤儿,只能玩单机. 在一番百度后,得到了一种神仙破解办法.原理是把锐捷关闭服务时所用的搜索关键字改掉,这样锐捷就搜不 ...

  3. linux free 命令 ,讲解得比较好

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  4. 6.安装和配置OpenStack图片服务组件

    安装和配置图片服务组件 这里是安装在控制器上 安装和配置图片服务组件 yum install –y openstack-glance python-glanceclient 编辑/etc/glance ...

  5. 最近有点把b/s架构什么的,和web发展搞晕了,现在来总结总结

    Web是一种典型的分布式应用架构 分布式计算技术的架构:目前成熟的技术包括J2EE, CORBA和.NET(DCOM) 在流行c/s的1992年, OMG组织提出CORBA,很大程度的提高了分布式应用 ...

  6. AC日记——[Wc2008]游览计划 bzoj 2595

    2595 思路: 状压DP+spfa转移+dfs输出路径: 或者,斯坦纳树算法模板: 来,上代码: #include <queue> #include <cstdio> #in ...

  7. springMVC笔记:@ResponseBody

    使用@ResponseBody的方式,将Map形返回值转为json,用作POST请求的返回值.为了解决406 Not Acceptable错误,需要检查以下几项: 1. 依赖包中包含jackson-m ...

  8. Lightoj 1348 Aladdin and the Return Journey (树链剖分)(线段树单点修改区间求和)

    Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't wa ...

  9. linux 之创建文件命令

    1.vi vi 1.txt 会直接创建并打开一个文件1.txt 2.touch touch的作用是更改一个文件或目录的时间.touch 2.txt 如果2.txt不存在,则创建空文件2.txt 3.e ...

  10. JAVA常见算法题(十五)

    package com.xiaowu.demo; /** * * 输入三个整数x,y,z,请把这三个数由小到大输出. * * @author WQ * */ public class Demo15 { ...