Volver al blog

Implementación de limitación de velocidad de PHP usando Redis en Ubuntu 20.04: un tutorial

Implementación de limitación de velocidad de PHP usando Redis en Ubuntu 20.04: un tutorial

Redis, también llamado Remote Dictionary Server, es una base de datos en memoria de código abierto. Es un sistema de almacenamiento de estructura de datos que se ejecuta en la memoria RAM de un servidor, lo cual es mucho más rápido que la unidad de estado sólido más rápida (SSD). Como resultado, Redis es muy receptivo y una excelente opción para la limitación de velocidad.

La limitación de velocidad restringe la cantidad de veces que un usuario puede solicitar un recurso a un servidor. Muchos servicios utilizan límites de velocidad para detener el abuso del servicio, como cuando un usuario intenta sobrecargar un servidor con demasiada carga. Por ejemplo, al usar PHP para desarrollar una API (Interfaz de Programación de Aplicaciones) pública para su aplicación web, se requieren restricciones de velocidad. Esto se debe a que cuando expone una API al público, querrá limitar cuántas veces un individuo puede repetir una actividad en una cierta cantidad de tiempo. Los usuarios que no tienen autoridad sobre su sistema pueden paralizarlo.

La limitación de velocidad permite que su aplicación funcione sin problemas al rechazar las solicitudes de los usuarios que superan un límite establecido. Si tiene una gran cantidad de clientes, la limitación de velocidad impone una política de uso justo que permite a cada usuario acceder a su aplicación a altas velocidades. La limitación de velocidad también puede ayudarle a ahorrar dinero en ancho de banda al reducir la congestión en su servidor.

Al realizar un seguimiento de la actividad del usuario en una base de datos como MySQL, sería posible crear un programa de limitación de velocidad. Sin embargo, dado que dichos datos deben descargarse del disco y evaluarse frente al límite definido, el resultado final puede no ser escalable cuando varias personas se comunican con el sistema. Esto no solo es ineficiente, sino que las soluciones de gestión de bases de datos relacionales no fueron creadas para esto.

Redis es una buena opción para crear un limitador de velocidad porque funciona como una base de datos en memoria y ha sido demostrado ser confiable para esto. En este tutorial, le guiaremos a través de los pasos para implementar la limitación de velocidad de PHP usando Redis en Ubuntu 20.04.

¡Empecemos!

Requisitos previos

Para seguir este tutorial, necesitará lo siguiente:

Paso 1: Instalar la extensión de Redis para PHP

Antes de comenzar, actualicemos los repositorios para evitar conflictos de paquetes:

A continuación, instale la extensión php-redis, un paquete que hace posible usar Redis en programas PHP. Ejecute el siguiente comando sudo para instalar php-redis:

Después de eso, reinicie el servidor Apache para cargar la biblioteca php-redis:

El siguiente paso es actualizar la información en su índice de software e instalar la biblioteca Redis para PHP. Luego, crearemos un recurso PHP que restrinja el acceso según la dirección IP de un usuario.

Paso 2: Crear un recurso web PHP para la limitación de velocidad

En este paso, creará un archivo demo.php en el directorio raíz de su servidor web ( /var/www/html/). Este archivo estará abierto al público y los usuarios podrán abrir la URL en su navegador web preferido. Más adelante, utilizaremos el comando curl para verificar la accesibilidad del recurso que queremos usar. Los usuarios pueden acceder al archivo de recurso de muestra tres veces en un lapso de 15 segundos. Un intento que supere el límite máximo arrojará un mensaje de error.

La funcionalidad principal de este archivo depende en gran medida del servidor Redis. El código PHP en el archivo crea una clave en el servidor Redis según la dirección IP del usuario cuando este accede al recurso por primera vez. El código intentará hacer coincidir la dirección IP del usuario con las claves guardadas en el servidor Redis e incrementará el valor en uno si la clave existe cuando el usuario vuelve al recurso. El código PHP seguirá comprobando si el nuevo valor ha alcanzado la cantidad máxima.

Después de 15 segundos, la clave de Redis, que se basa en la dirección IP del usuario, caducará y el seguimiento de las visitas del usuario al recurso web comenzará de nuevo. Abra el /var/www/html/demo.php archivo en el nano editor de texto:

Luego, complete todos los campos para inicializar la clase Redis. No olvide establecer el REDIS_PASSWORD al valor correcto:

Redis->auth admite la autenticación de texto plano del servidor Redis. Esto funciona bien si está trabajando localmente (a través de localhost), pero si está tratando con un servidor Redis remoto, autenticación SSL se recomienda.

A continuación, en el mismo archivo, establezca las siguientes variables en sus valores predeterminados:

Comprendamos estas instrucciones en detalle:

  • $max_calls_limit: Un usuario no puede acceder al recurso superando este límite máximo de llamadas.

  • $time_period: Esto se utiliza como un marco de tiempo y se cuenta en segundos. Aquí, se le permite al usuario acceder al recurso según los límites establecidos en el $max_calls_limit .

  • $total_user_calls: Suma la cantidad de veces que un usuario ha solicitado acceso al llamadas límite en un período de tiempo determinado.

