nginx 流量控制以及访问控制的实现

nginx 流量控制以及访问控制的实现,第1张

nginx流量控制以及访问控制的实现

本文主要介绍nginx流量控制和访问控制的实现。通过示例代码进行了非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面跟边肖学习。

nginx流量控制

速率限制是Nginx中一个非常实用的功能,但它经常被误解和错误配置。我们可以用它来限制用户在给定时间内的HTTP请求数量。请求可以是简单网站主页的GET请求,也可以是登录表单的POST请求。流量限制可用于安全目的,例如降低暴力破解密码的速度。通过将传入请求的速率限制为真实用户的典型值,并识别目标URL地址(通过日志),它还可以用于防御DDOS攻击。更常见的是,这个函数用于保护上游应用服务器不会被太多的并发用户请求淹没。

下面将介绍Nginx的限流基础知识和高级配置。“流量限制”也适用于NginxPlus。

1。Nginx如何限制电流

Nginx的“流量限制”使用漏桶,广泛应用于通信和分组交换计算机网络中,以应对带宽有限的突发情况。比如一个桶口倒水,桶底漏水。如果桶口倒水的速率大于桶底漏水的速率,桶内的水就会溢出;同样,在请求处理方面,水代表来自客户端的请求,桶代表根据FIFO(先进先出调度算法)等待处理的请求队列,桶底漏水代表离开缓冲区并被服务器处理的请求,桶溢出的水代表被丢弃和未处理的请求。

2。配置基本电流限值

“流量限制”配置两个主要指令,limit_req_zone和limit_req,如下所示:

