Ограничить пропускную способность для каждого IP-адреса по значению из заголовка HTTP

У меня есть сайт для скачивания файлов. Я ищу ограничение пропускной способности для каждого IP (!). Лимит должен устанавливаться динамически с помощью HTTP-заголовка из бэкенда.

Моя текущая реализация использует X-Accel-Limit-Rate (я могу изменить этот заголовок, он нигде жестко не запрограммирован), но ограничивает только текущее соединение/запрос.

Осуществима ли моя идея в G-Wan?


person Misiek    schedule 29.05.2014    source источник


Ответы (1)


Да, это можно сделать.

Напишите обработчик G-WAN для извлечения HTTP-заголовка X-Accel-Limit-Rate. Затем примените эту политику с помощью вызова API throttle_reply() G-WAN, здесь.

Доступный пример под названием throttle.c может помочь вам в дальнейшем.

Функция throttle_reply() G-WAN позволяет применять регулирование на глобальной основе или для каждого соединения, поэтому вы просто применяете соответствующие значения регулирования для любого IP addresses или authenticated users, в зависимости от ваших потребностей.

throttle_reply() может изменять скорость загрузки динамически в течение срока службы каждого подключения, поэтому вы можете замедлять старые подключения и создавать новые с адаптивной скоростью загрузки.

Конечно, это может быть применено к IP-адресу каждого клиента (или к файлу cookie, или даже к записи AS поставщика услуг Интернета/центра обработки данных), чтобы справляться с огромными рабочими нагрузками.

person Gil    schedule 30.05.2014
comment
Я знаю throttle_reply(), но я действительно не понимаю/не знаю, как ограничить количество IP-адресов. Мне нужно что-то, чтобы предотвратить использование загрузчиками файлов слишком большой пропускной способности. Я могу ограничить одно соединение на скорости 10 КБ/с, но если пользователь откроет 10 соединений, он будет использовать 100 КБ/с. Мой вопрос заключается в том, как динамически замедлить все эти 10 соединений до 1 КБ/с. - person Misiek; 02.06.2014
comment
@Misiek Более простое решение, которое применяют другие сайты загрузки, — просто ограничить количество подключений, которые может установить клиент. Я думаю, мы можем использовать каталог IP: запишите IP-адрес клиента в HDL_AFTER_ACCEPT (или отклоните соединение, если IP-адрес клиента уже присутствует в каталоге IP), удалите его в HDL_AFTER_WRITE. - person Nagi; 03.06.2014
comment
Я знаю, что это проще, но я просто ищу ограничение пропускной способности для каждого IP-адреса. В настоящее время у меня есть ограничение на 2 соединения на IP-адрес, но это создает еще одну проблему. Теперь пользователь не может загрузить более 2 файлов с одного узла, потому что у него превышено ограничение на количество подключений. Вот почему я ищу ограничение пропускной способности для каждого IP :) - person Misiek; 04.06.2014
comment
@Misiek: throttle_reply() позволяет вам ДИНАМИЧЕСКИ ограничивать скорость для каждого подключения, чтобы вы могли снизить скорость загрузки людей, когда они открывают более одного подключения: просто отслеживайте IP-адреса, подключенные в данный момент, и увеличивайте/уменьшайте счетчик подключений. Затем разделите пропускную способность каждого клиента на количество подключений при использовании throttle_reply(). Это функция для каждого IP-адреса, которую вы ищете. - person Gil; 04.06.2014
comment
Можно ли получить бесплатный или платный пример? Мне не нужно ничего особенного, просто рабочий скрипт. Я сделал это в nginx lua, но, на мой взгляд, это неэффективно с точки зрения памяти. - person Misiek; 22.06.2014
comment
Сколько времени может пройти, чтобы получить от них ответ? - person Misiek; 25.06.2014
comment
Судя по всему, не так уж и долго. Чтобы получить ответ, полезно отправить электронное письмо. В наших логах такого не было. Попробуйте отправить электронное письмо Пьеру напрямую, а не использовать контактную форму (его адрес электронной почты находится на той же странице, что и контактная форма). - person Gil; 27.06.2014
comment
Я отправил сообщение 23.06 через контактную форму. Вы должны проверить, работает ли это :) Через секунду я отправлю сообщение напрямую. - person Misiek; 29.06.2014
comment
Мы получили ваше сообщение, на которое получен ответ. - person Gil; 30.06.2014
comment
Последний вопрос комментария. Скажет ли команда G-Wan, как использовать API G-Wan на языках, отличных от C? Я не собираюсь устанавливать дроссель_reply из Lua, но это null (неопределенная функция). Доступен ли API только из C? Я спрашиваю здесь, потому что я не могу не поддержать свой доход за 3 месяца... - person Misiek; 14.07.2014
comment
C API доступен для языковых сред выполнения, которые загружаются как модуль (C, C++, C#, D, Java, Objective-C, PH7 и т. д.), выполняя свой код в пространстве памяти G-WAN. Другие языки запускаются как CGI, внешний процесс, и поэтому должны использовать свои собственные библиотеки и могут взаимодействовать с G-WAN только через переменные CGI. Хотя Lua и некоторые другие языки теоретически могут использоваться в качестве модуля, пока никто не спонсировал разработку. [Поскольку этот ответ слишком длинный, я разделю его на 2 сообщения]. - person Gil; 16.07.2014
comment
G-WAN поддерживает 17 языков, мы не можем позволить себе исследовать интерфейс C каждого языка, поскольку большинство из них плохо документированы и часто содержат серьезные ошибки в многопоточных средах. - person Gil; 16.07.2014
comment
Я не буду платить за хорошее решение, но сейчас я начинаю с нескольких проектов, и, на мой взгляд, плата слишком велика. Мне нужен только один скрипт, а 140€ выглядит дорого. - person Misiek; 19.07.2014
comment
Затем найдите разработчика C, который поможет вам написать ваши программы. G-WAN помогает всем пользователям, зарегистрированным или нет, но ни одна компания или какой-либо консультант не может позволить себе бесплатно писать собственные приложения для совершенно незнакомых людей. И, кстати, это швейцарские франки, а не евро (1 евро = 1,2 швейцарских франка). - person Gil; 20.07.2014