nginx网站限速限流配置——网站被频繁攻击,nginx上的设置limit_req和limit_conn

利用ngx_http_limit_req_module模块,可根据键值(如ip)限制每分钟的速率;

其实看官方的稳定比看百度查到的稳定,配置起来更明了。但是,官方给的说明,这里还是百度看到一些文章,摘录一些,做些笔记,

关于limit_req和limit_conn的区别

what is the difference  between connection and request? 

  • connection是连接,即常说的tcp连接,通过三次握手而建立的一个完整状态机。建立一个连接,必须得要三次握手。
  • request是指请求,即http请求,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议

通过打开一个网页,然后通过wareshark可以看到,一个连接建立后(即三次握手后),在这个连接断开之前(即四次挥手之前),会有很多的http request,这就是他们的区别:即一个连接的生命周期中,会存在一个或者多个请求,这是为了加快效率,避免每次请求都要三次握手建立连接,现在的HTTP/1.1协议都支持这种特性,叫做keepalive。

limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;

limit_conn conn_zone 1;

这样的配配置,表明以ip为key,来限制每个ip访问lmit.html文件时候,最多只能有一个在线,否则其余的都要返回不可用。

这种情况就是一个静止状态的计数可以实现,而无关乎多长时间。

举个例子,如果你的这个连接一直不释放,即使你通过这一个连接发送出再多的request请求,只要我能够应付,那么我就帮你处理

但是,如果你只需要处理2个请求,但是这两个请求是分别用两个连接同时发送过来的,那么,我就只能处理其中一个,另外一个就不行。这就是他的区别。

limit_req_zone $binary_remtoe_addr zone=req_zone:1m rate=1r/s; #这里需要为共享内存配置一个速率rate,

limit_conn zone=req_zone;

表明:对于每个ip来说,处理请求的速度不超过每秒1个请求

可以看到这是个速度量(而上面的那个是数字量,速度和个数还是有直观的区别的吧。。)

是同时发送出100个请求(不管是通过100个连接还是1个连接),只要你请求到底的速度超过每秒1个,那么我就会拒绝你。

根据官方给出的:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

具体配置如下

http {
    ########################### 限速配置 ################################    limit_conn_log_level error;    limit_conn_status 503;    #limit_conn_zone $binary_remote_addr zone=one:1m;    #limit_conn_zone $server_name zone=perserver:1m;    # 定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,    # 以$binary_remote_addr 为key,限制平均每秒的请求为20个,    # 1M能存储16000个状态,rete的值必须为整数,    # 如果限制两秒钟一个请求,可以设置成30r/m ,其中$binary_remote_addr有时需要根据自己已有的log_format变量配置进行替换    limit_conn_zone $binary_remote_addr zone=perip:10m;    limit_conn_zone $server_name zone=perserver:10m;

    #limit_req   zone=perip burst=10;     # 限制客户端并发连接数量为20, allow only one connection per an IP address at a time(每次). ;    #是限制每个IP只能发起20连接 (addr 要跟 limit_conn_zone 的变量对应)    limit_conn perip 15;    limit_conn perserver 15;   ############################ web server #######################    include  /etc/nginx/http/http_web.conf;

}

nginx连接数限制模块

limit_conn

指令语法: limit_conn zone number;
默认值: —
使用字段: http, server, location
指定一个zone的每个key最大连接数

限制每个name对应客服端的连接数,比如上面的limit_conn addr 5;意思就是现在addr这个name对应的客服端的连接数,比如name对应的是45.168.68.202这个ip地址,那么这个ip最多有5个并发连接

那什么并发呢?像这样的连接,请求到达并已经读取了请求头信息到响应头信息发送完毕,在这个过程中的连接,当一个客服端的并发连接达到我们设置的5个以上时,会返回503 (Service Temporarily Unavailable) 错误

这里,小伙伴对这个zone估计还是有一些疑问,有疑问可以在下面评论,大家一起讨论,比如,有人可能会问,一个客服端占用5个,那么327680只能容纳65536个客服端,那么第65537个客服端就会返回503错误

limit_conn_zone

语法:

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
看上面的语法,limit_conn_zone只能用在http段,例如:

http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name www.tomener.com tomener.com;
location / {
root /var/www/tomener;
index index.php index.html index.htm;
limit_conn addr 5; #是限制每个IP只能发起5个连接
limit_rate 100k; #限速为 100KB/秒
}
}
}