Luego, agregue el siguiente código para obtener la dirección IP del solicitante que pide acceder a la página web:

A modo de demostración, este código registra las acciones de los usuarios por sus direcciones IP. Si tiene un recurso protegido en el servidor que requiere autenticación, puede realizar un seguimiento de las acciones de los usuarios utilizando sus nombres de usuario o tokens de acceso.

En nuestra guía, a cada usuario que inicie sesión en su sistema se le asignará una identificación única (por ejemplo, un ID de cliente, ID de desarrollador, ID de proveedor o incluso un ID de usuario). Recuerde utilizar estos ID en lugar de la $user_ip dirección si está siguiendo nuestro tutorial.

Aquí, la dirección IP del usuario es suficiente para demostrar el concepto. Agregue el siguiente bloque de código a su archivo una vez que tenga la dirección IP del usuario del fragmento de código anterior:

Aquí hay una descripción general de estas declaraciones:

  • if...else: La declaración verifica si hay una clave definida con la dirección IP en el servidor Redis.

    • Si no se encuentra la clave, if (!$redis->exists($user_ip_address)) {...}, puede establecer la clave y definir su valor en 1 usando $redis->set($user_ip_address, 1).

  • $redis->expire($user_ip_address, $time_period): Establece que la clave expire en un momento específico. Aquí en este tutorial, lo hemos configurado en 15 segundos.

  • Si la dirección IP del usuario no se encuentra en la clave de Redis, establezca la variable $total_user_calls valor como 1.

  • else {...}: El bloque de declaración utiliza el $redis->INCR($user_ip_address); comando para incrementar el valor de la clave de Redis en 1. Esto se aplicará a cada dirección IP alineada con la clave.

    • Nota: Puede lograr esto solo cuando la clave ya está configurada en el servidor Redis y se cuenta como una solicitud repetitiva.

  • $total_user_calls = $redis->get($user_ip_address): Esta declaración recupera el total de solicitudes verificando su respectiva clave basada en la dirección IP en el servidor Redis.

  • if ($total_user_calls > $max_calls_limit) {... }..: Esta if declaración se utiliza para verificar el límite excedido. Si es así, notifica al usuario con echo "Usuario" . $user_ip_address . " límite excedido.";.

Finalmente, está notificando al usuario sobre su número de visitas en un período específico utilizando la declaración echo "Bienvenido" . $user_ip_address . "total de llamadas realizadas" . $total_user_calls . "en" . $time_period . "segundos"; .

Después de eso, agregue las siguientes líneas de código en su archivo /var/www/html/demo.php:

Guarde y cierre el archivo /var/www/html/demo.php después de haber terminado de modificarlo. En la página web demo.php, ahora ha creado la lógica requerida para limitar la tasa de usuarios. Probemos nuestro script en el siguiente paso.

Paso 3: Ejecutar la prueba de limitación de tasa de Redis

Utilizará el curl comando en este paso para solicitar el recurso web que escribió en el Paso 2. Para probar a fondo el script, emita un solo comando que solicite el recurso cinco veces. Esto se puede lograr agregando un argumento de URL de marcador de posición a demo.php final del archivo. Para realizar las curl instrucciones cinco veces, use el valor ?[1-5] al final de su solicitud.

Ejecute el siguiente curl comando a continuación:

Cuando ejecute el código, debería obtener algo como esto:

Las primeras tres solicitudes, como puede ver, se realizaron sin problemas. La cuarta y quinta consulta, sin embargo, fueron limitadas en su tasa por su script. Es muy probable que el servidor Redis esté ralentizando la velocidad a la que las personas pueden realizar consultas.

Ha especificado valores bajos para las dos variables que se enumeran a continuación en esta guía:

Cuando cree su aplicación en un entorno de producción, es posible que desee considerar el uso de números más grandes, dependiendo de con qué frecuencia crea que la gente la usará.

Es una buena idea examinar las estadísticas en tiempo real antes de ajustar estos números. En este ejemplo, si los registros de su servidor muestran que un usuario promedio visita su aplicación 1,000 veces cada 60 segundos, puede usar ese número como ejemplo de cuánta limitación aplicar.

Conclusión

En esta guía, aprendió cómo utilizar un servidor Redis con PHP en Ubuntu 20.04. Si bien esta publicación demuestra cómo funciona la limitación de tasa con Redis, puede personalizarla para satisfacer las demandas de su aplicación web. Le animamos a explorar ejemplos del mundo real como el límite máximo de solicitudes de Twitter, la API JSON de búsqueda personalizada de Google, y otra documentación similar para mejorar sus conocimientos sobre la limitación de tasa y probar a experimentar usted mismo utilizando diferentes límites de tiempo.

Además, hay muchos otros materiales de aprendizaje sobre Redis y PHP a los que puede acceder desde nuestros blogs:

¡Feliz computación!

author

Shreyas Patil

Autor · CloudSigma

Preslav Dobrev es diseñador creativo en CloudSigma, centrado en una identidad empresarial coherente mediante el uso de canales de marketing tradicionales e innovadores. Es experto en fusionar la visión artística con el marketing estratégico para crear narrativas de marca impactantes.

Comentarios

Aún no hay comentarios. Sea el primero.