如何实施超长费率限制?

时间:2017-12-15 05:32:37

标签: nginx

对于我的大多数网站,我的正常速率限制为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"

2 个答案:

答案 0 :(得分:1)

您链接的文章的引用:

  

在源代码审核之后,我找到了一种方法,可以将最低费率降低到每天86个请求。下面的补丁增加了使用下一个配置指令的能力:

从中可以学到两件事:

  1. 您需要修补Nginx的源代码,以使文章中的方法起作用。
  2. 即使有补丁,您也只能将其降低到86个请求/天。
  3. 因此,我们可以得出结论,单凭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地址到速率受限的资源。