Cómo limitar la tasa de conexiones (solicitudes) en Nginx

Cómo limitar la tasa de conexiones (solicitudes) en Nginx

En nuestro último artículo que forma parte de nuestra serie de gestión de tráfico NGINX, discutimos cómo limitar el número de conexiones en Nginx. En esta guía, analizaremos cómo limitar la tasa de solicitudes en Nginx.

La limitación de la tarifa es una técnica de gestión del tráfico utilizada para restringir el número de Http Solicitudes que un cliente puede hacer en un período de tiempo de tiempo - Los límites de tasa se calculan en Solicitudes por segundo (o RPS).

Un ejemplo de una solicitud es un CONSEGUIR Solicitud de la página de inicio de sesión de una aplicación o un CORREO Solicitar en un formulario de inicio de sesión o un CORREO en una API punto final.

Hay muchas razones para limitar la tasa de solicitudes a sus aplicaciones web o servicios de API, una de las cuales es una seguridad: proteger contra solicitudes rápidas abusivas.

Tasa limitante de conexiones en Nginx

Comience por definir los parámetros para la limitación de la velocidad utilizando el Limit_req_zone directiva. Los parámetros requeridos son una clave para identificar a los clientes, una zona de memoria compartida que almacenará el estado de la clave y con qué frecuencia ha accedido a una URL restringida de solicitud y la tasa.

El Limit_req_zone La directiva es válida dentro del contexto HTTP.

Limit_req_zone $ binary_remote_addr zona = LimitreqSByAddr: 20m tasa = 10r/s; 

Además, establezca un código de estado de respuesta que se devuelva a las solicitudes rechazadas, utilizando el Limit_req_status Directiva que es válida dentro de los contextos HTTP, Sever y de ubicación.

limit_req_status 429; 

Ahora puedes usar el limint_conn Directiva para habilitar la limitación de la tasa de solicitud dentro de los contextos HTTP, Sever y de ubicación. Toma una zona de memoria como parámetro y otros parámetros opcionales.

Limit_req Zone = LimitReqSByAddr; 

El siguiente ejemplo de configuración muestra que limita la tasa de solicitud a una API de la aplicación web. El tamaño de la memoria compartida es de 20 MB y el límite de la tasa de solicitud es de 10 solicitudes por segundo.

API_SERVICE UPSTREAM servidor 127.0.0.1: 9051; servidor 10.1.1.77: 9052;  Limit_req_zone $ binary_remote_addr zona = LimitreqSByAddr: 20m tasa = 10r/s; limit_req_status 429; servidor escuchar 80; servidor_name testApp.tecmenta.com; root/var/www/html/testApp.tecmenta.com/construir; índice índice.html; #Include fragmentos/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; ubicación / try_files $ uri $ uri / / index.html = 404 = 403 = 500;  ubicación /API  Limit_req Zone = LimitReqSByAddr; proxy_pass http: // api_service; proxy_set_header X-Real-IP $ Remote_addr; proxy_set_header host $ host; proxy_set_header x-forwarded-para $ proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header actualización $ http_upgrade; proxy_set_header conexión "actualización";  

Guardar su archivo de configuración y cerrarlo.

Entonces verifique si el Nginx La sintaxis de configuración es correcta usando el siguiente comando:

$ sudo nginx -t 

Después de eso, recargar el Nginx El servicio aplica los últimos cambios:

$ sudo systemctl recargar nginx 

Una vez que el límite de tarifa de 10 Las solicitudes por segundo se exceden por un solo cliente que accede /API/, Nginx devuelve un "429 demasiadas solicitudes"Error al cliente.

Nginx 429 demasiadas solicitudes de error

También registra el incidente en el registro de errores.

2022/04/29 00:30:38 [Error] 3145846#0: *131039 solicitudes limitantes, exceso: 0.990 por zona "Limitreqsbyaddr", Cliente: 192.168.1.10, servidor: TestApp.tecmenta.com, solicitud: "Get/API/V1/App/Meta-Data HTTP/1.1 ", host:" testApp.tecmenta.com ", referente:" https: // testApp.tecmenta.com/" 
Registros de error NGINX

A veces, dependiendo de la naturaleza de su aplicación o API, un cliente necesitará hacer muchas solicitudes a la vez, y luego reducir su tasa por un período de tiempo antes de hacer más. Nginx también puede amortiguar cualquier solicitud de exceso en una cola y procesarlas de inmediato.

Puede habilitar este comportamiento en la limitación de la velocidad utilizando el explosión parámetro con el Limit_req directiva. Para habilitar la cola sin demora, agregue el sin demora parámetro.

Limit_Req Zone = LimitReqSByAddr Burst = 20 Nodelay; 

Hay un problema con la limitación de la velocidad basada en la IP de un cliente, particularmente para los usuarios que acceden a su aplicación desde la misma red y operan detrás de un NAT. En este caso, todas sus solicitudes se originarán en la misma dirección IP. En tal escenario, puede usar otras variables para identificar clientes como una cookie de sesión.

Para obtener más información sobre la limitación de la tasa de solicitudes, consulte esta tasa Nginx Limitar en el sitio web de Nginx. A continuación, cubriremos cómo limitar el uso de ancho de banda en Nginx.