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
- 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.
- 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
.
- Una vez configurada la receta, debemos configurar de forma manual las siguientes características:
- Cuando accedamos a
www.pagina1.org
se redireccionará awww.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.
- Cuando accedamos a
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.
-
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;
}
}
-
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;
}
-
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:
- Vamosa modificar el all.yaml para que se desactive.
del_virtualhost:
- name: pagina2
- 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
-
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.