Для обмеження кількості запитів (Rate Limiting) від конкретних ботів у Nginx використовується модуль ngx_http_limit_req_module. Цей підхід дозволяє «притормозити» агресивних роботів (наприклад, MJ12bot або Facebook), захищаючи сервер від перевантажень, але не блокуючи їх повністю.

Налаштування виконується у два етапи: створення зони обмеження та її застосування.

Крок 1. Створення зони обмеження (у блоці http)

Відкрийте головний конфігураційний файл nginx.conf і всередині блоку http додайте код, який виділятиме ботів в окрему групу та задаватиме для них ліміт (наприклад, 2 запити на секунду):

Nginx
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 /) активуйте створену зону:

Nginx
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

Обов’язково перевірте коректність синтаксису:

ShellSession
sudo nginx -t

Якщо перевірка успішна, оновіть конфігурацію сервера:

ShellSession
sudo systemctl reload nginx

Як це працює:

  • Звичайні відвідувачі сайту та корисні пошукові роботи (наприклад, Googlebot) не підпадають під це правило. Для них змінна $bot_ip залишається порожньою, і Nginx їх не обмежує.
  • Якщо MJ12bot, Facebook чи інші вказані роботи почнуть звертатися до сайту частіше ніж 2 рази на секунду, Nginx миттєво поверне їм помилку 429, повністю розвантаживши PHP та базу даних вашого WordPress.
Show CommentsClose Comments

Leave a comment