Для обмеження кількості запитів (Rate Limiting) від конкретних ботів у Nginx використовується модуль ngx_http_limit_req_module. Цей підхід дозволяє «притормозити» агресивних роботів (наприклад, MJ12bot або Facebook), захищаючи сервер від перевантажень, але не блокуючи їх повністю.
Налаштування виконується у два етапи: створення зони обмеження та її застосування.
Крок 1. Створення зони обмеження (у блоці http)
Відкрийте головний конфігураційний файл nginx.conf і всередині блоку http додайте код, який виділятиме ботів в окрему групу та задаватиме для них ліміт (наприклад, 2 запити на секунду):
http {
# 1. Перевіряємо User-Agent і записуємо IP-адресу лише ботів у змінну $bot_ip
map $http_user_agent $bot_ip {
default "";
~*facebookexternalhit $remote_addr;
~*Meta-ExternalAgent $remote_addr;
~*Amazonbot $remote_addr;
~*MJ12bot $remote_addr;
}
# 2. Створюємо зону пам'яті для лімітів.
# rate=2r/s означає максимум 2 запити на секунду для кожної IP-адреси зі змінної $bot_ip
limit_req_zone $bot_ip zone=bot_limit_zone:10m rate=2r/s;
# (Опціонально) Змінюємо стандартний код помилки з 503 на 429 (Too Many Requests)
limit_req_status 429;
}
Крок 2. Застосування ліміту до сайту (у блоці server)
Відкрийте конфігураційний файл вашого сайту (наприклад, у папці /etc/nginx/sites-available/) і всередині блоку server (або всередині конкретного location /) активуйте створену зону:
server {
listen 80;
server_name yoursite.com;
location / {
# Застосовуємо ліміт для ботів
# burst=5 дозволяє короткочасний сплеск до 5 запитів, надлишок буде відхилено
# nodelay означає, що надлишкові запити одразу скидатимуться з помилкою 429
limit_req zone=bot_limit_zone burst=5 nodelay;
# Ваші стандартні налаштування обробки WordPress / PHP
try_files $uri $uri/ /index.php?$args;
}
}
Крок 3. Перевірка та перезапуск Nginx
Обов’язково перевірте коректність синтаксису:
sudo nginx -tЯкщо перевірка успішна, оновіть конфігурацію сервера:
sudo systemctl reload nginxЯк це працює:
- Звичайні відвідувачі сайту та корисні пошукові роботи (наприклад, Googlebot) не підпадають під це правило. Для них змінна
$bot_ipзалишається порожньою, і Nginx їх не обмежує. - Якщо MJ12bot, Facebook чи інші вказані роботи почнуть звертатися до сайту частіше ніж 2 рази на секунду, Nginx миттєво поверне їм помилку
429, повністю розвантаживши PHP та базу даних вашого WordPress.