Publicidad

Laravel sail configurar multidominio con Apache


Por Alex el 24/04/2024, Comentar el artículo

Comparte este artículo:      




Laravel sail por defecto no se pueden utilizar múltiples dominios y viene configurado para utilizar solo localhost pero esto podemos cambiarlo de forma fácil trabajando con nuestra propia configuración de docker.


Y esto es así porque para crear un servidor web utilizada el del propio Laravel, internamente ejecuta php artisan serve

Voy a utilizar el proyecto del artículo anterior sobre Sail, un proyecto recién creado e instalado Laravel sail
Laravel sail, un entorno de desarrollo con docker y laravel, también dejo el código en Github de la estructura del proyecto.


Si miramos dentro del contenedor conectándonos con sail shell y ejecutamos el comando

ps -ef | grep php

Veréis lo que os digo del servidor de Laravel.

Servidor de PHP en Laravel sail

y si buscamos apache o nginx o http no encontraremos nada.

Para poder utilizar múltiples dominios se necesita Apache2 o Nginx, en este artículo utilizaremos Apache2 con los virtualhost.

Necesitamos copiarnos los ficheros de configuración de Laravel sail a nuestro proyecto.

Estos ficheros de configuración se alojan en el directorio vendor.

Directorio vendor de Laravel sail

pero este directorio no se puede modificar por eso haremos una copia dentro de nuestro proyecto con el comando que proporciona Laravel saill para esto

sail artisan sail:publish

Este comando crea una carpeta nueva en la raíz de nuestra aplicación llamada docker donde guarda los ficheros de configuración y construcción de docker

y donde nosotros podremos crear los ficheros de configuración que necesitemos como por ejemplo para los virtualhost

Directorio docker en raiz de Laravel sail

La versión de php que utiliza es la ultima que sail tenga configurada pero en el fichero docker-composer.yml podemos cambiarla modificando el campo build -> context

Hay que verificar que en esa sección ahora apunta a la nueva carpeta docker y no a vendor que es la original

Docker context apuntado al directorio docker en raiz del proyecto

En el ejemplo utilizaremos la 8.3 y dentro de esa carpeta modificaremos los ficheros que necesitemos.

Para cambiar la forma que se ejecuta el servidor con hay que modificar el fichero Dockerfile que se encuentra en el directorio ./docker/8.3 porque utiliza la versión de PHP 8.3, si queréis otra versión hay que modificar el dockerfile de esa versión.

Empezando desde arriba del fichero lo primero que hacemos es comentar las líneas donde se ejecutará el servidor de PHP, líneas 12 y 13

Comentando opciones del fichero Dockerfile que no necesitamos

A continuación añadimos en el proceso de instalación los paquetes para instalar Apache2

apache2 libapache2-mod-php apache2-dev

Yo lo añado justo después del install -y en la línea 20

Añadiendo opciones al fichero Dockerfile que  necesitamos

Después de que instale todo esto, a partir de la línea 52 hay que añadir el siguiente comando

RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

Y al final del fichero Dockerfile cambiamos las directivas EXPOSE y ENTRYPOINT por estas

EXPOSE 80
ENTRYPOINT ["apache2ctl", "-D", "FOREGROUND"]

Ahora creamos un fichero para guardar los virtualhost, para definir todos los dominios que necesitemos y este fichero, yo lo he llamado apache.conf y ponemos el siguiente código

<VirtualHost *:80>
  # Basic setup
  ServerName lara-base.local
  DocumentRoot /var/www/html/public
  DirectoryIndex index.php

  <Directory /var/www/html/public>
    Order Deny,Allow
    Allow from all
    #Don't show indexes for directories
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Require all granted
  </Directory> 

  ErrorLog ${APACHE_LOG_DIR}/error_lara_base.log
  CustomLog ${APACHE_LOG_DIR}/error_lara_base.log combined
  #
</VirtualHost>

