我有这个简单的 Nginx 配置:
server {
listen 80;
server_name example.com;
rewrite ^(.*) http://www.example.com$1 permanent;
}
server {
listen 80;
server_name www.example.com;
access_log /var/log/nginx/www.example.com.access.log;
error_log /var/log/nginx/www.example.com.error.log;
root /var/www/example.com/;
location / {
index index.html index.php;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/example.com/$fastcgi_script_name;
}
}
现在是防止洪水攻击(dos)的时候了。我想实现这两条规则:
1)我会每秒拦截超过 3 个请求PHP 请求。
例子:
www.example.com/page.php
www.example.com/page.php
www.example.com/page.php
www.example.com/page.php (blocks it stop if it is within the second)
2)我会每秒阻止超过 3 个针对同一资源的请求
www.example.com/img.jpg
www.example.com/img.jpg
www.example.com/img.jpg
www.example.com/img.jpg (blocks it stop if it is within the second)
我的目标是完全阻止请求,我这么说是因为我看到了节点延迟param 返回 503 给攻击者。在这种情况下,如果达到限制,我肯定知道这是一次攻击,所以我想阻止响应。“阻止”的意思是我不想发送 503 消息,我希望 NGINX 断开连接而不发送任何内容。
我该如何优化此配置来实现这些规则?
谢谢。
答案1
nginx 有HttpLimitReq模块模块可用。您可以定义不同的区域和允许的访问模式。如果用户超出允许的访问次数,则返回 503。