Zones en nginx
Esto nos sirve básicamenta para hacer lo que haría Cloudflare: limitar acceso a recursos para que el servidor no reviente, o en su defecto, evitar ataques DDoS o al menos mitigarlos.
Para hacer esto, debemos definir una zone en nginx y asignandole memoria para que los *worker processes* puedan comunicarse entre ellos tranquilamente, dentro del bloque http (no dentro de server):
- /etc/nginx/nginx.conf
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
Luego en el bloque de server
pondríamos las reglas:
- /etc/nginx/nginx.conf
server { listen 80; location / { limit_req zone=mylimit; } root /var/www/html; }
Esto básicamente nos daría un ratio de 1 request por minuto. Si se hiciese mas de una request por minuto, nginx te dirá que pares, que 503 para ti.
Esto es el rate limiting mas básico que hay, podemos hacer cosas mas
especificas como hacer que vaya mas lento desde n
request y que pare
de dar respuesta desde n+3
requests, por ejemplo
- /etc/nginx/nginx.conf
server { listen 80; location / { limit_req zone=mylimit burst=5 delay=3; } root /var/www/html; }
También puedes limitar el ancho de banda en un servidor, o en una localización del servidor, para que no se coma todo el ancho de banda:
- /etc/nginx/nginx.conf
server { listen 80; location /downloads/ { limit_rate_after 1m; limit_rate 500k; } root /var/www/html; }
Esto limitará la velocidad a 500k después de 1m de conexión.
Cachear respuestas de proxy inverso
Para no sobrecargar tanto APIs o el propio Backend de nuestra cosa, podríamos decirle a nginx que guarde en caché algunas respuestas del backend para hacerlo algo mas rápido:
- /etc/nginx/nginx.conf
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:10m max_size=1g; server { listen 80; proxy_cache cache; location / { proxy_pass http://127.0.0.1:3000; } root /var/www/html; }