Weserv Images#

El módulo weserv redimensiona, recorta y convierte imágenes al vuelo. Forma parte del proyecto weserv/images, el código que hay detrás del servicio wsrv.nl. El módulo funciona en uno de dos modos:

  • proxy — obtiene la imagen del servidor remoto indicado en el parámetro de consulta url;

  • filter — procesa las imágenes de las respuestas generadas por otros manejadores, como los archivos estáticos.

En ambos modos, la cadena de consulta define el procesamiento: w y h establecen el ancho y el alto de destino, fit define cómo se ajusta la imagen a ellos, output define el formato de salida, etc. La lista completa de parámetros está en la documentación de wsrv.nl.

Instalación#

Para instalar el módulo, utilice uno de los siguientes paquetes:

  • Angie: angie-module-weserv-images

  • Angie PRO: angie-pro-module-weserv-images

Directivas#

Directivas principales del módulo:

  • weserv — habilita el módulo en un location y selecciona el modo, proxy o filter

  • weserv_deny_ip — prohíbe obtener imágenes de las direcciones o rangos CIDR indicados; se aplica solo a las direcciones IP escritas directamente en el parámetro url, no a los nombres de host

  • weserv_connect_timeout, weserv_send_timeout, weserv_read_timeout — establecen los tiempos de espera para conectarse al servidor remoto, enviarle la solicitud y leer su respuesta

  • weserv_max_size — limita el tamaño de una imagen a procesar

  • weserv_limit_input_pixels, weserv_limit_output_pixels — limitan el número de píxeles de las imágenes de entrada y de salida

  • weserv_savers — enumera los formatos de salida que puede solicitar el parámetro output

  • weserv_quality — establece la calidad de salida por defecto; las directivas como weserv_jpeg_quality y weserv_webp_quality la sustituyen para un solo formato

En el modo proxy, la variable $weserv_response_length contiene el tamaño en bytes de la imagen original obtenida; en el modo filter, la variable no se establece.

Todas las directivas con sus valores por defecto se describen en la documentación del módulo.

Carga del módulo#

Para utilizar el módulo, debe cargarse en el contexto main{}:

load_module modules/ngx_weserv_module.so;

Ejemplo de configuración#

server {
    listen 80;

    server_name images.weserv.local;

    root /var/www/imagesweserv/public;

    location / {
        weserv proxy;

        add_header X-Upstream-Response-Length $weserv_response_length;
    }

    location /static/ {
        weserv filter;

        alias /var/www/imagesweserv/public/;
    }
}

Aquí, las solicitudes con el parámetro url se procesan en modo proxy, y para las solicitudes bajo /static/ el módulo procesa en modo filter los archivos del directorio /var/www/imagesweserv/public/. Una solicitud a / sin url no la procesa el módulo y recibe un archivo estático de root.

Angie resuelve los nombres de host de url con su propio resolvedor; por defecto, consulta los servidores de nombres indicados en /etc/resolv.conf, y no se consulta el archivo /etc/hosts. Para usar otros servidores DNS, establezca la directiva resolver. Las direcciones IP en url no necesitan resolución.

Demostración#

Supongamos que un servidor en 127.0.0.1:8081 sirve la imagen original sample.png (400 × 300 píxeles, 2351 bytes), y el mismo archivo se encuentra en /var/www/imagesweserv/public/.

En el modo proxy, el módulo obtiene la imagen indicada en url y la escala al ancho w, manteniendo la proporción:

$ curl -s -D - -o out.png 'http://localhost/?url=127.0.0.1:8081/sample.png&w=100'
HTTP/1.1 200 OK
...
Content-Type: image/png
Content-Length: 15633
Content-Disposition: inline; filename=image.png
Link: <http://127.0.0.1:8081/sample.png>; rel="canonical"
...
X-Upstream-Response-Length: 2351

$ file out.png
out.png: PNG image data, 100 x 75, 8-bit/color RGB, non-interlaced

La cabecera Link apunta a la imagen original, y X-Upstream-Response-Length contiene su tamaño, que la configuración de ejemplo añade a partir de $weserv_response_length. El prefijo http:// en url es opcional; al añadir &output=jpg a la misma solicitud se obtiene una imagen JPEG.

En el modo filter, los mismos parámetros se aplican a un archivo local; aquí la imagen se recorta para llenar un cuadrado de 50 × 50 y se convierte a WebP:

$ curl -s -D - -o small.webp 'http://localhost/static/sample.png?w=50&h=50&fit=cover&output=webp'
HTTP/1.1 200 OK
...
Content-Type: image/webp
Content-Length: 250
...

El archivo small.webp es una imagen WebP de 50 × 50. La respuesta no tiene la cabecera X-Upstream-Response-Length: la ubicación /static/ no la añade, y en el modo filter $weserv_response_length no se establece.

Cuando el módulo no puede devolver una imagen, responde con un error en JSON:

$ curl -s 'http://localhost/?url=127.0.0.1:8081/missing.png'
{"status":"error","code":404,"message":"The requested URL returned error: 404"}

Información adicional#

Versión: v5.1.0

La documentación detallada y el código fuente están disponibles en: weserv/images