Я запускаю сайт Wordpress с Nginx, MariaDB, PHP-FPM и меня засыпают множеством разных запросов 404 с большого количества IP (~ 10.000 разных IP в час, запрашивающих случайный URL, что приводит к очень высокой нагрузке SQL и случайному времени простоя ).
Я попытался разместить основной сервер за другим сервером Nginx, который будет выполнять обратное прокси-кеширование сайта для снижения нагрузки, но главный сервер по-прежнему получает очень высокую нагрузку из-за того, что 404 запроса проходят через кэширующий прокси-сервер Nginx.
Сервер теперь делает ошибку 5XX, потому что MYSQLD берет на себя весь процессор для обработки своих материалов, поэтому PHP-FPM голодает и не отвечает на запрос Nginx, я думаю?
Я получаю много такого в журнале ошибок:
2017/05/13 03:48:40 [error] 24894#24894: *2936187 upstream timed out (110: Connection timed out) while connecting to upstream
Мой сервер с 16 ядрами, 64 ГБ ОЗУ и 200 ГБ SSD-диска, работающий под управлением Ubuntu 17.04 и MYSQLD, всегда использует весь ЦП, насколько это возможно.
Конфигурация моего основного сервера Nginx:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 2048;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 32M;
disable_symlinks off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip off;
### START SERVER CONFIG
server {
listen 80 default_server;
root /var/www/html;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server_name _;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
location ~ /\.ht {
deny all;
}
}
### END OF SERVER CONFIG
}
Конфигурация PHP-FPM:
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.allowed_clients = 127.0.0.1
process.priority = -10
pm = dynamic
pm.max_children = 64
pm.start_servers = 32
pm.min_spare_servers = 2
pm.max_spare_servers = 32
Могу ли я как-нибудь исправить ситуацию? Как я уже сказал, все запросы поступают с множества разных IP-адресов, запрашивающих другой URL-адрес с очень законным запросом (заголовок выглядит в точности как браузер), поэтому я не могу создать какие-либо правила брандмауэра для его блокировки, но я знаю, что они ' re автоматический запрос, так как есть некоторый пользовательский агент, говорящий, что он исходит из архитектуры IA64, чего ни у кого из моих посетителей нет.
И нет, я не могу использовать Cloudflare или аналогичные службы для предотвращения автоматического запроса по какой-то причине ... Так есть ли какой-либо плагин Nginx, чтобы определить, является ли это реальной загрузкой браузера или бота, путем тестирования javascript или аналогичного метода, прежде чем он разрешит ввод сайт?
Сначала я изучал поступающие запросы. Это действительно атаки или в вашем приложении много неработающих ссылок? Если вы можете исправить причину, это всегда лучше.
Fail2Ban - это тоже то, что я бы порекомендовал, хотя это не принесет особого результата, если каждый IP-адрес выполняет только один запрос.
Тем не менее, вы захотите избежать 404 для достижения Wordpress / PHP / MySQL. Если в запросе есть какой-либо шаблон, по которому вы можете сопоставить, веб-сервер может его обработать. Если нет четкого шаблона, это сложнее, но все же можно сделать.
Эти инструкции для MySQL можно адаптировать для Nginx:
https://www.pipeten.info/2015/10/better-handling-wordpress-404-errors/
Но что может быть даже лучше, так это Repsheet.
Это может помочь определить, нужен ли вам запрос, и обработать его по-разному. Эти IP-адреса, выполняющие случайные ошибки 404, явно не имитируют нормальное поведение пользователя. Repsheet сможет сказать это после некоторого обучения, а затем вы сможете выдать 404 или 403, прежде чем он попадет в полный стек.
В Repsheet есть модуль для Nginx: https://github.com/repsheet/repsheet-nginx
Наоборот, он узнает ваших настоящих (повторных) пользователей как хороших участников, и вы сможете установить правила для определения их приоритетов.
Наконец, поскольку большинство HTTP-ботов довольно глупы, вы можете использовать модуль Test Cookie для Nginx, чтобы проверить, является ли это настоящим пользовательским агентом или нет:
https://github.com/kyprizel/testcookie-nginx-module
(Но будьте осторожны, блокируя хороших ботов, таких как Google, не убивайте SEO, занесите их в белый список!)