Как я могу ограничить общую пропускную способность пользователей на нескольких веб-серверах и соединениях?

У меня есть веб-сервис, где пользователи загружают файлы, туннелированные через обратные прокси-серверы apache2.

Я использую мод rewrite и флаг P в сочетании с rewrite map.

В основном это выглядит так:

<Location /my-identifier>
    RewriteEngine on
    RewriteRule /my-identifier/(.*) ${my-rewrite-map:$1} [P]
</Location>

Я знаю, что могу ограничить пропускную способность одного соединения или даже одного IP-адреса на сервер, используя mod_bandwidth или что-то подобное.

Однако я хочу, чтобы ограничение действовало только для определенных пользователей (а именно для тех, кто делает много трафика и превышает объемы добросовестного использования).

Я также хочу, чтобы он распространялся на несколько серверов.

Я могу установить пользовательскую переменную среды, если это поможет (у меня есть полный контроль над URL-адресом, в который я могу его закодировать, и я могу установить его с помощью правила перезаписи)!

В основном то, что я хочу, это, например, чтобы пользователь, достигший своего предела, получил скорость только 5 Мбит / с, независимо от того, сколько соединений он использует или к скольким серверам он подключается.

Это как-то возможно? Модуль есть?

Моя идея была бы централизованным хранилищем данных, куда серверы сообщают о своей статистике трафика по IP. Вероятно, какая-то структура данных RRD. Затем они могут выбрать трафик для IP-адреса за указанный интервал времени (например, за последние 60 секунд) и применить в соответствии с ним коэффициент дросселирования.

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


person The Surrican    schedule 18.08.2012    source источник


Ответы (1)


Я не знаю об Apache, но поскольку вы указали Nginx в качестве тега, как насчет чего-то вроде подхода ниже?

Настройте Nginx в качестве обратного прокси-сервера для ваших серверов Apache или веб-сервисов с более или менее следующей конфигурацией:

upstream serverlist {
  server www1.example.com;
  server www2.example.com;
  server www3.example.com;
}

location / {
  proxy_pass http://serverlist;
}

Требование «общие соединения», которое у вас есть, не может быть отображено напрямую, но вы, вероятно, можете приблизиться к тому, что хотите, с помощью комбинации следующих директив, добавленных в блок местоположения:

  • limit_rate это за соединение
  • limit_con позволяет ограничить количество соединений.
  • limit_req позволяет ограничить количество запросов в секунду и допустимые пакеты.
  • limit_zone устанавливает зону для ваших ограничений

ОБНОВЛЕНИЕ: Существует сторонний модуль Nginx, ограничивающий общую скорость для каждого IP-адреса, который можно найти здесь< /а>.

person cobaco    schedule 18.08.2012