我们使用 NGINX 作为同一网络上使用 Apache 的其他服务器的代理服务器+负载平衡器。
为了安全起见,我们希望对每个 IP 应用速率限制,这样如果一秒钟内有超过 100 个请求,或者在短时间内对同一页面的请求超过 100 个,源 IP 就会被阻止一段时间。
我们的另一个想法是,如果 IP 在短时间内触发超过 100 个请求,而所有请求都返回 404、403 或 500 代码,则该 IP 也会被阻止。
使用 Apache 日志 + fail2ban 和 mod_evasive,我们能够做一些非常类似的事情。但使用 Nginx 时我们做不到,我们尝试应用速率限制的基本规则,但在达到限制之前我们已经遇到了阻止错误。
当用户达到限制时,我们使用下面的设置来配置此块。
limit_req_zone $binary_remote_addr zone=one:10m rate=200r/s;
limit_req zone=one burst=20;
实际情况是,即使用户在第一次访问时发出了 97 个 AJAX 请求,Nginx 也会阻止这些请求,如下面的日志所示:
2022/07/19 11:10:37 [error] 8494#8494: *1698 limiting requests, excess: 20.600 by zone "one", client: [USER-IP], server: example.com, request: "GET /views/components/page-1.html HTTP/1.1", host: "example.com", referrer: "https://example.com/dash.html"
2022/07/19 11:10:37 [error] 8495#8495: *1699 limiting requests, excess: 20.600 by zone "one", client: [USER-IP], server: example.com, request: "GET /views/components/page-2.html HTTP/1.1", host: "example.com", referrer: "https://example.com/dash.html"
2022/07/19 11:10:37 [error] 8495#8495: *1702 limiting requests, excess: 20.800 by zone "one", client: [USER-IP], server: example.com, request: "GET /views/components/page-3.html HTTP/1.1", host: "example.com", referrer: "https://example.com/dash.html"
我们如何在 NGINX 服务器上进行这些设置?