对于关系:
key => $binary_remote_addr #二进制的IP地址
name => addr #随便取的一个名字,比如,你可以取成abc
size => 10m #空间大小,这里是10兆
一个二进制的ip地址在32位机器上占用32个字节,在64位机器上占用63个字节,那么10M可以存放多少呢,计算一下,10x1024x1024/32 = 327680,意思就是可以存放326780个ip地址(32位),64位可以存放163840个ip

1、key:键,可以说是一个规则,就是对客户端连接的一个标识,比如上面用的是IP地址,比如我们可以用$query_string,例如:/index.php?mp=138944093953,那我们就可以根据mp的值来限制连接数,更多的nginx内置变量请查看http://nginx.org/en/docs/varindex.html

2、zone:共享内存空间,作用:保存每个key对应的连接数

3、size:共享内存空间大小,如1M、10M、100K
当共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误

limit_conn_log_level指令

Syntax: limit_conn_log_level info | notice | warn | error;
Default: limit_conn_log_level error;
Context: http, server, location
说明:当达到最大限制连接数后,记录日志的等级。

limit_conn_status指令

Syntax: limit_conn_status code;
Default: limit_conn_status 503;
Context: http, server, location
说明:当超过限制后,返回的响应状态码,默认是503,现在你就知道上面为什么会返回503(Service Temporarily Unavailable)服务暂时不可用

例子:

1、同时限制ip和虚拟主机最大并发连接

http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_conn perip 10;
limit_conn perserver 1000;
}
}
}

参考文章:

Nginx限制访问速率和最大并发连接数模块--limit (防范DDOS攻击)  https://www.cnblogs.com/wjoyxt/p/6128183.html

原文地址:https://www.cnblogs.com/zhoulujun/p/12183179.html

时间: 2024-10-10 07:38:05

nginx网站限速限流配置——网站被频繁攻击,nginx上的设置limit_req和limit_conn的相关文章

用nginx实现分布式限流(防DDOS攻击)

1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2. 首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 package com.anuo.app.controller; import org.slf4j.Logger; import org.slf4j.

nginx限流配置

一.前言 为了防止访问服务器的流量超过服务器最大承载量,需要对服务器访问流量进行限制,因为业务访问通过nginx进行转发,所以采取nginx配置进行限流操作.使用了nginx自带的两个模块ngx_http_limit_conn_module,ngx_http_limit_req_module进行限流,具体参考来源官网文档. http://nginx.org/en/docs/http/ngx_http_limit_req_module.html http://nginx.org/en/docs/h

图解Nginx限流配置

本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影响阅读本文. 空桶 我们从最简单的限流配置开始: limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s; server { location /login/ { limit_req zone=ip_limit; proxy_p

限流(四)nginx接入层限流

一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_module:连接数限流模块 2)ngx_http_limit_conn_module:请求限流模块 连接数限流模块是基于计数器方式实现的,请求限流模块是基于漏桶算法实现的: 关于限流算法可以参考:https://www.cnblogs.com/lay2017/p/9060497.html 除了以上两种,

死磕nginx系列--nginx 限流配置

限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水(请求)从上方倒入水桶,从水桶下方流出(被处理): 来不及流出的水存在水桶中(缓冲),以固定速率流出: 水桶满后水溢出(丢弃). 这个算法的核心是:缓存请求.匀速处理.多余的请求直接丢弃.相比漏桶算法,令牌桶算法不同之处在于它不但有一只"桶",还有个队列,这个桶是用来存放令牌的,队列才是用来

nginx 限流配置

限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水(请求)从上方倒入水桶,从水桶下方流出(被处理): 来不及流出的水存在水桶中(缓冲),以固定速率流出: 水桶满后水溢出(丢弃). 这个算法的核心是:缓存请求.匀速处理.多余的请求直接丢弃.相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的

nginx之 nginx限流配置

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

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击. 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的. 限流可以控制本软件或者应用的流量大小,从而减少对部署在相同物理机的其他应用的影响,减少物理网卡的流量占用. 如果部署在vm上的应用没有限流措施,那么这个应用有可能把整个物理机的网卡流量占满,这样部署在相同物理机的其他应用就不能服务了 参考: 1.https://www.zhihu.com/question/32255109 2.htt

Nginx对同一IP限速限流

limit_conn_zone是限制同一个IP的连接数,而一旦连接建立以后,客户端会通过这连接发送多次请求,那么limit_req_zone就是对请求的频率和速度进行限制. limit_conn_zone $binary_remote_address zone=addr:10m; limit_conn addr 2; 有了连接数限制,相当于限制了客户端浏览器和Nginx之间 的管道个数,那么浏览器通过这个管道运输请求,如同向自来水管中放水,水的流速和压力对于管道另外一端是有影响的.为了防止不信任