Всем привет! Владею высоконагруженной онлайн-платформой, написанной на OctoberCMS. Программное обеспечение LEMP (Linux, Nginx, MySQL, PHP).

Проблема: из-за особенностей платформы невозможно адекватно использовать NGINX модуль limit_req.
Задача: собрать все фоновые AJAX запросы с использованием JavaScript API в одном URL вида https://domain.com/ajax

Описание: На данный момент я использую VDS и для защиты от DDoS атак арендую прокси-сервер у стороннего сервиса. Планирую перейти на выделенный сервер, отказаться от услуг DDoS защиты партнеров в пользую собственной настройки NGINX + Lua (Openresty) - т.е. защиты на стороне веб-сервера.
Изучив в консоли разработчика браузера вкладку Network, где указаны выполненные в процессе загрузки веб-сайта запросы к серверу, обнаружил, что все AJAX запросы идут на текущий URL. Т.е. на какой странице находишься - туда и пойдет.
Особенность платформы в том, что клиент создает себе настоящий онлайн-магазин (по шаблону), который доступен по адресу *.domain.com. Код магазина недоступен моим клиентам, он хранится на сервере. Сервис позволяет привязать к созданному интернет-магазину кастомный домен, который клиент заранее приобрел, путем установки А-записи в настройках DNS.
Платформа предоставляет каталог плагинов и виджетов, которые запускаются в магазине посредством фоновых AJAX запросов с использованием JavaScript API. Таким образом при переходе в магазин может отправиться на сервер одновременно 2-10 AJAX запросов.
Мне необходимо разделить основной поток запросов и параллельные AJAX запросы, чтобы адекватно настроить модуль limit_req на каждый из них.

  • reazzon ответили на это сообщение.

    Доброго дня!

    К сожалению употребление "Высоконагруженный сервис" и "Защиты на стороне веб сервера" не очень корректны.

    Во-первых: Учитывая, что вы все еще на VDS и проект реализован как standalone, а запросы выполняются по Ajax - понимание об высокой нагрузке у нас разное, однако высокая нагрузка это не только запросы, это вся фоновая активность проекта. Если у вас высоконагруженный проект висит на VDS со всем "фаршем", то это скорее среднестатистический проект, по крайней мере на данный момент.

    Во-вторых: DDoS - это распределенная атака суть которой вывести из строя ПО/Железо жертвы тем самым приведя проект в не рабочее состояние. У данной атаки существует много уровней и достаточно типов, и к сожалению модуль limit_req, тем более на одном сервере с проектом не эффективен. Предназначение модуля совсем другое, он необходим чтобы ограничить скорость обработки запросов по заданному ключу или, как частный случай, скорость обработки запросов, поступающих с одного IP-адреса, да он может защитить от HTTP Flood атаки, но это самая примитивная атака. Т.е. защищать сервер на стороне веб сервера на том же сервере - как защищать голову каской при ударах битой... Содержимое головы в любом случае содрогнётся и сотрясение будет получено, другой вопрос во что выльется вам это "сотрясение".

    Использование прокси-сервера один из основных на данный момент способов защиты от DDoS, который позволяет в случае атаки отсечь ее на внешнем сервере минимизировав ее последствия на сервере самого приложения. Если вы все-таки хотите отказаться от услуг стороннего прокси провайдера который сейчас предоставляет вам защиту, вы можете поступить следующим образом:

    1. Арендовать отдельный VPS/VDS сервер
    2. Установить nginx + iptables
    3. Настроить обратный прокси (reverse proxy) на сервер проекта
    4. Настроить модули limit_req
    5. Закрыть все порты которые не требуются для работы, в идеале оставить 80,443 порты.
    6. Избегать публикации оригинального IP адреса приложения, все запросы, по крайней мере HTTP должны происходить ТОЛЬКО через проксирующий сервер.

    Из плюсов, в период роста нагрузки на проекте, вы сможете прокси сервер переквалифицировать в балансировщик и балансировать нагрузку с его помощью, так же прокси сервер будет отсекать большинство других типов DDOS атак - SYN, UDP, ICMP.

    Если по теме, отделить AJAX запросы вы можете на уровне все того же веб сервера путем проверки $http_x_requested_with

    • reazzon ответили на это сообщение.
    • ESt оценил это.

      DontFollow123 Чтобы произвести данное изменение - вам придется пройти через большие сложности.

      У вас есть несколько вариантов:

      1. Отредактировать framework.js, и перенаправить все URL на нужный вам.
      2. Переопределить все XHR запросы на уровне веб-сервера, как предложил LeMaX10
      3. Отказаться от использования фронтенд фреймворка октября, и построить все AJAX запросы вручную на нужный вам URL.

      Помните, как только вы перенаправите все AJAX запросы на один URL, вам придется перенести все обработчики так-же внутрь контроллера этого URL.