Назад | Перейти на главную страницу

Очень высокий процессор SQL на wordpress из-за запроса 404

Я запускаю сайт 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.

https://getrepsheet.com/

Это может помочь определить, нужен ли вам запрос, и обработать его по-разному. Эти 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, занесите их в белый список!)