nginx - 将 NGINX 配置为仅允许一个唯一的 ip 每天执行 5 个 POST 请求
问题描述
我有一个网站,允许用户将他们的邮政编码转换为他们的街道地址、城市和其他一些信息。这是一个面向最终用户而非公司的网站。但是,自上周以来,我收到了来自几个 IP 的大量请求(每天 1000 次左右),经过一些调试后,它们似乎(ab)将我的网站用于商业目的。
我希望我的 NGINX 每天只允许来自唯一 IP 的 5 个 POST 请求,除非这些请求来自我自己的 IP(办公室和家庭 IP)。我可以接受没有限制的 GET 请求。另外,我只希望这适用于这个特定的虚拟主机,而不是我的整个 nginx 配置。我应该如何进行?这甚至可能吗?
解决方案
Nginx 不允许速率限制低于每分钟 1 个请求。但是,您可以使用这个自定义版本的 nginx,它似乎具有您想要的功能。有了它,您可以执行以下操作:
limit_req_zone $binary_remote_addr zone=zonepost:10m rate=1r/d; # limit to 1 request per day
然后在您的位置,您可以使用 anif
检查请求方法是否为get
orpost
并limit_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 上的此页面。
推荐阅读
- reactjs - Reat Material-Table: CellStyle 以访问完整的 rowData 信息,而不仅仅是字段
- python - 更改烧瓶导航栏的背景颜色和文本颜色
- algorithm - 树递归 - 打印给定数字的子序列
- python - 如何遍历时间列表,找到跳过/丢失的时间,然后填写该时间?
- postgresql - Timescale db - 单个 Postgres 表上的多个超表
- r - 如何避免为大型数据集编写嵌套的 for 循环?
- azure - 如何从 api 范围将范围添加到 id 令牌
- reactjs - 即使 screen.debug() 显示文本存在,React 测试库也无法找到文本
- sylius - 无法通过引导主题结帐时的送货地址步骤
- xcode - 在 .sks 文件中复制和粘贴 SpriteNode 时阻止 Xcode 崩溃?