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