Limitar el tamaño de peticiones HTTP con Nginx

Supongamos que tienes montada una web bastante simple sobre un servidor NGINX. Una rollo «próximamente».

Estas webs y en general la mayoría no suelen requerir peticiones HTTP más grandes de 1024 bytes.

Suelen contener un archivo index.html, algún javascript que puede ir incluso inline e incluso css que puede ir también inline.

Este tipo de webs son sencillas y se pueden trabajar más o menos. Se puede trabajar para que sean «responsive» por ejemplo y para que tengan los estilos y el javascript ordenaditos sin mezclarlos con el HTML.

La diferencia entre hacerlo bien y muy bien es trabajo y por tanto encontraremos todo tipo de webs que pueden separar el estilo y el javascript o pueden llevarlo inline por las razones que sean. No es importante salvo que se requiera mantenibilidad, reuitilización, escalabilidad, … e incluso una web con un marcado semántico preparada para SEO.

Lo que nos trae a este post es como configurar NGINX para que no permita peticiones HTTP de un tamaño demasiado grande. Da igual sin son peticiones POST, GET, … y realmente nos la suda si el código es elegante.

En NGINX podemos configurar esto fuera de location:

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 100k;
large_client_header_buffers 2 1k;

  
Y reiniciar el server o hacer reload de la configuración. De ese modo vamos a limitar a 1k las peticiones y si son más pequeñas nos dará un 200, si son más grandes un 400 (o un 000).

Con un script bash como este que he realizado en un rato esta tarde podemos posiblemente comprobar el limite:

#!/bin/bash
# apt install curl

url="$1"
sizeBytesUserAgent=$2

domain=$(echo "$url" | cut -d "/" -f 3)
userAgent=$(base64 /dev/urandom | head -c $sizeBytesUserAgent | tr -d " \t\n\r")
echo -e "[USER AGENT ALEATORIO DE $sizeBytesUserAgent Bytes]:\n$userAgent\n\n[HTTP STATUS]:"
curl -k -s -o /dev/null -w "%{http_code}" "$url" -H "Host: $domain" -H "User-Agent: $userAgent" -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache'
echo -e "\n"

Y si lo ejecutamos así nos dará algo así como esto (véase las peticiones cliente abajo y el tail -f del log de nginx arriba):

$ bash peticion.sh http://56k.es 1024

  
Hemos de meter como parametro la url de la petición y separado con espacio el tamaño en bytes que queremos meter en el UserAgent fake que vamos a generar aleatoriamente.

Nginx dirá que eso es demasiado grande si nos pasamos y nos dará un 200 si es aceptable.

Y poco más que decir sobre esto salvo que se puede jugar desde firefox con re-enviar peticiones e ir alterando el tamaño para ver si el server se come churros largos o por el contrario solamente churros cortos.

En madrid los churros son una cosa muy diferente a la realidad expuesta, pero sirvan de ilustración esas imágenes.

Si nuestra web no requiere para mostrarse de churros largos no tendríamos que hacer llegar la comanda al churrero. NGINX se encarga de limitar lo que es el tamaño de churro aceptable y lo que deja de ser sano.

Saludos cordiales.

Comentarios 2

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *