当前位置: 首页 > news >正文

【linux-nginx】nginx限流以及控制访问方法

一、限流

可以使用一些模块和指令来实现限流。以下是一些常用的方法:

使用 ngx_http_limit_req_module 模块:该模块可以限制每个客户端的请求速率。你可以在 Nginx 的配置文件中启用该模块,并使用 limit_req_zone 指令来定义限流规则。例如:

http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;...server {location / {limit_req zone=one burst=5;...}}
}

上述配置中,limit_req_zone 指令定义了一个名为 "one" 的限流区域,它使用了客户端的 IP 地址($binary_remote_addr)作为键,限制速率为每秒 1 个请求,并且使用了 10MB 的内存缓存。在 location 中,limit_req 指令应用了限流规则,允许突发请求数为 5。

突发请求一般都要跟nodelay 连用

分析:

在 limit_req zone=one 后加上brust=8;

Burst:爆发,处理突发请求

burst参数定义了超出zone指定速率的情况下(示例中的mylimit区域,速率限制在每秒10个请求,或每100毫秒一个请求),客户端还能发起多少请求。上一个请求100毫秒内到达的请求将会被放入队列,我们将队列大小设置为8。

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

查看发现,我们访问了21个,一个请求立即进到上游服务器群,进入桶里8个,失败12个。

不过,单独使用 burst 参数并不实用。假设 burst=50 ,rate依然为10r/s,排队中的50个请求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处理时间自然难以接受。

因此,burst 往往结合 nodelay 一起使用。

3.配置 nodelay 表示我不要任何的延迟,只要burst桶一满就返回503 报错

配置完成后就没有等待的感觉

效果相当于每秒10个请求的“流量限制”。如果希望不限制两个请求间允许间隔的情况下实施“流量限制”,nodelay参数是很实用的。

报错日志可以去 /usr/local/nginx/logs/access.logs 里去查看

使用 ngx_http_limit_conn_module 模块:该模块可以限制每个客户端的并发连接数。你可以在 Nginx 的配置文件中启用该模块,并使用 limit_conn_zone 指令来定义限流规则。例如:

http {limit_conn_zone $binary_remote_addr zone=addr:10m;...server {location / {limit_conn addr 10;...}}
}

上述配置中,limit_conn_zone 指令定义了一个名为 "addr" 的限流区域,它使用了客户端的 IP 地址($binary_remote_addr)作为键,并使用了 10MB 的内存缓存。在 location 中,limit_conn 指令应用了限流规则,限制每个客户端最多只能有 10 个并发连接。

分析:

conn模块一般也会添加  limit_rate_after 1m

就是在下载多少内容后再以limit_rate限制的速率下载,多用于浏览视频

先给你一点先看,再慢慢给你缓存观看,等你欲罢不能的时候,让你冲会员,冲完会员就快了!!!

先给你下载5M,再以1k速度左右下载

limit_rate 1k :限制下载速度在1k左右

限制连接数:

添加内容

limit_conn_zone $binary_remote_addr zone=two:10m;

limit_conn_zone 1 表示限制单个IP同时最多能持有1个连接。

limit_conn two 1 表示虚拟主机(server) 同时能处理并发连接的总数。

需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。

全部访问成功了,看不出什么限制效果,我们添加限制速度 limit_rate 1k

发现失败了大部分,因为限制了并发数,他就会等待第一个请求处理完成后,才能处理第二个,而我们增加了限制处理速度,处理速度很慢,所以就失败了很多个

二、控制访问

1、nginx 访问控制模块

(1)基于IP的访问控制:http_access_module

(2)基于用户的信任登录:http_auth_basic_module

2、基于IP的访问控制

1、配置语法

Syntax:allow address | CIDR | unix: | all;
default:默认无
Context:http,server,location
​
Syntax:deny address | CIDR | unix: | all;
default:默认无
Context:http,server,location

2、修改/etc/nginx/conf.d/access_mod.conf内容如下:

server {listen 80;server_name localhost;location ~ ^/admin {root /home/www/html;index index.html index.hml;deny 192.168.1.10;allow all;#deny 192.168.1.10;}
}
#需要注意:
如果先允许访问,在定义拒绝访问。那么拒绝访问不生效。

虚拟机宿主机IP为192.168.1.10,虚拟机IP为192.168.1.11,故这里禁止宿主机访问,允许其他所有IP访问。 宿主机访问http://192.168.1.11/admin,显示403 Forbidden。 当然也可以反向配置,同时也可以使用IP网段的配置方式,如allow 192.168.1.0/24;,表示满足此网段的IP都可以访问。

3、指定location拒绝所有请求

如果你想拒绝某个指定URL地址的所有请求,而不是仅仅对其限速,只需要在location块中配置deny all指令:

server {listen 80;server_name localhost;location /foo.html {root /home/www/html;deny all;}
}

3、基于用户的信任登录

1、配置语法

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

2、配置示例

改名access_mod.confauth_mod.conf,内容如下:

server {listen 80;server_name localhost;location ~ ^/admin {root /home/www/html;index index.html index.hml;auth_basic "Auth access test!";auth_basic_user_file /etc/nginx/auth_conf;}
}

auth_basic不为off,开启登录验证功能,auth_basic_user_file加载账号密码文件。

3、建立口令文件

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

4、访问测试

5、局限性

(1)用户信息依赖文件方式

(2)操作管理机械,效率低下

http://www.lryc.cn/news/124360.html

相关文章:

  • 菜单和内容滚动的联动原理及代码
  • Python爬虫:单线程、多线程、多进程
  • 超强的Everything,吊打系统自带文件搜索功能!
  • flink配置参数
  • 学习Vue:安装Vue.js和设置开发环境
  • 代理技术在网络安全、爬虫和数据隐私中的多重应用
  • Python 3 使用Hadoop 3之MapReduce总结
  • KU Leuven TU Berlin 推出“RobBERT”,一款荷兰索塔 BERT
  • Postern中配置和使用Socks5代理指南
  • android 窗口级模糊实现方式
  • 面试热题(数组中的第K个最大元素)
  • HTTP2协议介绍
  • 矩阵的转置
  • web集群学习:nginx+keepalived实现负载均衡高可用性
  • MFC第二十九天 CView类的分支(以及其派生类的功能)、MFC六大关键技术
  • SpringBoot复习:(37)自定义ErrorController
  • Linux学习之防火墙概述
  • JS_围绕圆形滑动
  • Ubuntu上安装RabbitMQ
  • 统计学和机器学习之间的联系和区别
  • linux中profile.d和profile的区别
  • MobaXterm sftp 不能拖拽文件夹了?
  • 【ArcGIS Pro二次开发】(59):Editing(编辑)模块
  • WebSocket与消息推送
  • 5.1 web浏览安全
  • (六)Unity开发Vision Pro——词汇表
  • 算法随笔:图论问题之割点割边
  • 【虚幻引擎】UE5数字人的创建
  • 算法:深度优先遍历
  • Stable Diffusion + Deform制作指南