Hola Visitante

Autor Tema: Shaping con nginx: Limitando CPS (II)  (Leído 101 veces)

Berni69

  • Administrator
  • *****
  • Mensajes: 33
    • Ver Perfil
Shaping con nginx: Limitando CPS (II)
« en: Septiembre 10, 2018, 09:32:36 am »

Hace unos días, se me planteó el problema de limitar las CPS (conexiones por segundo a un servicio de APIs externo), por lo que mi primera idea fue limitarlo en el proxy de salida de los servidores (SQUID). Pero eso implicaba cambiar y tunear las IPtables de una forma poco dinámica ya que si el proveedor está en una CDN habría que montar un proceso de actualización de reglas,.. o bien limitarlo para todas las salidas externas del proxy con lo que no resultaba ser una buena opción así que seguí buscando,… en este caso encontré nginx como proxy inverso con el módulo limit_req_zone que permite hacer rate limiting de peticiones.


Siguiendo el esquema de la entrada anterior (Shaping con Iptables: Limitando CPS):



Y la misma arquitectura de pruebas:

























Nombre del ServidorIPDescripción
shaper0110.112.112.101Nginx Reverse Proxy
webserver0110.112.112.102Servidor web con nginx
server0110.112.112.106Envío de tráfico

Para simplificar configuraciones, y la lectura de los scripts se han hecho 2 suposiciones.



  1. Tenemos acceso privilegiado a la máquina (sudo -i) o similar.

  2. En el archivo de hosts (/etc/hosts) de cada máquina se ha añadido lo siguiente:
    10.112.112.101 shaper01
    10.112.112.102 webserver01
    10.112.112.106 server01



Para las pruebas se ha habilitado la siguiente zona en nuestro nginx (/etc/nginx/conf.d/rate-limit.conf):



limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
    listen       80;
    server_name  shaper01;
    location / {
       limit_req zone=mylimit;
       proxy_set_header Host "webserver01";
       proxy_pass http://webserver01;

    }
}

En esta zona se indica que todas las peticiones con el server_name “shaper01”, en la ruta / e hijas se aplicará un rate-limiting de 10r/s, y tras aplicar esta  limitación serán reenviadas las peticiones contra el servidor webserver01.


El único cambio que hay que hacer en el programa cliente es la url dónde apuntarán sus peticiones, en este caso, se deberán abrir contra el servidor shaper01 en lugar del endpoint de la API.


Las pruebas se han lanzado con curl igual que en la entrada anterior:



while [ 1 ]; do curl shaper01 -s > /dev/null; done

Tras analizar los resultados del nginx del server web, podemos afirmar que está funcionando el rate-limiting.


Conexiones Por segundo usando nginx