对于我的大多数网站,我的正常速率限制为1请求/秒:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
我现在需要每天限制10个特定地点。这可能吗?
limit_req_zone $binary_remote_addr zone=loginmin:10m rate=1tth;
我得到:无效率"率= 1tth"
答案 0 :(得分:1)
您链接的文章的引用:
在源代码审核之后,我找到了一种方法,可以将最低费率降低到每天86个请求。下面的补丁增加了使用下一个配置指令的能力:
从中可以学到两件事:
因此,我们可以得出结论,单凭Nginx目前无法实现您所寻找的目标。
我的建议是为此目的使用fail2ban
。您可以创建自定义jail:
# /usr/local/etc/fail2ban/jail.d/nginx-extreme-ratelimit.local
[nginx-extreme-ratelimit]
enabled = true
filter = nginx-ratelimit
action = pf <-- or ufw, ipfilter, ipfw, whatever firewall you use
logpath = /var/log/nginx-access.log
findtime = 86400
maxretry = 10
bantime = 86400
以及相应的自定义过滤器:
# /usr/local/etc/fail2ban/filter.d/nginx-ratelimit.conf
[Definition]
failregex = ^\s*\[error\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone "(?:%(ngx_limit_req_zones)s)", client: <HOST>,
ignoreregex =
datepattern = {^LN-BEG}
显然必须调整failregex
以匹配访问字符串。
此外,设置一个每天下午12点运行的cron作业来取消IP地址:
00 00 * * * /usr/local/bin/fail2ban-client set nginx-extreme-ratelimit unbanip 1.2.3.4
答案 1 :(得分:0)
使用nginx-mod,您只需输入:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/d;
当然,使用此配置,您的流量应该足够小(〜少于16万名访问者的限速资源)。
或者,您需要将区域的内存大小调整为足够大,以在24小时内容纳所有访问者IP地址到速率受限的资源。