相关文章:php
《高可用服务设计之二:Rate limiting 限流与降级》html
《nginx限制请求之一:(ngx_http_limit_conn_module)模块》前端
《nginx限制请求之二:(ngx_http_limit_req_module)模块》nginx
《nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制》算法
对应nginx接入层限流可使用Nginx自带的两个模块:服务器
ngx_http_limit_conn_module 对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制;该模块能够根据定义的键来限制每一个键值的链接数,只有那些正在被处理的请求(这些请求的头信息已被彻底读入)所在的链接才会被计数。网络
该模块提供了两个配置参数,limit_conn_zone 和 limit_conn ,并发
其中 limit_conn_zone 只能配置在 http{} 段,而 limit_conn 则能够配置于http{},server{},location{} 区段中。post
语法:limit_conn_zone $variable zone=name:size;
配置段:http
参数说明:
该指令描述会话状态存储区域。键的状态中保存了当前链接数,键的值能够是特定变量的任何非空值(空值不会被考虑)。
如:
#限制链接数 limit_conn_zone $binary_remote_addr zone=showjoy_conn:20m;
注释:
客户端的IP地址做为键。注意,这里使用的是 binary_remote_addr 变量,而不是 remote_addr 变量。
remote_addr变量的长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
1M共享空间能够保存3.2万个32位的状态,1.6万个64位的状态。
若是共享内存空间被耗尽,服务器将会对后续全部的请求返回 503 (Service Temporarily Unavailable) 错误。
语法:limit_conn zone_name number
配置段:http,server,location
参数说明:
该指令指定每一个给定键值的最大同时链接数,当超过这个数字时返回503(Service )错误。limit_conn是对某个key对应的总的网络链接数进行限流。能够按照IP来限制IP维度的总链接数,或者按照服务域名来限制某个域名的总的链接数。(只有那些被nginx处理的且已经读取了整个请求头的请求链接才会被计数器统计)。
如(同一IP同一时间只容许有20个链接):
limit_conn_zone $binary_remote_addr zone=showjoy_conn:20m;
主要用来定义变量、zone名称、共享内存大小
limit_conn showjoy_conn 20;
将前面定义的showjoy_conn进行配置,而且限制同一IP并发链接数为20
配置方法以下:
一、在nginx.conf里的http{}里加上以下代码:
二、在须要限制并发数和下载带宽的网站配置server{}里加上以下代码:
补充说明下参数:
注意:
nginx 1.1.8 以后的版本的语法改成limit_conn_zone $binary_remote_addr zone=NAME:10m;
NAME 就是 zone 的名字详情请看这里 http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
限制链接数:
要限制链接,必须先有一个容器对链接进行计数,在http段加入以下代码:
"zone=" 给它一个名字,能够随便叫,这个名字要跟下面的 limit_conn 一致
$binary_remote_addr = 用二进制来储存客户端的地址,1m 能够储存 32000 个并发会话
... 省掉 N 字
http
{
limit_conn_zone $binary_remote_addr zone=addr:10m;
接下来须要对server不一样的位置(location段)进行限速,好比限制每一个IP并发链接数为1,则
server
{
listen 80;
server_name 192.168.11.128;
index index.html index.htm index.php;
limit_conn addr 1; #是限制每一个IP只能发起1个链接 (addr 要跟 limit_conn_zone 的变量对应)
limit_rate 100k; #限速为 100KB/秒
root html;
注意事项:
limit_rate 100k; //是对每一个链接限速100k。这里是对链接限速,而不是对IP限速!若是一个IP容许两个并发链接,那么这个IP就是限速limit_rate *
事务都具备两面性的。ngx_http_limit_conn_module 模块虽然说能够解决当前面临的并发问题,可是会引入另一些问题的。如前端若是有作LVS或反代,而咱们后端启用了该模块功能,那不是很是多503错误了?这样的话,能够在前端启用该模块,要么就是设置白名单。
模块地址:https://yunpan.cn/cqSKP6BrJ2AeT 访问密码 4f50