模块:ngx_http_limit_conn_module 

目的:通过IP地址,限制链接(TCP)


启动连接频率限制

vim /etc/nginx/nginx.conf

http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}

vim /var/log/nginx/a.com.log 

  location / {
limit_conn conn_zone 1;
}

limit_conn_zone:全局定义限制对象(IP),存储区限制空间(10M)字节 

limit_conn:该指令指定每个给定键值的最大同时连接数,当超过这个数字时返回503(Service )错误。如(同一IP同一时间只允许有2个连接):


客户端的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 $binary_remote_addr zone=conn_zone:10m模块开启对单个ip、单个会话同时存在的连接数的限制。这里定义一个记录区conn_zone,conn_zone的总容量是10m,该记录区针对于变量 $binary_remote_add生效,这里是针对单个IP生效。该模块只是一个定义,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示该location段使用conn_zone定义的 limit_conn_zone ,对单个IP限制同时存在一个连接。

单个IP,同时只允许有一个tcp连接


测试:

 ab -n 100 -c 10 http://a.com/

This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Benchmarking localhost (be patient).....done

Server Software: nginx/1.12.1
Server Hostname: tianyun.me
Server Port: 80

Document Path: /
Document Length: 671 bytes 文档长度

Concurrency Level: 10 当前并发数
Time taken for tests: 0.006 seconds 消耗总时间
Complete requests: 100 完成请求数
Failed requests: 0 失败请求数
Write errors: 0
Total transferred: 90400 bytes 总的传输大小
HTML transferred: 67100 bytes http传输大小
Requests per second: 15873.02 [#/sec] (mean) 每秒钟处理多少个请求。