Nginx服务器中限制连接数与限制请求的模块配置教程

限制连接数的ngx_http_limit_conn_module模块
我们经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制。下面说说ngx_http_limit_conn_module 模块来实现该需求。该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数。并不是所有的连接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。
一. ngx_http_limit_conn_module指令解释
1. limit_conn_zone
语法:

limit_conn_zone $variable zone=name:size;

默认值: none
配置段: http
该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值将不会被考虑)。$variable定义键,zone=name定义区域名称,后面的limit_conn指令会用到的。size定义各个键共享内存空间大小。如:

limit_conn_zone $binary_remote_addr zone=addr:10m;

注释:客户端的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_zone 指令和limit_conn_zone指令同等意思,已经被弃用,就不再做说明了。
2. limit_conn_log_level
语法:

limit_conn_log_level info | notice | warn | error

默认值:error
配置段:http, server, location
当达到最大限制连接数后,记录日志的等级。
3. limit_conn
语法:

limit_conn zone_name number

默认值:none
配置段:http, server, location
指定每个给定键值的最大同时连接数,当超过这个数字时被返回503 (Service Temporarily Unavailable)错误。如:

limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
 location /www.ttlsa.com/ {
  limit_conn addr 1;
 }
}

同一IP同一时间只允许有一个连接。
当多个 limit_conn 指令被配置时,所有的连接数限制都会生效。比如,下面配置不仅会限制单一IP来源的连接数,同时也会限制单一虚拟服务器的总连接数:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
 limit_conn perip 10;
 limit_conn perserver 100;
}

limit_conn指令可以从上级继承下来。
4. limit_conn_status
语法: limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
该指定在1.3.15版本引入的。指定当超过限制时,返回的状态码。默认是503。
5. limit_rate
语法:limit_rate rate
默认值:0
配置段:http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。
二. 完整实例配置

http {
 limit_conn_zone $binary_remote_addr zone=limit:10m;
 limit_conn_log_level info;

 server {
 location ^~ /download/ {
 limit_conn limit 4;
 limit_rate 200k;
 alias /data/www.ttlsa.com/download/;
    }
 }
}

三. 使用注意事项
事务都具有两面性的。ngx_http_limit_conn_module 模块虽说可以解决当前面临的并发问题,但是会引入另外一些问题的。如前端如果有做LVS或反代,而我们后端启用了该模块功能,那不是非常多503错误了?这样的话,可以在前端启用该模块,要么就是设置白名单,白名单设置参见后续的文档,我会整理一份以供读者参考。

限制请求数的ngx_http_limit_req_module模块
我们说到了ngx_http_limit_conn_module 模块,来限制连接数。那么请求数的限制该怎么做呢?这就需要通过ngx_http_limit_req_module 模块来实现,该模块可以通过定义的 键值来限制请求处理的频率。特别的,可以限制来自单个IP地址的请求处理频率。 限制的方法如同漏斗,每秒固定处理请求数,推迟过多请求。
一. ngx_http_limit_req_module模块指令
1. limit_req_zone
语法:

limit_req_zone $variable zone=name:size rate=rate;

默认值: none
配置段: http
设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。 键的值就是指定的变量(空值不会被计算)。如

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

说明:区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次。
键值是客户端IP。
使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
2. limit_req_log_level
语法:

limit_req_log_level info | notice | warn | error;

默认值: limit_req_log_level error;
配置段: http, server, location
设置你所希望的日志级别,当服务器因为频率过高拒绝或者延迟处理请求时可以记下相应级别的日志。 延迟记录的日志级别比拒绝的低一个级别;比如, 如果设置“limit_req_log_level notice”, 延迟的日志就是info级别。
limit_req_status
语法:

limit_req_status code;

默认值: limit_req_status 503;
配置段: http, server, location
该指令在1.3.15版本引入。设置拒绝请求的响应状态码。
3. limit_req
语法:

 limit_req zone=name [burst=number] [nodelay];

默认值: —
配置段: http, server, location
设置对应的共享内存限制域和允许被处理的最大请求数阈值。 如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。 超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。这个阈值的默认值为0。如:

limit_req_zone $binary_remote_addr zone=ttlsa_com:10m rate=1r/s;
server {
 location /www.ttlsa.com/ {
  limit_req zone=ttlsa_com burst=5;
 }
}

