可以使用一些模块和指令来实现限流。以下是一些常用的方法:
使用 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.conf
为auth_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)操作管理机械,效率低下