Por cada dominio o subdominio que necesites hay que añadir una directiva Virtualhost.

Ahora modificamos el fichero docker-compose.yml para añadir este fichero donde guardamos las configuraciones de los virtualhost de apache

En el apartado de volumes mapeamos el nuevo fichero

./docker/8.3/apache2.conf:/etc/apache2/sites-enabled/apache.conf

Añadiendo opciones al fichero Dockerfile que  necesitamos

Por último vamos a configurar la red añadiendo una IP fija para que podamos conectar por el nombre de dominio.

Para modificar la red hay que modificar el apartado network con lo siguiente

networks:
    redsail:
        ipv4_address: 172.23.0.3

Y en la sección para MySql hacemos lo mismo cambiando la IP

networks:
    redsail:
        ipv4_address: 172.23.0.2

Y en la sección networks ponemos lo siguiente

networks:
    redsail:
        driver: bridge
        ipam:
            config:
                - subnet: 172.23.0.0/16
                  gateway: 172.23.0.1

Ahora vamos a probarlo ejecutando

sail up -d

Nota: si previamente hay realizadas pruebas con Sail tendremos que reconstruir los contenedores con el comando

sail build

Una vez construidos los contenedores los arrancamos

sail up -d

Solo nos queda asociar la IP del contenedor al nombre de dominio que hemos puesto en el fichero de configuración de Apache2, lara-base.local, lo tenemos que poner el fichero /etc/hosts

Desde el terminal ejecutar:

echo "172.23.0.3 lara-base.local" >> /etc/hosts

Nota: esto del echo creo que no sirve en windows y tenéis que editar el fichero etc directamente

Y con esto ya se puede probar la url que hemos asignado a nuestro proyecto, en el ejemplo: http://lara-base.local/

Añadir nuevos dominios es tan sencillo como crear una nueva entrada, un nuevo virtualhost, en el fichero apache.conf, relacionarlo en el fichero /etc/hosts y configurar el fichero de rutas en la Laravel.


Vamos a ver un ejemplo

Tenemos el dominio original lara-base.local y creamos un nuevo dominio lara-dos.local.

Configuramos el segundo dominio en los ficheros de configuración del proyecto, en el fichero apache.conf dentro de la carpeta ./docker/8.3 y añadimos un nuevo virtualhost

<VirtualHost *:80>
  # Basic setup
  ServerName lara-dos.local
  DocumentRoot /var/www/html/public
  DirectoryIndex index.php

  <Directory /var/www/html/public>
    Order Deny,Allow
    Allow from all
    #Don't show indexes for directories
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Require all granted
  </Directory> 

  ErrorLog ${APACHE_LOG_DIR}/error_lara-dos.log
  CustomLog ${APACHE_LOG_DIR}/error_lara-dos.log combined
  #
</VirtualHost>


Lo único que hay que hacer es cambiar la palabra base por dos y copiar todo el contenido igual.

Y añadimos la entrada en el fichero /etc/hosts

echo "172.23.0.3 lara-dos.local" >> /etc/hosts

En el directorio ./resources/views creamos dos nuevos ficheros base.blade.php y dos.blade.php, dentro podéis poner el nombre de fichero para cuando hagamos referencia a las urls desde el navegador ver que se carga el fichero correcto.

En el fichero de rutas añadimos las rutas para los dos dominios que vamos a utilizar

Route::domain('lara-base.local')->group(function () {
    Route::get('/', function () {
        return  view('base');
    });
});

Route::domain('lara-dos.local')->group(function () {
    Route::get('/', function () {
        return  view('dos');
    });
});

Solo queda reiniciar los contenedores y probarlo

sail down
sail up -d

Probar las URLs http://lara-base.local y http://lara-dos.local

Probando los dos dominios en el proyecto Laravel sail

Dejo el código del proyecto en Github para que podáis ver y utilizar los ficheros de configuración

Y esto es todo, feliz programming
Saludos
Alex
/

Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.