03Nov

Cómo crear rápidamente con Docker un servidor estático con Nginx

Creando el contenedor para Nginx

Para preparar un servidor web para servir contenido estático rápidamente, podemos recurrir a usar Nginx como contenedor de Docker.

Usando la imágen oficial de Nginx del repositorio de Docker podemos ver que montar un servidor estático es sencillo como instanciar el contenedor montando la carpeta estática directamente sobre la carpeta pública de Nginx:

docker run -d \
    -p 0.0.0.0:12880:80 \
    -v /home/user/workspace/superproject/html:/usr/share/nginx/html \
    nginx:1.12.1

Siendo la carpeta /home/user/workspace/superproject/html la contenedora de nuestro contenido estático.

Una vez ejecutado el comando, si entramos en nuestro navegador en la dirección http://127.0.0.1:12880, podremos navegar por nuestro contenido estático.

Evitando los errores 404

Los lenguajes dinámicos del lado del servidor como PHP, Python, etc., gestionan correctamente los errores 404, mostrando una página personalizada o redigiendo a otra página con información de posibles enlaces de interés según el punto de entrada del usuario. Con contenido estático no tenemos esa posibilidad, pero aprovecharemos Nginx para redirigir los errores 404 a una vista personalizada o marcarlos como 301 para marcarlos como redirección permanente.

Para este cometido, extenderemos la imágen oficial de Nginx, añadiendo nuestra configuración con la gestión de los 404, aprovechamos también para cambiar la carpeta por defecto de Nginx a /code.

Creamos un archivo Dockerfile en nuestra carpeta de proyecto con el siguiente contenido:

FROM nginx:1.14.0
MAINTAINER Albert Lacarta <albert.lacarta@rqlogic.com>

ADD nginx_default /etc/nginx/conf.d/default.conf
RUN mkdir -p /code

Añadimos en la misma carpeta que el Dockerfile, el archivo nginx_default con la siguiente configuración:

server {
    # Escuchamos todas las conexiones en el puerto 80    
    listen 80 default;

    # Carpeta donde reside el contenido estático
    root /code;

    index index.html;

    # Definimos la acción a tomar cuando sea un error 404, referido al location @custom404
    error_page 404 @custom404;

    # Compresión GZIP para reducir el uso de ancho de banda
    gzip             on;
    gzip_comp_level  2;
    gzip_min_length  1000;
    gzip_proxied     expired no-cache no-store private auth;
    gzip_types       text/plain application/x-javascript text/xml text/css application/xml;

    # Redirección con código 301 (redirección permanente)
    location @custom404 {
        #Reemplazar con el dominio del host
        rewrite .* http://tudominio.com permanent;
    }

    # Intenta cargar la $uri recibida, y si no la encuentra, carga la redirección a / con 301
    location / {
        try_files $uri $uri/ @custom404;
    }

    # Ficheros de log
    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

Podemos construir la imagen para guardarla en nuestro repositorio local de Docker con :

docker build -t rqlogic/superimagen-nginx .

Una vez en nuestro repositorio volvemos a ejecutar el run, pero ahora con el nuevo directorio y el nombre de la imagen:

docker run -d \
    -p 0.0.0.0:12880:80 \
    -v /home/user/workspace/superproject/html:/code \
    rqlogic/superimagen-nginx

Ahora todas las url que no tengamos como contenido estático definidas generarán un código HTTP 301 (Redirección permanente) y devolverán el índice de nuestra aplicación. Podemos cambiar el rewrite de la localización @custom404 para poder ir a una página personalizada con más enlaces, recomendaciones, etc.

Leave a comment