Часто владельцы сайтов на WordPress сталкиваются с проблемой перегрузки сервера из-за большого количества входящих запросов. Это может быть вызвано ботами, сканерами, или даже легитимным, но слишком частым обращением пользователей. В статье расскажем, как установить ограничение на количество входящих запросов, чтобы защитить сайт от перегрузок и атак типа DoS.
Зачем ограничивать входящие запросы в WordPress
Ограничение количества запросов помогает:
- Снизить нагрузку на сервер и ускорить работу сайта;
- Предотвратить атаки типа DoS и DDoS;
- Уменьшить риск блокировки хостингом из-за превышения лимитов;
- Защитить от ботов, которые злоупотребляют ресурсами.
Без ограничений злоумышленники могут отправлять десятки и сотни запросов в секунду, что приводит к падению производительности или даже остановке сайта.
Способы ограничения запросов в WordPress
1. Использование плагинов
Самый простой способ — воспользоваться готовыми плагинами:
- WP Limit Login Attempts — ограничивает попытки входа в админ-панель;
- Wordfence Security — комплексный плагин с функцией ограничения запросов и защитой от ботов;
- Rate Limiting by WPShop — специализированный плагин для ограничения запросов с гибкими настройками.
Например, Wordfence позволяет задать максимальное количество запросов с одного IP за минуту и автоматически блокирует подозрительные адреса.
2. Ограничение через .htaccess
Если хостинг использует Apache, ограничить количество запросов можно на уровне сервера, добавив правила в файл .htaccess. Например:
SetEnvIfNoCase Request_URI "wp-login\.php" bad_bot=1
Order Allow,Deny
Allow from all
Deny from env=bad_bot
Но для более точного контроля стоит использовать модуль mod_evasive, который может блокировать IP при превышении лимита запросов.
3. Реализация ограничения через код в functions.php
Если нужен кастомный и легкий способ, можно реализовать ограничение запросов через код в теме или плагине. Ниже приведён пример функции wpcourse_limit_requests(), которая блокирует IP, если количество запросов за минуту превышает 30.
function wpcourse_limit_requests() {
$ip = $_SERVER['REMOTE_ADDR'];
$transient_key = 'wpcourse_req_count_' . md5($ip);
$count = (int) get_transient($transient_key);
if ($count >= 30) {
wp_die('Слишком много запросов. Попробуйте позже.');
}
set_transient($transient_key, $count + 1, 60); // храним счетчик 60 секунд
}
add_action('init', 'wpcourse_limit_requests');Этот код использует transient API WordPress для хранения количества запросов от каждого IP за последнюю минуту. Если лимит превышен, пользователь получает сообщение об ошибке.
Преимущества и недостатки каждого метода
Плагины
Удобны для новичков, имеют готовые интерфейсы и дополнительные функции безопасности. Недостаток — увеличивают нагрузку на сайт и могут конфликтовать с другими плагинами.
.htaccess и серверные настройки
Работают на уровне сервера, не нагружают PHP. Но требуют доступа к конфигурации хостинга и навыков администрирования. Не всегда доступны на общем хостинге.
Код в functions.php
Легко кастомизировать под свои задачи, не требует дополнительных плагинов. Однако ограничен по возможностям и может быть менее эффективным при большом трафике.
Рекомендации по внедрению
Для большинства сайтов оптимальным будет комбинирование методов:
- Используйте плагин Wordfence или аналогичный для базовой защиты и мониторинга.
- При возможности настройте mod_evasive на сервере для защиты на уровне Apache.
- Добавьте кастомный код, если нужны особые правила и гибкость.
Также рекомендуем регулярно проверять логи сервера и анализировать подозрительный трафик.
Пример интеграции с WPGPT для уведомлений о превышении лимита
Если вы используете плагин WPGPT, можно настроить автоматическую отправку уведомлений администратору при превышении лимита запросов:
function wpcourse_notify_admin_on_limit($ip) {
if (function_exists('wpgpt_send_message')) {
$message = "Внимание! IP $ip превысил лимит запросов на сайте.";
wpgpt_send_message(array(
'to' => get_option('admin_email'),
'message' => $message,
'subject' => 'Превышение лимита запросов'
));
}
}
function wpcourse_limit_requests_with_notify() {
$ip = $_SERVER['REMOTE_ADDR'];
$transient_key = 'wpcourse_req_count_' . md5($ip);
$count = (int) get_transient($transient_key);
if ($count >= 30) {
wpcourse_notify_admin_on_limit($ip);
wp_die('Слишком много запросов. Попробуйте позже.');
}
set_transient($transient_key, $count + 1, 60);
}
add_action('init', 'wpcourse_limit_requests_with_notify');Такой подход поможет оперативно реагировать на подозрительный трафик и защищать сайт.