NGINX - acelerador de solicitudes para evitar abusos

28

La razón por la que quiero hacer esto es porque los usuarios desarrollan contra nuestra API con JavaScript, y algunos desarrolladores se equivocan y hacen que los visitantes cierren el servidor con solicitudes AJAX. Cuando esto sucede, quiero poder limitar las solicitudes de API a quizás 50 solicitudes por minuto , o algo por el estilo.

Nota: (en particular, recursos intensivos de base de datos, por lo que tal vez a nivel de ruta, en lugar de en todo el servidor (por ejemplo, acelerador "/ json_api /", pero no "/ static /").

orokusaki
fuente

Respuestas:

36

Esto se puede hacer usando LimitReqModule con Nginx. Sin embargo, si se trata de un proxy inverso, es posible que desee probar la nueva limitación de velocidad admitida por HAProxy .

Encontré que la tasa de limitación de nginx es un poco confusa para obtener la tasa exacta que desea.

Pero básicamente tienes algo como:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

en la httpsección y luego algo así como lo siguiente en la locationsección dentro de la serversección:

limit_req zone=default burst=10 nodelay;

Para no tenerlo en una sección determinada como la /staticharía, se debe separar locationy no incluir la limit_reqdirectiva (o la inversa).

Kyle Brandt
fuente
Gracias. ¿Puedes explicar qué están haciendo esas cosas (zona, ráfaga, nodolay)? Y, ¿querías poner en su zone=limit_req_zonelugar?
orokusaki
Honestamente, no puedo explicarles tan bien, por eso siento que es solo confuso. La explicación de Michael en el enlace que proporcioné parece que podría ser factible. No creo que tenga ningún error tipográfico en lo que respecta a su segunda pregunta ... La documentación del módulo que he vinculado tiene un ejemplo que podría ayudar.
Kyle Brandt
2
zone, burst y nodelay están documentados en la página wiki de Nginx sobre el módulo de limitación de velocidad , vinculado ya desde la respuesta anterior.
Mark Stosberg
Kyle, ¿sabe si hay una manera de combinar el límite de velocidad por ubicación con otro activador (por ejemplo, Encabezado de autorización). En mi caso, es posible que desee limitar la velocidad de un usuario específico.
Nils
1
@Nils AFAICS, puede usar la $http_authorizationvariable para definir una nueva zona donde la clave es dicho encabezado en lugar de la dirección IP, es decir limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, y luego usar la per_userzona en las secciones de ubicación donde desea hacer la limitación de velocidad por usuario. Sin probar, solo acabo de leer la documentación y la lista de variables nginx ... ¡avíseme si intenta esto!
idrarig