Nginx限制连接和请求
一.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限制连接和请求的更多相关文章
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
- nginx长连接设置
http { keepalive_timeout 20; --长连接timeout keepalive_requests 8192; --每个连接最大请求数} events { worker_conn ...
- Nginx是如何处理一个请求
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到 ...
- 从压测碰到的诡异断连问题聊聊Nginx的连接管理
本文主要分享一个在压测Nginx反向代理服务过程中碰到的连接异常断开问题,包括问题的定位与复现,最后由这个实际问题引申聊一下Nginx的连接管理. 本博客已迁移至CatBro's Blog,那是我自己 ...
- Nginx+Lua+Redis 对请求进行限制
Nginx+Lua+Redis 对请求进行限制 一.概述 需求:所有访问/myapi/**的请求必须是POST请求,而且根据请求参数过滤不符合规则的非法请求(黑名单), 这些请求一律不转发到后端服务器 ...
- nginx源代码分析--读请求主体(1)
首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...
- 记一次nginx强制将https请求重定向http
公司要做小程序,但是发现小程序只允许https请求 所以查了查资料使用nginx重定向请求得方式做 以下是过程: 阿里云ssl证书管理控制台申请ssl证书 下载nginx 证书: 解压后得到后缀为ke ...
- nginx反向代理导致请求header头信息丢失
背景:前端与后端调试接口,后端拿不到前段发过去的请求头信息,导致接口不通.(但是在本地是可以拿到的) 原因:nginx做了反向代理,没有请求时候加头信息的配置 报错如下: 解决方法: 方法一:NGIN ...
- Nginx 流量带宽等请求状态统计( ngx_req_status)
Nginx 流量带宽等请求状态统计 ( ngx_req_status) 插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git c ...
随机推荐
- [LA_3938]最大连续动态和
Sample Input 3 1 1 2 3 1 1 Sample Output Case 1: 1 1 线段树 L,R表示该区间的左右端点,sum表示该区间值的总和 l,r表示该区间连续的最大和的左 ...
- 非常好!!!Linux源代码阅读——环境准备【转】
Linux源代码阅读——环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...
- 如何使用python下载网站上的视频
youtube-dl 从名字上也能看出来,是专门用来下载YouTube的视频. 不过本人对YouTube不感兴趣,但是这个模块可以用来下载bilibili上的视频我们就来试一试 首先pip insta ...
- django返回响应对象
Django的视图必须要返回一个HttpResponse对象(或者其子类对象),不能像flask一样直接返回字符串. Django: return HttpResponse("Hello&q ...
- Selenium2+python自动化8-SeleniumBuilder辅助定位元素【转载】
前言 福利来了,对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛? 上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆 ...
- AC日记——[Wc2008]游览计划 bzoj 2595
2595 思路: 状压DP+spfa转移+dfs输出路径: 或者,斯坦纳树算法模板: 来,上代码: #include <queue> #include <cstdio> #in ...
- 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)
J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...
- 华农oj Problem K: 负2进制【有技巧构造/待补】
Problem K: 负2进制 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 6 [Submit][Status][Web Boa ...
- HDU 2016.11.12 做题感想
细数一下这两天做过的值得总结的一些题Orz...... HDU 2571 简单dp,但是一开始WA了一发.原因很简单:没有考虑仔细. 如果指向该点的所有点权值都为负数,那就错了(我一开始默认初始值为0 ...
- android如何取消闹铃
取消闹钟: Intent intent = new Intent(context, TestReceiver.class); PendingIntent pi = PendingIntent.getB ...