我正在尝试使用NGINX创建一个有效的限速解决方案。当使用AJAX从控制台向API发出大量请求时,服务器将中断。
网站可用的mysite.com内容
limit_req_zone $binary_remote_addr zone=myzone:10m rate=5r/m;
server {
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name www.mysite.com mysite.com;
#include /etc/php/7.2/fpm/php-fpm.conf;
location / {
rewrite ^/$ /main/controllers/landing.php;
try_files $uri $uri/ =404;
limit_req zone=myzone burst=3;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
location ~ /main/models/api {
limit_req zone=myzone burst=5 nodelay;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
我运行的JavaScript触发AJAX
for(i=0; i<10000; i++){
runAJAXreq(1);
}
我预测在分钟内经过10个请求的示例后,它将返回503,但是它运行在20-30左右,然后返回大量500或504。当我运行for循环进行10,000个循环时100左右,则整个服务器将崩溃。我是要解决这个问题还是不了解NGINX的速率限制?我也将实际站点名称更改为mysite.com
我尝试了许多解决方案。最初,我尝试在API中实现速率限制,但这并不能减轻服务器上的负载。之后,我将服务器升级到更强大的版本(从1vCPU和1GB内存升级到4vCPU和8GB内存)。这些解决方案似乎都不起作用。
最终,我希望服务器可以拒绝对API的大量基本上是恶意的请求,但不会真正影响实际使用该网站的人(可以的一些错误)。谢谢您的宝贵时间。