Проблема с ограничением скорости, сбой сервера под давлением - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать эффективное решение для ограничения скорости с 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);
 }

Я предсказал, что он вернет 503 после того, как пример 10 запросов пройдет в минуту, но вместо этого он работает около 20-30, а затем возвращает большое число 500 или 504. Когда я запускаю цикл for вместо 10000 циклов 100 или около того, тогда весь сервер ломается. Я правильно понял или не понимаю ограничения скорости с NGINX? Я также изменил название сайта на mysite.com

Я пробовал много решений. Сначала я пытался реализовать ограничение скорости в API, но это не уменьшило нагрузку на сервер. После этого я обновил сервер до более мощной версии (от 1vCPU с 1 ГБ памяти до 4vCPU с 8 ГБ памяти). Похоже, ни одно из этих решений не сработало.

В конечном счете, я хотел бы, чтобы сервер мог отклонять большое количество в основном вредоносных запросов к API, но не влиял бы на кого-то, кто фактически использует сайт (с некоторой ошибкой все в порядке). Спасибо за ваше время.

...