初学 Nginx,很多东西不是很懂,百度搜了一下没有类似解决方案。
想要实现的效果是用 NGinx 限制单个 IP 对登录 api 的调用次数,比如每 30 分钟里最多访问五次之类的。类似于 fail2ban,但是不用判断成功与否,到次数都一律屏蔽就对了。百度搜到的大多是每秒钟访问多少次的限制说明,感觉不是很符合需求
1
Phant0m 2021-02-16 02:08:30 +08:00 via iPhone
有限速模块 ngx_http_limit_req_module
或者 ngx lua 自己写一个 |
2
wakzz 2021-02-16 12:52:54 +08:00
ngx_http_limit_req_module 满足楼主的需求
|
3
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 模块居然默认是开的,但是我反向代理的时候返回的请求从来没被压缩过。。这是怎么回事 |
4
wakzz 2021-02-17 13:38:27 +08:00 1
```
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 ... { ... } } } ``` |
5
LeeReamond 2021-02-18 18:11:24 +08:00
@wakzz 感谢回复,已经配置成功,不过想问一下这个是不是还是基于秒内请求的配置,因为我设置了 10r/m 以后,得到的结果并不是一分钟以内访问 10 次就会被 ban,而是每 6 秒访问一次就会被 ban,感觉不是很符合需求啊。因为正常用户也会偶尔一下子多开几个网页,我希望可接受范围内的次数都能正常访问不受影响,他这个好像只要连续开第二个网页一定会 503 的样子
|
6
wakzz 2021-02-19 19:51:10 +08:00
|