Cómo calificar el límite en NGINX

La limitación de velocidad en NGINX es una característica crucial para controlar la cantidad de tráfico que maneja su servidor. Ayuda a proteger su servidor para que no se vea abrumado por demasiadas solicitudes en un período corto, lo que pueden causar ataques maliciosos como DDoS o picos de tráfico elevados. La implementación de una limitación de velocidad garantiza que sus recursos se utilicen de manera eficiente y que los usuarios legítimos puedan acceder a sus servicios sin interrupción.

Esta guía demostrará cómo configurar la limitación de velocidad en NGINX y brindará instrucciones claras para ayudarlo a administrar y controlar el tráfico entrante de manera efectiva.

Comprensión de las directivas de límite de tasa en NGINX

Directivas clave de limitación de tasas de NGINX

NGINX configura la limitación de velocidad mediante directivas específicas, cada una de las cuales cumple una función única:

  • limit_req_zone: La directiva limit_req_zone en NGINX configura una zona de memoria compartida para almacenar información que limita la velocidad. Ubicado en el contexto http, determina la tasa permitida de solicitudes, estableciendo efectivamente la base para los límites de tasa.
  • límite_req: La directiva limit_req, utilizada en el contexto de ubicación, aplica el límite de velocidad establecido por limit_req_zone. Aplica estas limitaciones a ubicaciones o URL específicas, controlando así la frecuencia de acceso a estos puntos finales.
  • limit_req_status: Ubicada en el contexto de ubicación, la directiva limit_req_status especifica el código de estado HTTP devuelto cuando la tasa de solicitudes excede el límite. Este mecanismo de retroalimentación es crucial para informar a los usuarios o sistemas automatizados cuando exceden la frecuencia de solicitud permitida.

Crear una configuración de limitación de velocidad

Para implementar la limitación de velocidad en NGINX, inserte las directivas apropiadas en el archivo de configuración de NGINX. Considere este ejemplo básico:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        ...
        location / {
            limit_req zone=mylimit burst=10;
            ...
        }
    }
}

En esta configuración, la directiva limit_req_zone establece una zona de memoria llamada 'mylimit', que permite 5 solicitudes por segundo (5r/s) desde cada dirección IP de cliente ($binary_remote_addr). Luego, la directiva limit_req aplica este límite de velocidad a la ubicación raíz (/), con una capacidad de ráfaga de 10 solicitudes, lo que ofrece un equilibrio entre una limitación de velocidad estricta y flexibilidad para picos de tráfico legítimos.

Límite de tasa en NGINX: ejemplos prácticos

Configuración básica de limitación de velocidad

Esta sección explorará una configuración básica de limitación de velocidad aplicada en todo el servidor en NGINX. El objetivo es limitar las solicitudes de los usuarios al servidor, garantizando un rendimiento estable y mitigando el riesgo de sobrecarga.

Ejemplo: límite de velocidad en todo el servidor

Considere la siguiente configuración de NGINX:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=5;
            proxy_pass http://backend;
        }
    }
}

Esta configuración establece un límite de 2 solicitudes por segundo para cada cliente, según lo definido por su dirección IP ($binary_remote_addr). Analicemos los componentes clave:

  • zona_req_limitada: Define una zona de memoria (mylimit) para almacenar los estados límite de velocidad con un tamaño de 10 megabytes. Establece el límite de velocidad en 2 solicitudes por segundo (2r/s).
  • bloque de servidor: escucha en el puerto 80 el tráfico entrante a example.com.
  • bloque de ubicación: aplica el límite de velocidad a la URL raíz (/). El parámetro de ráfaga permite una ráfaga de hasta 5 solicitudes, lo que proporciona flexibilidad para picos breves de tráfico. La directiva proxy_pass reenvía la solicitud al servidor backend especificado.
  • Parámetro de ráfaga: La configuración burst=5 en la directiva limit_req permite un aumento a corto plazo en las solicitudes, hasta 5 solicitudes adicionales por encima de la tasa establecida. Esta característica es crucial para manejar aumentos repentinos y legítimos de tráfico sin afectar la experiencia del usuario.
  • Pase de poder: El proxy_pass http://backend; La directiva reenvía el tráfico a un servidor backend. Esto se usa comúnmente en escenarios de equilibrio de carga o cuando NGINX actúa como proxy inverso.

