我在请求限制配置之前有一些“拒绝”规则。如果被阻止的用户(根据拒绝规则)正在访问网站,他仍然会触发请求限制,因此会创建数千个日志条目。为什么?我预计它不会超出拒绝规则。
include /etc/nginx/blacklist.conf;
limit_req zone=limit burst=3 nodelay;
日志显示一个禁止错误,之后是数百个请求限制错误。这种情况一遍又一遍地重复。
答案1
当 nginx 处理请求时,它会经过几个阶段。 他们之中 :预访问和使用权階段。
预访问通常是 wherelimit_req
工作,而 access 是allow
/deny
指令工作的地方。这意味着速率限制已完成前如果两个指令都在同一上下文中声明,则进行 IP 过滤。
因此,如果您想尝试使用本机指令直接在 nginx 中运行一些类似 fail2ban 的进程(考虑到您的其他问题返回代码 444),这本质上是不可能的。
答案2
这个问题有点老了,但对于任何有这个问题的人来说,我发现最好的解决方案是使用带有map
而if
不是deny
规则(虽然我尽量避免使用ifs
在 nginx 中使用),因为像泽维尔·卢卡斯说:
在 IP 过滤之前进行速率限制
您可以blacklist.conf
从以下位置更改文件:
deny 1.2.3.4;
到:
1.2.3.4 0;
创建文件whitelist.conf
:
if ( $whitelist = 0 ) {
return 403;
}
然后,在 中nginx.conf
包含一个映射,将 中的所有 IP 列入白名单,但 中的 IP 除外blacklist.conf
:
http {
geo $whitelist {
/etc/nginx/blacklist.conf;
default 1;
}
...
}
最后,同样在nginx.conf
每个服务器指令之前添加文件whitelist.conf
:
server {
server_name ...;
listen 443 ssl;
include /etc/nginx/whitelist.conf;
ssl_certificate /etc/ssl/bundle.crt;
ssl_certificate_key /etc/ssl/server.key;
...
}
...
来自黑名单 IP 的请求将被立即返回并且不会记录在错误日志文件中。
您还可以使用以下命令阻止来自这些 IP 的请求记录在访问日志文件中:
access_log /path/to/file if=$whitelist;