首页 > 解决方案 > 将 NGINX 配置为仅允许一个唯一的 ip 每天执行 5 个 POST 请求

问题描述

我有一个网站,允许用户将他们的邮政编码转换为他们的街道地址、城市和其他一些信息。这是一个面向最终用户而非公司的网站。但是,自上周以来,我收到了来自几个 IP 的大量请求(每天 1000 次左右),经过一些调试后,它们似乎(ab)将我的网站用于商业目的。

我希望我的 NGINX 每天只允许来自唯一 IP 的 5 个 POST 请求,除非这些请求来自我自己的 IP(办公室和家庭 IP)。我可以接受没有限制的 GET 请求。另外,我只希望这适用于这个特定的虚拟主机,而不是我的整个 nginx 配置。我应该如何进行?这甚至可能吗?

标签: nginxnginx-config

解决方案


Nginx 不允许速率限制低于每分钟 1 个请求。但是,您可以使用这个自定义版本的 nginx,它似乎具有您想要的功能。有了它,您可以执行以下操作:

limit_req_zone $binary_remote_addr zone=zonepost:10m rate=1r/d; # limit to 1 request per day

然后在您的位置,您可以使用 anif检查请求方法是否为getorpostlimit_req相应地应用。例如,您可以有第二个限制较少的区域并像这样配置它:

limit_req_zone $binary_remote_addr zone=zonepost:10m rate=5r/d; # limit 5 per day
limit_req_zone $binary_remote_addr zone=zoneget:10m rate=10r/s; # limit 10 per sec

server {
    location / {
         # Select the right zone (limit)
               if( $request_method = get ) {
                  set $zone "zoneget";
               }
               if( $request_method = post ) {
                  set $zone "zonepost";
               }
               limit_req zone=$zone;
         # Do other stuff...
    }
}

有关手册,请参阅nginx.com 上的此页面


推荐阅读