1. ngx_http_limit_req_module (通过IP地址限制请求)
  2. ngx_http_limit_conn_module (通过IP地址限制连接(tcp))

1.ngx_http_limit_req_module (通过IP地址限制请求)

        启动请求频率限制

        1.1测试未限制情况下的访问

yum install -y httpd-tools     安装http网络测试工具

ab -n 100 -c 10 http://tianyun.me/       向某个网站分10次发起100次请求

nginx强制443 nginx 限制_IP

        1.2启动限制:vim /etc/nginx/nginx.conf

        (一) 解释

定义:
      limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;  
    限制请求  二进制地址  限制策略的名称   占用10M空间  允许每秒1次请求

引用:
     limit_req zone=req_zone;  
    引用 限制策略的名称

        (二)配置:

http {
     limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;     定义    server {
         location / {
             root /usr/share/nginx/html;
             index index.html index.htm;
             limit_req zone=req_zone;          引用限制
             #limit_req zone=req_zone burst=5;   引用限制,但是令牌桶有5个。有延迟。速度慢
             #limit_req zone=req_zone burst=5 nodelay;              无延迟。速度快
         }
     }
 }


    burst=5 表示最大延迟请求数量不大于5。 如果太过多的请求被限制延迟是不需要的 ,这时需要使用nodelay参数,服务器会立刻返回503状态码。 

        (三)重启服务,并测试

ab -n 100 -c 10 http://tianyun.me/       向某个网站分10次发起100次请求

nginx强制443 nginx 限制_nginx_02

        (四)观察错误日志

 2023/02/01 23:55:11 [error] 2220#2220: *100 limiting requests, excess: 0.969 by zone "req_zone", client: 192.168.26.147, server: a.com, request: "GET / HTTP/1.0", host: "a.com"

 limiting requests
由于限制请求导致。

2.ngx_http_limit_conn_module (通过IP地址限制连接(tcp))

        启动连接频率限制

        2.1启动连接频率限制:vim /etc/nginx/nginx.conf

http {
     limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
 }
 server {
     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限制同时存在一个连接。

        2.2测试:yum install -y httpd-tools

ab -n 100 -c 10 http://服务器IP地址/
    This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
 Benchmarking localhost (be patient).....doneServer Software:         nginx/1.12.1    
 Server Hostname:        tianyun.me
 Server Port:                80Document 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)   每秒钟处理多少个请求。