本文主要介绍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块中定义,因此它可以在多个上下文中使用。它需要以下三个参数:
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”
日志中包含的字段:
默认情况下,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,location2.修改/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$xboNUJgHME6yDd17gkQNb04.访问测试
5.限制
(1)用户信息依赖文件方法
(2)运营管理机器效率低下。
关于nginx流量控制和访问控制的实现,本文到此结束。有关nginx流量控制和访问控制的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)