EJECUTA VARIAS VERSIONES DE LARAVEL EN UN SERVIDOR LOCAL CON UBUNTU 20.04
Introducción
A veces necesitamos trabajar con diferentes versiones de Laravel por diversos motivos, como que el servidor web instala algunas versiones de Laravel de forma predeterminada, ya sea por las prestaciones del servidor, actualizaciones, etc… o que tomaste un proyecto de algún cliente con alguna versión específica de Laravel. Así que en esta publicación te explicaré cómo puedes lograr instalar Laravel con las diferentes versiones que ofrece, para que puedas practicar con diferentes entornos de desarrollo.
Requisitos
- 1 pila LAMP instalada y correctamente configurada.
- 1 instalación de diferentes versiones de PHP con PHP-FPM.
- 1 instalación de Composer 2.
Paso 1: Crear un ServerName de prueba que apunte a localhost de Ubuntu 20.04
En este paso crearemos y apuntaremos los nombres del servidor en el servidor local de Ubuntu 20.04, los cuales se encargarán de servir Laravel en sus diferentes versiones. Así que manos a la obra… o más bien dedos a la obra.
Primero en nuestra bash abrimos como superausuario con el editor de nuestra preferencia (en mi caso gedit) el archivo hosts
sudo gedit /etc/hosts
Una vez abierto veremos algo similar a esto:
127.0.0.1 localhost
127.0.1.1 nombre-de-tu-equipo
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Ahora debajo de la línea que dice localhost podemos incluir los nombres de servidor que deseemos probar, del siguiente modo:
127.0.0.1 localhost
#Versiones Laravel de prueba
127.0.0.1 nombre-de-tu-proyecto-1.tu-dominio.com
127.0.0.1 nombre-de-tu-proyecto-2.tu-dominio.com
127.0.0.1 nombre-de-tu-proyecto-3.tu-dominio.com
127.0.1.1 nombre-de-tu-equipo
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Ejemplo:
127.0.0.1 localhost
#Versiones Laravel de prueba
127.0.0.1 laravel58.programadorvagabundo.com
127.0.0.1 laravel6.programadorvagabundo.com
127.0.0.1 laravel8.programadorvagabundo.com
127.0.1.1 nombre-de-tu-equipo
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Paso 2: Instalar las diferentes aplicaciones web de Laravel
Empezamos a crear los directorios raíz, para la instalación de nuestras diferentes aplicaciones de Laravel (que para esta publicación serán Laravel 5.8, Laravel 6 y Laravel 8).
Comenzamos ejecutando el siguiente comando:
sudo apt update
Una vez que hemos actualizado nos movemos a la carpeta /var/www/
que es donde se colocan los proyectos web en Apache.
cd /var/www/
Ahora procedemos a instalar las diferentes versiones de Laravel con Composer 2, sin embargo para poder instalar en el directorio /var/www/
con Composer 2 debemos cambiar los permisos de /var/www/
a 77
5 o la otra opción es que instalemos Laravel con Composer como superusuario y una tercera opción más sería instalarlo dentro de un directorio del sistema que tenga amplios permisos como el /tmp/
y luego moverlo con sudo a /var/www/
yo lo hice con la primera opción de la siguiente manera:
sudo chmod 775 /var/www/
Y ahora sí, ya podemos proceder a crear nuestras instalaciones de Laravel.
Para Laravel 5.8
composer create-project --prefer-dist laravel/laravel nombre-de-tu-proyecto-1 "5.8.*"
Ejemplo:
composer create-project --prefer-dist laravel/laravel laravel58 "5.8.*"
Para Laravel 6
composer create-project --prefer-dist laravel/laravel nombre-de-tu-proyecto-2 "6.*"
Ejemplo:
composer create-project --prefer-dist laravel/laravel laravel6 "6.*"
Para Laravel 8
composer create-project laravel/laravel nombre-de-tu-proyecto-3
Ejemplo:
composer create-project laravel/laravel laravel8
De forma predeterminada, el servidor web Apache se ejecuta como usuario www-data y grupo www-data. Para asegurarnos de contar con la propiedad y los permisos correctos de nuestros directorios raíz tenemos que cambiarlos así:
sudo chown -R www-data:www-data /var/www/nombre-de-tu-proyecto-1
sudo chown -R www-data:www-data /var/www/nombre-de-tu-proyecto-2
sudo chown -R www-data:www-data /var/www/nombre-de-tu-proyecto-3
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-1/storage
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-2/storage
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-3/storage
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-1/bootstrap/cache
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-2/bootstrap/cache
sudo chmod -R 775 /var/www/nombre-de-tu-proyecto-3/bootstrap/cache
Ejemplo:
sudo chown -R www-data:www-data /var/www/laravel58
sudo chown -R www-data:www-data /var/www/laravel6
sudo chown -R www-data:www-data /var/www/laravel8
sudo chmod -R 777 /var/www/laravel58
sudo chmod -R 777 /var/www/laravel6
sudo chmod -R 777 /var/www/laravel8
sudo chmod -R 775 /var/www/laravel58/storage
sudo chmod -R 775 /var/www/laravel6/storage
sudo chmod -R 775 /var/www/laravel8/storage
sudo chmod -R 775 /var/www/laravel58/bootstrap/cache
sudo chmod -R 775 /var/www/laravel6/bootstrap/cache
sudo chmod -R 775 /var/www/laravel8/bootstrap/cache
El propósito de tener un “Servidor en Local” es lograr un “Entorno de Desarrollo” y es por eso que el directorio
/var/www/
lo podremos dejar con los permisos77
5 al igual que los directorios nombre-de-tu-proyecto-1, nombre-de-tu-proyecto-2 y nombre-de-tu-proyecto-3. Esto con el fin de poder desarrollar nuestros proyectos en conjunto con otros programas como algún IDE o algún cliente FTP, etc. sin tener problemas de acceso por parte de algunos de estos programas a los directorios correspondientes de nuestros proyectos. Sin embargo en modo “Producción” debemos ser más cuidadosos y aumentar la seguridad disminuyendo los permisos en dichas carpetas a los permisos originales de/var/www/
de tu “Servidor de Producción” y los de tus proyectos.
Paso 3: Configurar Apache para las aplicaciones web de Laravel
En este paso nos toca crear los archivos de configuración del host virtual. Esto permitirá que los sitios web funcionen en simultáneo con dos versiones de PHP distintas para cada versión de Laravel (en caso de ser necesario).
Para que Apache sirva este contenido, es necesario crear un archivo de host virtual con las directivas correctas para Laravel. En vez de modificar el archivo de configuración predeterminado ubicado en /etc/apache2/sites-available/000-default.conf
, crearemos los archivos nuevos para cada uno de los proyectos correspondientes en el directorio /etc/apache2/sites-available/
.
Primero, crearemos un nuevo archivo de configuración de host virtual para el sitio web nombre-de-tu-proyecto
–1.tu-dominio.com
. Aquí, le indicaremos a Apache que ejecute el contenido usando php7.
2:
sudo gedit /etc/apache2/sites-available/nombre-de-tu-proyecto-1.tu-dominio.com.conf
Agregamos el siguiente contenido: Ponemos especial atención de que la ruta del directorio del sitio web, el nombre del servidor, la versión de PHP concuerden con la configuración que deseamos o necesitamos para nuestro proyecto, también es muy importante que el modo RewriteEngine este en On y que el parámetro RewriteBase apunte a la carpeta pública de su aplicación Laravel (/var/www/nombre-de-tu-proyecto-1/public/):
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@nombre-de-tu-proyecto-1.tu-dominio.com
ServerName nombre-de-tu-proyecto-1.tu-dominio.com
DocumentRoot /var/www/nombre-de-tu-proyecto-1/public/
<Directory /var/www/nombre-de-tu-proyecto-1/public/>
RewriteEngine On
RewriteBase /var/www/nombre-de-tu-proyecto-1/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-1_error.log
CustomLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-1_access.log combined
</VirtualHost>
Guardamos y cerramos el archivo.
En este proceso,
DocumentRoot
será el directorio de nuestro proyecto yServerAdmin
es un correo electrónico con el que administraremos el sitionombre-de-tu-proyecto-1.tu-dominio.com
yServerName
establece el dominio base para esta configuración de host virtual y el cual será buscado en el archivo/etc/hosts
. También creamos algunas directivas comoRewriteEngine, RewriteBase y AllowOverride
con el fin de que funcione correctamente los parámetros de configuración de Laravel incluidos en el archivo nombre-de-tu-proyecto-1/public/.htaccess es por ello que deben tener habilitado el modulo rewrite de Apache y finalmente una directivaSetHandler
para ejecutar PHP como servidor de procesos fastCGI.
Ejemplo:
sudo gedit /etc/apache2/sites-available/laravel58.programadorvagabundo.com.conf
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@laravel58.programadorvagabundo.com
ServerName laravel58.programadorvagabundo.com
DocumentRoot /var/www/laravel58/public/
<Directory /var/www/laravel58/public/>
RewriteEngine On
RewriteBase /var/www/laravel58/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/laravel58_error.log
CustomLog ${APACHE_LOG_DIR}/laravel58_access.log combined
</VirtualHost>
Ahora tenemos que repetir este paso para cada una de las diferentes versiones de Laravel.
El archivo de la configuración del host virtual para el sitio web nombre-de-tu-proyecto-2.tu-dominio.com
con php7.4
quedaría así:
sudo gedit /etc/apache2/sites-available/nombre-de-tu-proyecto-2.tu-dominio.com.conf
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@nombre-de-tu-proyecto-2.tu-dominio.com
ServerName nombre-de-tu-proyecto-2.tu-dominio.com
DocumentRoot /var/www/nombre-de-tu-proyecto-2/public/
<Directory /var/www/nombre-de-tu-proyecto-2/public/>
RewriteEngine On
RewriteBase /var/www/nombre-de-tu-proyecto-2/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-2_error.log
CustomLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-2_access.log combined
</VirtualHost>
Ejemplo:
sudo gedit /etc/apache2/sites-available/laravel6.programadorvagabundo.com.conf
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@laravel6.programadorvagabundo.com
ServerName laravel6.programadorvagabundo.com
DocumentRoot /var/www/laravel6/public/
<Directory /var/www/laravel6/public/>
RewriteEngine On
RewriteBase /var/www/laravel6/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/laravel6_error.log
CustomLog ${APACHE_LOG_DIR}/laravel6_access.log combined
</VirtualHost>
Y finalmente creamos el archivo de configuración host virtual para el sitio web nombre-de-tu-proyecto-3
con .tu-dominio.co
mphp8
, como sigue:
sudo gedit /etc/apache2/sites-available/nombre-de-tu-proyecto-3.tu-dominio.com.conf
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@nombre-de-tu-proyecto-3.tu-dominio.com
ServerName nombre-de-tu-proyecto-3.tu-dominio.com
DocumentRoot /var/www/nombre-de-tu-proyecto-3/public/
<Directory /var/www/nombre-de-tu-proyecto-3/public/>
RewriteEngine On
RewriteBase /var/www/nombre-de-tu-proyecto-3/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-3_error.log
CustomLog ${APACHE_LOG_DIR}/nombre-de-tu-proyecto-3_access.log combined
</VirtualHost>
Ejemplo:
sudo gedit /etc/apache2/sites-available/laravel8.programadorvagabundo.com.conf
<VirtualHost *:80>
ServerAdmin tu-correo-para-administracion@laravel8.programadorvagabundo.com
ServerName laravel8.programadorvagabundo.com
DocumentRoot /var/www/laravel8/public/
<Directory /var/www/laravel8/public/>
RewriteEngine On
RewriteBase /var/www/laravel8/public/
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php8.0-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/laravel8_error.log
CustomLog ${APACHE_LOG_DIR}/laravel8_access.log combined
</VirtualHost>
Prácticamente ya quedo, solo nos falta hacer lo más fácil, aunque no menos importante.
Ahora tenemos que activar los archivos de configuración para los hosts virtuales que acabamos de crear con:
sudo a2ensite nombre-de-tu-proyecto-1.tu-dominio.com
sudo a2ensite nombre-de-tu-proyecto-2.tu-dominio.com
sudo a2ensite nombre-de-tu-proyecto-3.tu-dominio.com
Ejemplo:
sudo a2ensite laravel58.programadorvagabundo.com
sudo a2ensite laravel6.programadorvagabundo.com
sudo a2ensite laravel8.programadorvagabundo.com
Posteriormente tenemos que deshabilitar el archivo de configuración predeterminada para apache (si es que no lo hemos hecho antes).
sudo a2dissite 000-default.conf
Por último tenemos que reiniciar el servicio de Apache para que se implementen los cambios:
sudo systemctl restart apache2
Paso 4: Probar las diferentes versiones de Laravel
Vamos a escribir en nuestro navegador web los sitios que creamos para visitarlos, por ejemplo:
http://nombre-de-tu-proyecto-1.tu-dominio.com
http://nombre-de-tu-proyecto-2.tu-dominio.com
http://nombre-de-tu-proyecto-3.tu-dominio.com
o si seguiste los ejemplos sería:
http://laravel58.programadorvagabundo.com
http://laravel6.programadorvagabundo.com
http://laravel8.programadorvagabundo.com
y deberías ver algo como esto:
Laravel 5.8
Laravel 6
Laravel 8
Y pues esto a sido todo, espero les sirva, bye.