Nginx http_limit_conn模块详解
简介
ngx_http_limit_conn_module 对于一些服务器流量异常、负载过大,甚至是大流量的恶意攻击访问等,进行并发数的限制。
该模块可以根据定义的键来限制每个键值的连接数,特别的,可以设定单一 IP 来源的连接数。
并不是所有的连接都会被模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。
该模块提供了两个配置参数,limit_conn_zone 和 limit_conn ,其中 limit_conn_zone 只能配置在 http{} 段,而 limit_conn 则可以配置于http{},server{},location{} 区段中。
官方英文文档: http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
配置示例
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; } } }
表示,同一 IP 同一时间只允许有一个连接。
基本指令
limit_conn_zone
语法
limit_conn_zone $variable zone=name:size;
配置段:http
该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值不会被考虑)。$variable 定义键,zone=name 定义区域名称,主要作用与后面的 limit_conn。size 定义各个键共享内存空间大小。
这里,设置客户端的IP地址作为键。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。$remote_addr变量的长度为7字节到15字节不等,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。而$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。一兆字节的共享内存空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
limit_conn
语法
limit_conn zone_name number;
配置段:http,server,location
该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有20个连接)
limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { 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指令,将会从更高层级继承连接限制配置。
limit_conn_status
语法
limit_conn_status code;
默认值: limit_conn_status 503;
配置段: http, server, location
指定当超过限制时,返回的状态码。默认是503。
limit_conn_log_level
语法
limit_conn_log_level info | notice | warn | error;
默认值:limit_conn_log_level error;
配置段:http, server, location
指定当连接数超过设定的最大连接数,服务器限制连接时的日志等级。
limit_conn_dry_run
语法
limit_conn_dry_run on | off;
默认值:limit_conn_dry_run off;
配置段:http, server, location
启用空运行模式。在此模式下,连接数不受限制,但是,在共享内存区域中,过多连接的数将照常计算。
limit_rate
语法:
limit_rate rate;
默认值:0
配置段:http, server, location, if in location
对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。 按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么客户端的整体速率是这条指令设置值的2倍。