192.168.62.155配置: limit_req_zone$binary_remote_addrzone=mylimit:10mrate=1r/s; upstreammyweb{ server192.168.62.157:80weight=1max_fails=1fail_timeout=1; } server{ listen80; server_namelocalhost; location/login{ limit_reqzone=mylimit; proxy_passhttp://myweb; proxy_set_headerHost$host:$server_port; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } } 192.168.62.157配置: server{ listen80; server_namelocalhost; location/login{ root/usr/share/nginx/html; indexindex.htmlindex.html; } }


单击两次

limit_req_zone指令定义与流限制相关的参数,并且limit_req指令在其出现的上下文中启用流限制(在该示例中,所有对“/login/”的请求)。

limit_req_zone指令通常在一个HTTP块中定义,因此它可以在多个上下文中使用。它需要以下三个参数:

  • key-定义应用限制的请求特征。示例中的Nginx变量$binary_remote_addr保存客户端IP地址的二进制形式。这意味着我们可以将每个不同的IP地址限制到第三个参数设置的请求速率。(使用此变量是因为它比字符串形式的客户端IP地址$remote_addr占用更少的空空间)
  • 区域——定义用于存储每个IP地址的状态和受限请求URL的访问频率的共享内存区域。存储在共享内存区域的信息意味着它可以在Nginx的工作进程之间共享。定义分为两部分:区域的名称由zone=keyword标识,冒号后面是区域大小。6000个IP地址的状态信息大约需要1MB,因此示例中的区域可以存储160000个IP地址。
  • rate-定义最大请求速率。在示例中,速率不能超过每秒1个请求。Nginx实际上以毫秒的粒度跟踪请求,因此速率限制相当于每1000毫秒1个请求。因为“意外情况”是不允许的(见下一章),这意味着在前一个请求1000毫秒内到达的请求将被拒绝。
  • limit_req_zone指令设置流限制和共享内存区域的参数,但实际上并不限制请求速率。所以你需要加上

    limit_req指令将流量限制应用于特定位置或服务器块。在上面的例子中,我们限制了/login/request的流量。

    现在,每个IP地址被限制为每秒请求/登录/一次。更准确地说,在前一个请求的1000毫秒内不能请求URL。

    3。处理突发

    如果我们在1000毫秒内收到2个请求会怎样?对于第二个请求,Nginx将向客户端返回一个错误。这可能不是我们想要的结果,因为申请往往是突发性的。相反,我们希望缓冲任何多余的请求,然后及时处理它们。我们更新配置并使用limit_req中的突发参数:

    limit_req_zone$binary_remote_addrzone=mylimit:10mrate=10r/s; upstreammyweb{ server192.168.62.157:80weight=1max_fails=1fail_timeout=1; } server{ listen80; server_namelocalhost; location/login{ limit_reqzone=mylimitburst=20; proxy_passhttp://myweb; proxy_set_headerHost$host:$server_port; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } }

    burst参数定义当超过区域指定的速度时,客户端可以发出多少个请求(在示例mylimit区域中,速度限制为每秒10个请求,或每100毫秒一个请求)。在最后一个请求100毫秒内到达的请求将被放入队列,我们将队列大小设置为20。

    这意味着,如果从一个给定的IP地址发送21个请求,Nginx将立即向上游服务器群发送第一个请求,然后将剩余的20个请求放入队列中。然后每隔100毫秒转发一个排队的请求。只有当传入请求导致排队请求数超过20时,Nginx才会向客户端返回错误。

    4。配置流量控制的相关功能

    1.配置日志记录

    默认情况下,Nginx在日志中记录由于流量限制而延迟或丢弃的请求,如下所示:

    2019/02/1304:20:00[错误]120315#0:*32086限制请求,超出:1.000byzone“mylimit”,客户端:192.168.1.2,服务器:nginx.com,请求:“GET/HTTP/1.0”,主机:“nginx.com”

    日志中包含的字段:

  • 限制请求-表示日志条目记录“流量受限”的请求
  • excess-每毫秒超过相应“流量限制”配置的请求数。
  • 区域-定义实施“流量限制”的区域。
  • 发起请求的客户端的IP地址。
  • 服务器-服务器IP地址或主机名
  • 请求——客户端发起的实际HTTP请求
  • host-HTTP头中host的值
  • 默认情况下,Nginx在错误级别记录被拒绝的请求,如上面例子中的[error]所示(Nginx在较低的级别记录被延迟的请求,一般在info级别)。要更改Nginx的日志记录级别,需要使用limit_req_log_level指令。这里,我们将被拒绝请求的日志记录级别设置为警告:

    您必须定义日志位置和级别:

    limit_req_zone$binary_remote_addrzone=mylimit:10mrate=1r/s; upstreammyweb{ server192.168.62.157:80weight=1max_fails=1fail_timeout=1; } server{ listen80; server_namelocalhost; location/login{ limit_reqzone=mylimitburst=20; limit_req_log_levelwarn; proxy_passhttp://myweb; proxy_set_headerHost$host:$server_port; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } }

    继续访问测试并读取error.log日志。

    2.发送到客户端的错误代码

    一般情况下,当客户端超过配置的流量限制时,Nginx的响应状态码是503(服务暂时不可用)。您可以使用limit_req_status指令将其设置为其他状态代码(例如,以下404状态代码):

    limit_req_zone$binary_remote_addrzone=mylimit:10mrate=10r/s; upstreammyweb{ server192.168.62.157:80weight=1max_fails=1fail_timeout=1; } server{ listen80; server_namelocalhost; location/login{ limit_reqzone=mylimit; limit_req_log_levelwarn; limit_req_status404; proxy_passhttp://myweb; proxy_set_headerHost$host:$server_port; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } }


    5。nginx流量控制概要

    以上已经涵盖了Nginx和NginxPlus提供的流量限制的很多功能,包括为HTTP请求的不同位置设置请求速率,配置流量限制的突发参数。

    nginx访问控制

    1,nginx访问控制模块

    (1)基于IP的访问控制:http_access_module
    (2)基于用户的信任登录:http_auth_basic_module

    2。基于IP的访问控制

    1.配置语法

    Syntax:allowaddress|CIDR|unix:|all; default:默认无 Context:http,server,location Syntax:denyaddress|CIDR|unix:|all; default:默认无 Context:http,server,location

    2.修改/etc/nginx/conf.d/access_mod.conf,如下所示:

    server{ listen80; server_namelocalhost; location~^/admin{ root/home/www/html; indexindex.htmlindex.hml; deny192.168.1.8; allowall; #deny192.168.1.8; } } #需要注意: 如果先允许访问,在定义拒绝访问。那么拒绝访问不生效。

    虚拟机的主机IP是192.168.1.8,虚拟机的IP是192.168.1.11,所以这里禁止主机访问,允许其他所有IP访问。
    主机访问http://192.168.1.11/admin,显示403禁止。
    当然配置可以反过来,也可以使用IP网段的配置方式,比如allow192.168.1.0/24;,也就是说所有满足这个网段的IP都可以访问。

    3.指定拒绝所有请求的位置。

    如果您想要拒绝指定URL地址的所有请求,而不仅仅是限制其速度,您只需在位置块中配置拒绝所有指令:

    server{ listen80; server_namelocalhost; location/foo.html{ root/home/www/html; denyall; } }

    3。基于用户信任的登录

    1.配置语法

    Syntax:auth_basicstring|off; default:auth_basicoff; Context:http,server,location,limit_except Syntax:auth_basic_user_filefile; default:默认无 Context:http,server,location,limit_except file:存储用户名密码信息的文件。

    2.配置示例

    使用以下内容将access_mod.conf重命名为auth_mod.conf:

    server{ listen80; server_namelocalhost; location~^/admin{ root/home/www/html; indexindex.htmlindex.hml; auth_basic"Authaccesstest!"; auth_basic_user_file/etc/nginx/auth_conf; } }

    Auth_basic未关闭,登录验证功能开启,auth_basic_user_file加载账号密码文件。

    3.建立密码文件。

    [root@192~]#mkdir/home/www/html/admin-p [root@192~]#vim/home/www/html/admin helloqf [root@192~]#yuminstall-yhttpd-tools#htpasswd是开源http服务器apachehttpd的一个命令工具,用于生成http基本认证的密码文件 [root@192~]#htpasswd-cm/etc/nginx/auth_confuser10//第一次新建用户 [root@192~]#htpasswd-m/etc/nginx/auth_confuser20//第二次添加用户 [root@192~]#cat/etc/nginx/auth_conf user10:$apr1$MOa9UVqF$RlYRMk7eprViEpNtDV0n40 user20:$apr1$biHJhW03$xboNUJgHME6yDd17gkQNb0

    4.访问测试

    5.限制

    (1)用户信息依赖文件方法
    (2)运营管理机器效率低下。

    关于nginx流量控制和访问控制的实现,本文到此结束。有关nginx流量控制和访问控制的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/774391.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存