Ejemplos de limitación de velocidad avanzada

Diferentes límites de tarifas para diferentes ubicaciones

Es posible que deba aplicar diferentes límites de tasa a diferentes partes de la aplicación en escenarios más complejos. Esto es particularmente útil cuando puntos finales específicos consumen más recursos o son propensos a sufrir abusos.

Considere la siguiente configuración:

http {
    limit_req_zone $binary_remote_addr zone=low:10m rate=1r/s;
    limit_req_zone $binary_remote_addr zone=high:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location /api/low {
            limit_req zone=low burst=3;
            proxy_pass http://backend;
        }

        location /api/high {
            limit_req zone=high burst=20;
            proxy_pass http://backend;
        }
    }
}

Esta configuración aplica un límite de velocidad más bajo (1 solicitud por segundo) a la ubicación /api/low y un límite de velocidad más alto (10 solicitudes por segundo) a la ubicación /api/high.

Ejemplos adicionales de limitación de velocidad de Nginx

Limitación de tarifas según los tipos de solicitud

Puede configurar la limitación de velocidad en función de solicitudes específicas, como solicitudes GET, POST o PUT. Esto es particularmente útil cuando desea proteger puntos finales específicos que son más vulnerables al abuso o tienen un mayor impacto en los recursos de su servidor.

Puede utilizar la directiva if y la variable $request_method para aplicar limitación de velocidad a tipos de solicitudes específicos. He aquí un ejemplo:

http {
    limit_req_zone $binary_remote_addr zone=get_limit:10m rate=5r/s;
    limit_req_zone $binary_remote_addr zone=post_limit:10m rate=2r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($request_method = GET) {
                limit_req zone=get_limit burst=10;
            }

            if ($request_method = POST) {
                limit_req zone=post_limit burst=5;
            }

            proxy_pass http://backend;
        }
    }
}

En esta configuración, hemos configurado dos límites de velocidad separados: uno para solicitudes GET (5 solicitudes por segundo) y otro para solicitudes POST (2 solicitudes por segundo).

Limitación de tarifas basada en usuario-agente

Otra técnica útil es aplicar limitación de velocidad basada en el encabezado User-Agent enviado por los clientes. Esto puede ayudar a proteger sus servicios de bots o rastreadores específicos que causan problemas.

Para implementar una limitación de velocidad basada en User-Agent, puede utilizar la directiva map y la variable $http_user_agent.

He aquí un ejemplo:

http {
    map $http_user_agent $limit_bots {
        default 0;
        ~*(Googlebot|Bingbot) 1;
    }

    limit_req_zone $binary_remote_addr zone=bot_limit:10m rate=1r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($limit_bots) {
                limit_req zone=bot_limit burst=2;
            }

            proxy_pass http://backend;
        }
    }
}

En este ejemplo, hemos definido una directiva de mapa que establece la variable $limit_bots en 1 si el encabezado User-Agent coincide con "Googlebot" o "Bingbot". Luego aplicamos un límite de velocidad de 1 solicitud por segundo a las solicitudes de estos bots.

Incluir IP en la lista blanca de limitación de velocidad

A veces, es posible que desees eximir de la limitación de velocidad a direcciones IP específicas, como socios de confianza o servicios internos. Para lograr esto, puede utilizar la directiva geo, junto con la if directiva.

He aquí un ejemplo:

http {
    geo $rate_limit {
        default 1;
        192.168.0.0/24 0;
        10.0.0.0/8 0;
    }

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($rate_limit) {
                limit_req zone=mylimit burst=10;
            }

            proxy_pass http://backend;
        }
    }
}

Limitación de la tasa de escalamiento en un entorno distribuido

Cuando se ejecutan varias instancias de Nginx en un entorno distribuido, es posible que desee asegurarse de que la limitación de velocidad sea coherente en todas las instancias. Puede utilizar un almacén de datos centralizado como Redis para administrar los límites de tarifas para lograrlo. Hacerlo le permite mantener un límite de velocidad global compartido entre todas las instancias de Nginx.

Para configurar la limitación de velocidad con Redis, debe instalar y configurar el módulo nginx-module-redis. Una vez que haya instalado el módulo, puede actualizar su configuración de Nginx para usar Redis para limitar la velocidad.

