Instalación de nginx con PHP con vagrant y ansible

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.
  2. 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:

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

    1

    2

    3

  • 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;
            }
        }
        

4

5

  • 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;
        }
        

6

7

8

  • 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;
    }
    

9

10

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.

11

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/.conf
        state: absent
      with_items:
        - ""
      notify:
        - restart nginx
    
  1. Ejecutamos la receta de ansible.

    12

    13

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

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