Nginx 能实现类似于 fail2ban 一样的,限制访问频率的效果吗?

2021-02-15 23:13:47 +08:00
 Richard14

初学 Nginx,很多东西不是很懂,百度搜了一下没有类似解决方案。

想要实现的效果是用 NGinx 限制单个 IP 对登录 api 的调用次数,比如每 30 分钟里最多访问五次之类的。类似于 fail2ban,但是不用判断成功与否,到次数都一律屏蔽就对了。百度搜到的大多是每秒钟访问多少次的限制说明,感觉不是很符合需求

856 次点击
所在节点    问与答
6 条回复
Phant0m
2021-02-16 02:08:30 +08:00
有限速模块 ngx_http_limit_req_module
或者 ngx lua 自己写一个
wakzz
2021-02-16 12:52:54 +08:00
ngx_http_limit_req_module 满足楼主的需求
LeeReamond
2021-02-16 17:35:57 +08:00
@Phant0m
@wakzz 感谢大佬回复,查了一下发现百度搜到的方法也是这个模块的,但是百度文章一般都没写模块全名,导致学的不是很清楚。我按照网上的配置方法,它需要先在 http 段里启用这个模块,然后再到 server 段里进行配置。我遇到一个问题是我的配置文件都是写在 /etc/nginx/conf.d 里的,但是这里的文件不允许修改 http 段,如果修改 /etc/nginx/nginx.conf 的话,比如加入下面这一句

limit_req_zone $binary_remote_addr zone=example_com:10m rate=1r/s;

不是对全局都加上 1r/s 的限制了么,感觉不太对啊。

另外我在看 nginx.conf 的时候发现 gzip 模块居然默认是开的,但是我反向代理的时候返回的请求从来没被压缩过。。这是怎么回事
wakzz
2021-02-17 13:38:27 +08:00
```
http {
# 区域名称为 limit_ip,大小为 10m,同一个请求 IP 限流为每秒 1 次请求
limit_req_zone $binary_remote_addr zone=limit_ip:10m rate=1r/s;
# 设置拒绝请求或延迟处理请求的日志级别
limit_req_log_level error;
# 设置拒绝请求的响应状态码
limit_req_status 503;
...

server {
...

# 仅登录接口做限流
location /login {
limit_req zone=limit_ip nodelay;
...
}

# 其余接口不做限流
location ... {
...
}
}
}
```
LeeReamond
2021-02-18 18:11:24 +08:00
@wakzz 感谢回复,已经配置成功,不过想问一下这个是不是还是基于秒内请求的配置,因为我设置了 10r/m 以后,得到的结果并不是一分钟以内访问 10 次就会被 ban,而是每 6 秒访问一次就会被 ban,感觉不是很符合需求啊。因为正常用户也会偶尔一下子多开几个网页,我希望可接受范围内的次数都能正常访问不受影响,他这个好像只要连续开第二个网页一定会 503 的样子
wakzz
2021-02-19 19:51:10 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX