Introducción

En esta entrada vamos a realizar una variante de este post en el que lo haremos desde por completo con una receta de ansible y sustituyendo apache por nginx.

Descripción del escenario

  1. Vamos a utilizar como base la receta de ansible de este post y la vamos a modificarla para añadirle las siguientes funcionalidades:
  • Instalamos los servicios (con roles diferenciados).

  • Copiamos un index en el DocumentRoot y un info.php.

  • La receta de ansible debe desactivar los virtualhost que tengamos definidos en otra lista.

  1. Configuramos sobre una máquina virtual, un servidor ngix con PHP con dos virtualhost:
  • www.pagina1.org, cuyo DocumentRoot es /srv/www/pagina1.org.
  • www.pagina2.org, cuyo DocumentRoot es /srv/www/pagina2.org.
  1. Una vez configurada la receta, debemos configurar de forma manual las siguientes características:
  • Cuando accedamos a www.pagina1.org se redireccionará a www.pagina2.org/principal. No se permitirá ver la lista de ficheros.
  • Cuando accedamos a `www.pagina1.org/principal se debe mostrar una página web estática.
  • Si accedemos a la página www.pagina2.org/principal/documentos se visualizarán los documentos que tengamos en /srv/doc. Y se permitirá el listado y el seguimiento de enlaces simbólicos.
  • Limitaremos el accero a www.pagina1.org/principal/secreto con autenticación básica.

La receta de ansible

Ya ejecutada la receta, y habiendo cambiando el fichero hosts para que apunte a la máquina virtual, podemos comprobar que tenemos instalado el servidor nginx con PHP. Y vamos a realizar las siguientes comprobaciones:

  1. Los virtualhost que tenemos definidos en la receta de ansible, están creados y funcionando correctamente.

  1. Comprobamos que al acceder a www.pagina1.org se produce la redirección a www.pagina1.org/principal.

Si lo que queremos es que nginx redireccione a otra página, debemos añadir la siguiente línea en el fichero de configuración del virtualhost:

   server {
    rewrite ^/$ /principal redirect;

    location / {
        try_files $uri $uri/ =404;
        autoindex off;
        disable_symlinks if_not_owner from=$root;
    }
}

  1. Si accedemos a la página www.pagina1.org/principal/documentos se visualizarán los documentos que tengamos en /srv/doc. Y no se permitirá el listado y el seguimiento de enlaces simbólicos.
  • Creamos el directorio y le cambiamos los permisos:
mkdir /srv/doc
chown www-data:www-data /srv/doc
  • Creamos un fichero en el directorio /srv/doc y lo enlazamos simbólicamente en el directorio /srv/www/pagina1.org/principal/documentos.
echo "Hola Mundo" > /srv/doc/doc1.txt
  • Modificamos el fichero pagina1.conf para que liste los ficheros del directorio /srv/doc.
location /principal/documentos {
    alias /srv/doc;
    autoindex on;
}

  1. Limitaremos el acceso a www.pagina1.org/secreto en nginx con autenticación básica.
  • Creamos un fichero .htpasswd con el usuario y la contraseña que queramos dentro de */secreto.
htpasswd -c -b -B /srv/www/pagina1/secreto/.htpasswd maria admin
  • Modificamos el fichero pagina1.conf para que se aplique la autenticación básica y accederemos al index de www.pagina1.com/secreto.
location /secreto {
    auth_basic "Acceso restringido";
    auth_basic_user_file /srv/www/pagina1/secreto/.htpasswd;
}

Tras todas las modificaciones, el fichero pagina1.conf quedaría de la siguiente forma:

server {
    listen 80;
        root /srv/www/pagina1;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name pagina1.org www.pagina1.org;

        rewrite ^/$ /principal redirect;

        error_log /var/log/nginx/error_pagina1.log;
        access_log /var/log/nginx/access_pagina1.log;

        location / {
            try_files $uri $uri/ =404;
            autoindex off;
            disable_symlinks if_not_owner from=$root;
        }
       location /principal/documentos {
            autoindex on;
            alias /srv/doc;
        }

        location /secreto {
            try_files $uri $uri/ =404;
            auth_basic "Acceso restringido";
            auth_basic_user_file /srv/www/pagina1/secreto/.htpasswd;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        }
}

Para finalizar

Como podemos ver el virtualhost www.pagina2.org está activo.

Pero, vamos a cambiar la receta de ansible para desactivar el acceso a la página www.pagina2.org de la siguiente manera:

  1. Vamosa modificar el all.yaml para que se desactive.
del_virtualhost:
  - name: pagina2
  1. En el main.yaml vamos a añadir la siguiente tarea:
- name: Delete vhost pagina2
  file:
    path: /etc/nginx/sites-enabled/{{ item["name"] }}.conf
    state: absent
  with_items:
    - "{{ del_virtualhost }}"
  notify:
    - restart nginx
  1. Ejecutamos la receta de ansible.

Y como podemos ver, el virtualhost www.pagina2.org ya no está activo.

La receta de ansible la podemos encontrar en el siguiente repositorio.