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

Я запускаю сайт Wordpress с Nginx, MariaDB, PHP-FPM и меня засыпают множеством разных запросов 404 с большого количества IP (~ 10. 000 различных IP-адресов в час, запрашивающих случайный URL-адрес, что приводит к очень высокой загрузке SQL и случайному простою).

Я попытался разместить главный сервер за другим сервером Nginx, который будет выполнять обратное кэширование прокси сайта для уменьшения нагрузки, но главный сервер по-прежнему получает очень высокую нагрузку из-за того, что прокси-сервер кэширования Nginx передал 404 запроса.

Сервер теперь выдает ошибку 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-адрес с очень законным запросом (заголовок выглядит точно как браузер), поэтому я не могу создать какие-либо правила брандмауэра для его блокировки, но я знаю, что это автоматический запрос, поскольку есть какой-то пользовательский агент, говорящий, что он исходит из архитектуры IA64, что ни у кого из моих посетителей нет.

И нет, я не могу использовать Cloudflare или аналогичные службы для предотвращения автоматического запроса по какой-то причине ... Так есть ли любой плагин Nginx, чтобы определить, загружен ли он реальным браузером или ботом, протестировав javascript или аналогичный метод, прежде чем разрешить ему войти на сайт?

0
задан 13 May 2017 в 05:36
1 ответ

Сначала я изучал входящие запросы. Это действительно атаки или в вашем приложении много неработающих ссылок? Если вы можете исправить причину, это всегда лучше.

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, занесите их в белый список!)

0
ответ дан 5 December 2019 в 08:10

Теги

Похожие вопросы