Как я могу реализовать ограничение скорости на стороне сервера для веб-службы Perl? - PullRequest
4 голосов
/ 01 февраля 2009

У меня есть веб-служба CGI / Fast CGI на основе Perl, и я хочу ограничить скорость клиентов по IP-адресу, чтобы остановить агрессивных клиентов, вызывающих слишком много работы.

Я искал некоторый код и нашел Algorithm :: TokenBucket в CPAN, но это для клиентских запросов; у него нет постоянства и нет конфигурации для каждого пользователя, поэтому он не очень полезен для ограничения скорости на стороне сервера.

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

Ответы [ 2 ]

5 голосов
/ 01 февраля 2009

Я использовал Cache :: FastMmap для ограничения скорости, отслеживая попадания по IP-адресу. Это кэш, поэтому данные со временем истекают, но если вы правильно установите размер и время истечения, это не должно быть проблемой.

IP-адрес - это ключ хэша, а значение хэша - массив временных меток. У меня есть вторая структура данных (также поддерживаемая Cache :: FastMMap ), которая представляет собой хэш запрещенных IP-адресов, обновленный в соответствии с данными из первой структуры.

4 голосов
/ 02 февраля 2009

Я знаю, что это не то, что вы спросили, но вы рассматривали возможность обработки этого в другом месте стека, где это уже было сделано для вас? Ясно, что я не знаю ваш стек развертывания, но если это apache, вы можете использовать mod_evasive . С другой стороны, если вы работаете в Linux, вы можете позволить iptables выполнять свою работу, используя что-то вроде:

#Allow only 12 connections per IP
/sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset

конечно, более сложные правила возможны.

...