¿Cómo puedo implementar la limitación de velocidad del lado del servidor para un servicio web de Perl?

StackOverflow https://stackoverflow.com/questions/501405

  •  20-08-2019
  •  | 
  •  

Pregunta

Tengo un servicio web CGI / Fast CGI basado en Perl y quiero limitar la velocidad de los clientes por dirección IP para evitar que los clientes agresivos causen demasiado trabajo.

He buscado un código y he encontrado Algorithm :: TokenBucket en CPAN pero eso es para solicitudes de clientes; no tiene persistencia ni configuración por usuario, por lo que no es realmente útil para limitar la velocidad del lado del servidor.

Estoy buscando sugerencias para algo que ya existe, de lo contrario, tendré que usar el mío basado en una persistencia simple, como vincular a DB_File por dirección IP y algún trabajo por lotes que gestiona el token.

¿Fue útil?

Solución

He usado Cache :: FastMmap para limitar la velocidad mediante el seguimiento de visitas por dirección IP Es un caché, por lo que los datos caducarán con el tiempo, pero si establece el tamaño y el tiempo de caducidad correctos, esto no debería ser un problema.

La dirección IP es la clave hash y el valor hash es una matriz de marcas de tiempo. Tengo una segunda estructura de datos (también respaldada por Cache :: FastMMap ) que es un hash de direcciones IP prohibidas, actualizadas de acuerdo con los datos de la primera estructura.

Otros consejos

Sé que no es lo que pediste, pero ¿has considerado manejar esto en otra parte de la pila donde ya se ha hecho por ti? Claramente, no conozco su pila de implementación, pero si es apache, puede usar mod_evasive . Alternativamente, si está en Linux, puede dejar que iptables haga su trabajo usando algo como:

#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

ciertamente son posibles reglas más complicadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top