He aquí un ejemplo:

load_module modules/ngx_http_redis_module.so;

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    upstream redis_server {
        server 127.0.0.1:6379;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req_redis zone=mylimit burst=10 redis_server=redis_server;
            proxy_pass http://backend;
        }
    }
}

En este ejemplo, definimos un bloque ascendente para el servidor Redis y actualizamos el bloque de ubicación para usar la directiva limit_req_redis en lugar de la directiva limit_req estándar. Esta configuración garantiza que los límites de velocidad se apliquen mediante el almacén de datos compartido de Redis, lo que proporciona una limitación de velocidad consistente en múltiples instancias de Nginx.

Limitación de velocidad dinámica

En algunas situaciones, es posible que desees ajustar los límites de velocidad dinámicamente según ciertas condiciones o la carga actual de tu servidor. Por ejemplo, es posible que desee aplicar límites de velocidad más estrictos durante las horas pico de tráfico para administrar mejor los recursos del servidor.

Para implementar la limitación de velocidad dinámica, puede utilizar el map directiva para definir límites de tarifas basados ​​en condiciones específicas.

He aquí un ejemplo:

http {
    map $http_x_traffic $dynamic_rate {
        default "5r/s";
        high "2r/s";
    }

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=$dynamic_rate;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=10;
            proxy_pass http://backend;
        }
    }
}

En esta configuración, utilizamos la variable $http_x_traffic derivada de un encabezado personalizado X-Traffic. Según el valor de este encabezado, establecemos dinámicamente el límite de tasa. Cuando el valor del encabezado es "alto", aplicamos un límite de velocidad más estricto de 2 solicitudes por segundo. De lo contrario, utilizamos la tasa predeterminada de 5 solicitudes por segundo.

Tenga en cuenta que este ejemplo supone que su servidor backend u otro componente de su infraestructura establece el encabezado X-Traffic según las condiciones deseadas.

Prueba de su límite de velocidad en la configuración de NGINX

Verificando la limitación de velocidad con curl

Usando curl para pruebas de solicitud simple

Para validar la efectividad de su configuración de limitación de velocidad en NGINX, curl, una herramienta de línea de comandos para enviar solicitudes HTTP, resulta muy útil. Puede enviar rápidamente múltiples solicitudes a su servidor, ayudándolo a evaluar si los límites de velocidad están activos.

for i in {1..10}; do curl -I http://example.com; done
  • Este comando emite 10 solicitudes HEAD a su servidor, dirigidas a http://example.com.
  • Analice los encabezados de respuesta HTTP de estas solicitudes para verificar la funcionalidad de limitación de velocidad.
  • NGINX debería devolver un código de estado 429 Demasiadas solicitudes cuando la tasa de solicitudes excede el límite especificado.

Pruebas con Apache Bench (ab)

Evaluación comparativa de las respuestas del servidor con Apache Bench

Apache Bench (ab) es una herramienta de evaluación comparativa eficaz, ideal para probar límites de velocidad simulando condiciones de mucho tráfico. Ayuda a comprender cómo se comporta su servidor NGINX ante una oleada de solicitudes.

ab -n 100 -c 10 http://example.com/
  • Este comando le indica a ab que envíe 100 solicitudes a http://example.com con un nivel de simultaneidad 10.
  • El resultado de ab proporciona información sobre la efectividad de la limitación de la tasa.
  • Concéntrese en la cantidad de solicitudes fallidas en el resultado, que debe alinearse con la configuración de limitación de velocidad de NGINX.

Emplear los mejores métodos para probar su configuración de NGINX garantiza que sus reglas de limitación de velocidad funcionen según lo previsto.

Conclusión

Al configurar la limitación de velocidad en NGINX, puede proteger su servidor del tráfico excesivo y posibles abusos. Esto ayuda a mantener el rendimiento y la disponibilidad de sus servicios, garantizando una mejor experiencia para los usuarios legítimos. Supervise y ajuste periódicamente su configuración de limitación de velocidad para equilibrar la seguridad y la accesibilidad. La implementación de estos controles es vital para administrar eficientemente los recursos de su servidor.

Joshua James
Sígueme
Últimas entradas de Joshua James (ver todo)

Deja un comentario