相关文章:

高可用服务设计之二:Rate limiting 限流与降级

nginx限制请求之一:(ngx_http_limit_conn_module)模块

nginx限制请求之二:(ngx_http_limit_req_module)模块

nginx限制请求之三:Nginx+Lua+Redis 对请求进行限制

nginx限制请求之四:目录进行IP限制

对应nginx接入层限流可以使用Nginx自带的两个模块:

  • 连接数限流模块ngx_http_limit_conn_module:
  • 漏桶算法实现的请求限流模块ngx_http_limit_req_module

ngx_http_limit_conn_module 对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制;该模块可以根据定义的键来限制每个键值的连接数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。

该模块提供了两个配置参数,limit_conn_zone 和 limit_conn ,

其中 limit_conn_zone 只能配置在 http{} 段,而 limit_conn 则可以配置于http{},server{},location{} 区段中。


三方模块编译安装参数:


、 limit_conn_zone

语法:limit_conn_zone $variable zone=name:size; 
配置段:http

参数说明:

  • $variable:定义键,要限流的维度;
  • zone=name: 定义区域名称(名称随意起名),主要作用与后面的 limit_conn中对应就好。
  • size: 定义各个键共享内存空间大小。

该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值不会被考虑)。

如:

#限制连接数
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

语法:limit_conn zone_name number 
配置段:http,server,location

参数说明:

  • zone_name是上面limit_conn_zone中的zone定义的;
  • number:是并发连接数量;

该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回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

配置方法如下:

1、在nginx.conf里的http{}里加上如下代码:

  1. #ip limit
  2. limit_conn_zone $binary_remote_addr zone=perip:10m;
  3. limit_conn_zone $server_name zone=perserver:10m;

2、在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:

  1. limit_conn perip 2;
  2. limit_conn perserver 20;
  3. limit_rate 100k;

补充说明下参数:

    • $binary_remote_addr是限制同一客户端ip地址;
    • $server_name是限制同一server最大并发数;
    • limit_conn为限制并发连接数;
    • limit_rate为限制下载速度;

注意:
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

tomcat7 使用log4j进行日志记录的更多相关文章

  1. springmvc+log4j操作日志记录,详细配置

    没有接触过的,先了解一下:log4j教程 部分内容来:log4j教程 感谢! 需要导入包: log包:log4j-12.17.jar 第一步:web.xml配置 <!-- log4j配置,文件路 ...

  2. log4j 将日志记录到数据库

    需要以下jar包: ---log4j commons-loggin-1.1.1.jar log4j-1.2.16.jar ---mysql mysql-connector-java-5.1.15-bi ...

  3. java Web应用配置log4j日志记录

    公司启动全国支票影像系统,有这样一个功能是和消息中间件打交道,需要记录每一个报文出错情况,因为方便后期开发人员的调试,我选用了log4j作为日志记录,好了废话不多说了! 第一步:首先建立一个WEB工程 ...

  4. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  5. Hibernate使用Log4j日志记录(使用properties文件)

    我们知道,Log4j和Logback框架可用于支持日志记录hibernate,使用log4j有两种执行日志记录的方法: 通过log4j.xml文件(或) 通过log4j.properties文件 在这 ...

  6. Hibernate使用Log4j日志记录(使用xml文件)

    日志记录使程序员能够将日志详细信息永久写入文件. Log4j和Logback框架可以在hibernate框架中使用来支持日志记录. 使用log4j执行日志记录有两种方法: 通过log4j.xml文件( ...

  7. 用mybatis时log4j总是不记录sql语句

    log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).log4j:WARN ...

  8. Java学习笔记(十九)——Java 日志记录 AND log4j

    [前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...

  9. 扔掉log4j、log4j2,自己动手实现一个多功能日志记录框架,包含文件,数据库日志写入,实测5W+/秒日志文件写入,2W+/秒数据库日志写入,虽然它现在还没有logback那么强大

    讲到log4j,现在国外基本是没有开发者用这个框架了,原因大致有几点,1.功能太少:2.效率低下:3.线程锁bug等等等各种莫名其妙的bug一直都没解决. 其实最重要的是log4j的作者自己也放弃了l ...

随机推荐

  1. CI获取ip的API

    header("Content-type:text/html;charset=utf-8"); // p($this->input->ip_address()); // ...

  2. ubuntu12.10设置禁止锁屏和屏幕常亮

    1.System Settings -> Brightness and Lock -> Turn off screen... set to "Never" 进入ubun ...

  3. 实现一个div在浏览器水平居中

    第一种方法: div { margin: 0 auto; width: 960px; } 第二种方法(兼容IE): body { text-align: center; } div { margin: ...

  4. struts2,登录功能模块实现

    功能: ·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL: ·UserLogout作为控制登录推出的Actio ...

  5. MVC+EF 随笔小计————Html Helpers

    理论基础 -- Html Helpers 主要分成输入类和显示类. 输入类: TextArea, TextBox Password Hidden DropDownList ListBox (与Drop ...

  6. shell中的重定向(2>&1)

    shell的输出可以分为标准输出和错误输出,2>&1中,2代表错误输出,1代表标准输出,&符号代表后面跟的是代号而不是文件. test.sh echo '我是标准输出' ls / ...

  7. .Net 平台下的互联网架构新思考

    上一篇<互联网应用架构谈>有很多阅读量,但后来实践中发现基于WCF服务层技术用于实现网站访问的效率是有问题的. 我的本意是以WCF中间层解决商业逻辑,供各个平台调用,然而还是带来诸多的麻烦 ...

  8. windows下使用MinGW的调试工具gdb.exe调试C程序

    1.编译源代码 C:MinGW\bin>gcc.exe -g -o program.exe program.c 编译选项上要加上“g”,这样生成的目标程序会含有调试内容,再用gdb调试的时候才能 ...

  9. 洛谷1890 gcd区间

    题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a ...

  10. MyEclipse启动和运行速度优化

    1:去除不需要加载的模块 Windows – Preferences - General - Startup and Shutdown,这个时候在右侧就显示出了Eclipse启动时加载的模块,可以根据 ...