限制平均每秒不超过一个请求,同时允许超过频率限制的请求数不多于5个。
如果不希望超过的请求被延迟,可以用nodelay参数,如:

limit_req zone=ttlsa_com burst=5 nodelay;

二.完整实例配置

http {
 limit_req_zone $binary_remote_addr zone=ttlsa_com:10m rate=1r/s;

 server {
 location ^~ /download/ {
 limit_req zone=ttlsa_com burst=5;
 alias /data/www.ttlsa.com/download/;
  }
 }
}

可能要对某些IP不做限制,需要使用到白名单。名单设置参见后续的文档,我会整理一份以供读者参考。请专注。

(0)

相关推荐

  • Nginx服务器中处理AJAX跨域请求的配置方法讲解

    Nginx 实现AJAX跨域请求 AJAX从一个域请求另一个域会有跨域的问题.那么如何在nginx上实现ajax跨域请求呢?要在nginx上启用跨域请求,需要添加add_header Access-Control*指令.如下所示: location /{ add_header 'Access-Control-Allow-Origin' 'http://other.subdomain.com'; add_header 'Access-Control-Allow-Credentials' 'true

  • Linux服务器nginx访问日志里出现大量http 400错误的请求分析

    服务器中的错误记录类似于这种: 124.65.133.242 – – [27/Oct/2014:14:30:51 +0800] "-" 400 0 "-" "-" 124.65.133.242 – – [27/Oct/2014:14:31:45 +0800] "-" 400 0 "-" "-" 124.65.133.242 – – [27/Oct/2014:14:31:45 +0800]

  • 详解Nginx服务器中配置全站HTTPS安全连接的方法

    HTTPS就等于HTTP加上TLS(SSL),HTTPS协议的目标主要有三个: 数据保密性.保证内容在传输过程中不会被第三方查看到.就像快递员传递包裹时都进行了封装,别人无法知道里面装了什么东西.     数据完整性.及时发现被第三方篡改的传输内容.就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收.     身份校验.保证数据到达用户期望的目的地.就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方. 启用

  • 修改配置解决Nginx服务器中常见的上传与连接错误

    nginx上传错误413 Request Entity Too Large 默认情况下使用nginx反向代理上传超过2MB的文件,会报错413 Request Entity Too Large,解决这个方法很简单,修改配置client_max_body_size值即可 修改nginx.conf #cat /usr/local/nginx-1.7.0/conf/nginx.conf | grep client_max_body_size client_max_body_size 10M; 如果需要

  • Nginx静态文件响应POST请求 提示405错误的解决方法

    例1:用linux下的curl命令发送POST请求给Apache服务器上的HTML静态页 复制代码 代码如下: [root@localhost ~]# curl -d 11=1 http://www.jb51.net/index.html    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">   <HTML>       <HEAD>           <TITLE>405 Meth

  • 详解Nginx的配置函数对于请求体的读取

    nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外还提供了一个丢弃请求体的接口-ngx_http_discard_request_body(),在请求执行的各个阶段中,任何一个阶段的模块如果对请求体感兴趣或者希望丢掉客户端发过来的请求体,可以分别调用这两个接口来完成.这两个接口是nginx核心提供的处理请求体的标准接口,如果希望配置文件中一些请求体相关的指

  • nginx与apache限制ip并发访问 限制ip连接的设置方法

    nginx nginx限制ip并发数,也是说限制同一个ip同时连接服务器的数量 1.添加limit_zone 这个变量只能在http使用 vi /usr/local/nginx/conf/nginx.conf limit_zone one $binary_remote_addr 10m; 2.添加limit_conn 这个变量可以在http, server, location使用 我只限制一个站点,所以添加到server里面 vi /usr/local/nginx/conf/host/gaoji

  • 详解Nginx的核心配置模块中对于请求体的接受流程

    本篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程. 首先介绍一下rfc2616中定义的http请求基本格式: Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ] </span> 第一行是请求行(request line),用来说明请求方法,要访问的资源以及所使用的HTTP版本: Request-Line  

  • Nginx配置统计流量带宽请求及记录实时请求状态的方法

    流量带宽请求状态统计 ngx_req_status用来展示nginx请求状态信息,类似于apache的status,nginx自带的模块只能显示连接数等等信息,我们并不能知道到底有哪些请求.以及各url域名所消耗的带宽是多少.ngx_req_status提供了这些功能. 功能特性 按域名.url.ip等等统计信息 统计总流量 统计当前带宽\峰值带宽 统计总请求数量 1. 安装 # cd /usr/local/src/ # wget "http://nginx.org/download/nginx

  • Nginx服务器中限制连接数与限制请求的模块配置教程

    限制连接数的ngx_http_limit_conn_module模块 我们经常会遇到这种情况,服务器流量异常,负载过大等等.对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制.下面说说ngx_http_limit_conn_module 模块来实现该需求.该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数.并不是所有的连接都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数.

  • 详解nginx服务器中的安全配置

    本篇文章详细的讲诉了nginx服务器中的安全配置,具体如下: 一.关闭SELinux 安全增强型Linux(SELinux)的是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制. 但是,SELinux带来的附加安全性和使用复杂性上不成比例,性价比不高 sed -i /SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config /usr/sbin/sestatus -v #查看状态 二.通过分区挂载允许最少特权 服务器上 nginx

  • 详解Nginx服务器中配置超时时间的方法

    一.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一个请求占用过长时间. 二.主要参数 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600;   读取 fastcgi_send_timeout 600;   发请求 这两个选项.          fastcgi_read_timeout是指

  • Nginx服务器中配置非80端口的端口转发方法详解

    nginx可以很方便的配置成反向代理服务器: server { listen 80; server_name localhost; location / { proxy_pass http://x.x.x.x:9500; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy

  • Nginx服务器中关于SSL的安全配置详解

    本文向你们展示如何在nginx的web服务器上设置更强的SSL.我们是通过使SSL无效来减弱CRIME攻击的这种方法实现.不使用在协议中易受攻击的SSLv3以及以下版本并且我们会设置一个更强的密码套件为了在可能的情况下能够实现Forward Secrecy,同时我们还启用HSTS和HPKP.这样我们就有了一个更强.不过时的SSL配置并且我们在Qually Labs SSL 测试中得到了A等级. 我们在nginx的设置文档中如下编辑 复制代码 代码如下: /etc/nginx/sited-enab

  • 详解Nginx服务器中HTTP Headers相关的模块配置使用

    ngx_http_headers_module模块 一. 前言 ngx_http_headers_module模块提供了两个重要的指令add_header和expires,来添加 "Expires" 和 "Cache-Control" 头字段,对响应头添加任何域字段.add_header可以用来标示请求访问到哪台服务器上,这个也可以通过nginx模块nginx-http-footer-filter研究使用来实现.expires指令用来对浏览器本地缓存的控制. 二.

  • Nginx服务器中强制使用缓存的配置及缓存优先级的讲解

    nginx代理做好了,缓存也配置好了,但是发现css.js.jpg这些静态文件统统都cached成功.但是偏偏页面文件依旧到源服务器取. 1. nginx不缓存原因 默认情况下,nginx是否缓存是由nginx缓存服务器与源服务器共同决定的, 缓存服务器需要严格遵守源服务器响应的header来决定是否缓存以及缓存的时常.header主要有如下: Cache-control:no-cache.no-store 如果出现这两值,nginx缓存服务器是绝对不会缓存的 Expires:1980-01-0

  • Nginx服务器中location配置的一些基本要点解析

    在这一篇文章里,我将介绍nginx关于location的处理,大家都知道Nginx配置文件里面会有很多的location,nginx的配置指令的作用域可以分为 main,server,location这3个种,实际上这3者不是依次包含的关系,而是相互独立的关系,比如一个只具有main级别作用域的指令,是不能写在某个server或者location内的,模块的某个指令可以同时具有main,server,location这3种作用域,另外每个模块有 main,srv,loc这3个级别的配置,一个模块

  • Nginx服务器中的模块编写及相关内核源码初探

    1.nginx模块 首先nginx和apache最大的不同就是nginx的模块不能够动态添加,需要在编译时,指定要添加的模块路径,与nginx源码一起编译. nginx模块的处理流程: a.客户端发送http请求到nginx服务器 b.nginx基于配置文件中的位置选择一个合适的处理模块 c.负载均衡模块选择一台后端服务器(反向代理情况下) d.处理模块进行处理并把输出缓冲放到第一个过滤模块上 e.第一个过滤模块处理后输出给第二个过滤模块 f.然后第二个过滤模块又到第三个过滤模块 g.第N个过滤

随机推荐