Función de fechas PHP para comparar tiempo transcurrido.

Automatizando la Creación de Virtual Hosts en Nginx con un Script Bash

Si trabajas con servidores Nginx y necesitas configurar múltiples dominios locales para desarrollo, escribir las configuraciones manualmente puede ser tedioso. En este post, te mostraré cómo crear un script Bash que automatiza la creación y despliegue de virtual hosts en Nginx con PHP 8.3-FPM.

El Script

Este script tiene varias funciones para hacer que un solo comando genere lo necesario para poner un dominio local en funcionamiento y cree el host a donde va a apuntar el dominio local. A continuación describo lo que hará el script.

  • Crea un archivo de configuración en /etc/nginx/sites-available/
  • Lo enlaza en /etc/nginx/sites-enabled/.
  • Agrega el dominio al archivo /etc/hosts.
  • Verifica la configuración de Nginx y recarga el servicio.

Para empezar vamos a necesitar algunas rutas y validación de datos requeridos por el script, empezamos con la validación

#!/bin/bash

# Verifica si se pasaron los parámetros correctos
# Nombre del Host local
# Ruta donde esta el proyecto
if [ "$#" -ne 2 ]; then
    echo "El nombre de domino y la ubicación del proyecto son requeridos:"
    echo "$0 dominio.local ruta_proyecto_relativa"
    exit 1
fi
# Creamos las varibles a ocupar, Los nombres los puedes personalizar.
DOMINIO="$1"
RUTA_RELATIVA="$2"
USUARIO=$(whoami)
HOME_DIR="/home/$USUARIO"
RUTA_COMPLETA="$HOME_DIR/$RUTA_RELATIVA"
NGINX_SITES_AVAILABLE="/etc/nginx/sites-available"
NGINX_SITES_ENABLED="/etc/nginx/sites-enabled"
VHOST_CONF="$NGINX_SITES_AVAILABLE/$DOMINIO"

# Verifica si la carpeta del proyecto existe
if [ ! -d "$RUTA_COMPLETA" ]; then
    echo "Error: La carpeta del proyecto no existe en $RUTA_COMPLETA"
    exit 1
fi

Bien, si las validaciones pasan correctamente vamos a proceder a la creación del archivo de configuración del v-Host y a realizar la configuración en Nginx para que este lo reconozca como un archivo de configuración


# Crea el archivo de configuración del vhost
sudo tee "$VHOST_CONF" > /dev/null <<EOL
server {
    listen 80;
    server_name $DOMINIO;
    root $RUTA_COMPLETA/public;
    index index.php index.html index.htm;
    
    location / {
        try_files \$uri \$uri/ /index.php?\$query_string;
    }

    location ~ \\.php\$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}
EOL

# Enlaza el vhost en sites-enabled
sudo ln -s "$VHOST_CONF" "$NGINX_SITES_ENABLED/"

Con esto creamos el archivo del v-Host y lo enlazamos a producción del servidor Nginx, ahora solo nos queda agregar el dominio al archivo host del sistema para que apunte a mi misma máquina y reiniciar el servicio de Nginx para que tome la nueva configuración, bien vamos a ver cómo quedaría.

# Agrega el dominio al archivo /etc/hosts si no está presente
if ! grep -q "$DOMINIO" /etc/hosts; then
    echo "127.0.0.1 $DOMINIO" | sudo tee -a /etc/hosts > /dev/null
    echo "Dominio $DOMINIO agregado a /etc/hosts"
fi

# Verifica la configuración y recarga Nginx
sudo nginx -t && sudo systemctl reload nginx

echo "Vhost para $DOMINIO creado y habilitado con éxito."

Listo con esto ya tenemos el script para generar toda la configuración de un nuevo host que usemos de manera local con nginx y php.

Ahora solo quedaría configurarlo para poder ejecutarlo en la línea de comandos y pasar los parámetros, esto quedaría de la siguiente manera.

🛠️ Instalación del Script como Comando Global

Para que este script se pueda ejecutar desde cualquier parte del sistema como un comando, sigue estos pasos:

  1. Mueve el script a /usr/local/bin/ y dale permisos de ejecución:

    sudo mv crear_vhost.sh /usr/local/bin/crear_vhost
    sudo chmod +x /usr/local/bin/crear_vhost
  2. Ahora puedes ejecutarlo desde cualquier ubicación con:

    crear_vhost midominio.local Proyectos/midominio

🔍 Uso del Script

Para crear un nuevo virtual host, simplemente usa:

crear_vhost midominio.local Proyectos/midominio

Esto hará que el dominio midominio.local apunte a ~/Proyectos/midominio/public, permitiéndote acceder a él desde tu navegador.

Espero que esto les funcione para automatizar algo de sus tareas diarias.