Máquina virtual: Configure para Laravel 8

máquina virtual

Configure una máquina virtual para Laravel 8 con Ubuntu 20.04, PHP8, Nginx y MySql

El objetivo es configurar una máquina virtual GNU/Linux con Ubuntu 20.04 LTS, PHP8, Nginx y MySql para servir una aplicación Laravel 8. Para el servidor web, usaremos Nginx, por lo que necesitaremos php-fpm.


Hay algunas formas de lograrlo, podría considerar usar:

Para mis proyectos paralelos, usualmente uso DigitalOcean Droplets porque:

  • Es un enfoque “manual”, pero uno de mis objetivos, cuando trabajo en un proyecto paralelo, es aprender y comprender los procesos / herramientas / configuraciones “bajo el capó”;
  • Los costos son predecibles;
  • Me gusta ensuciarme las manos en mi proyecto paralelo.

Para mis proyectos de trabajo, suelo elegir soluciones “gestionadas”.

Un pensamiento sobre la automatización. Soy un fanático de “automatizar todo”. Pero antes de automatizar un proceso, una configuración o un flujo de trabajo, creo que debemos averiguar qué está pasando bajo el capó.

Configurar Droplet

Como mencioné antes, vamos a usar un Droplet de DigitalOcean. Un droplet es esencialmente una máquina virtual con un sistema operativo donde puede agregar su pila de software, con herramientas y aplicaciones proporcionadas por el sistema operativo. En nuestro caso, seleccionaré Ubuntu 20.04, por lo que agregaré software con Apt. Cuando crea un Droplet, puede seleccionar algunos parámetros, como el sistema operativo, el tamaño de la máquina virtual (cpu/memoria), la ubicación del centro de datos…

máquina virtual
Al crear una droplet, debe seleccionar algunas opciones

La configuración más barata (pero con menos rendimiento):

  • Elija imagen: Distribuciones Ubuntu 20.04 LTS
  • Elija un plan: CPU básica compartida – 5 $ / mes (1 GB, 1 CPU, disco SSD de 25 GB, transferencia de 1000 GB)
  • Elija una región del centro de datos: Frankfurt 1 (la más cercana a Italia), si desea realizar una prueba de velocidad, puede usar esta herramienta: http://speedtest-fra1.digitalocean.com/
  • Autenticación, puede elegir las claves SSH si puede cargar su clave pública; de lo contrario, puede usar la forma clásica de inicio de sesión / contraseña para el usuario root.
máquina virtual
El método de autenticación. Mi sugerencia es usar claves SSH en lugar de una contraseña compleja muy larga.

Una vez que cree el Droplet, podrá ver su nueva dirección IPv4.

Esto es muy importante para acceder a su nueva máquina virtual.

El primer acceso

Si seleccionó el método de autenticación de clave SSH en lugar de inicio de login/password, cuando creó su droplet, le sugiero crear un alias SSH en su máquina para tener un acceso directo para definir el nombre de usuario “ssh”, la dirección IP y la clave a utilizar para acceder a su máquina virtual.

En este caso, en su ~/.ssh/config, agregue estas líneas:

host <alias_name>
    HostName <ip_address>
    User <user_name>
    IdentityFile <key_file>

Dónde:

  • <alias_name> es el nombre que se usa cuando inicia ssh;
  • <ip_address> la dirección IP proporcionada por el Droplet;
  • <user_name> el usuario, para la configuración inicial está bien usar root. Durante el proceso de instalación crearemos un usuario “no root”;
  • <key_file> el archivo de clave ssh, en mi caso es ~/.ssh/id_rsa_sideproject_dev;

Para acceder a su Droplet puede usar ssh:

ssh <alias_name>

Con el primer acceso, se le pedirá una pregunta sobre la creación de la huella digital de la clave ECDSA. Seleccione “sí” para aceptarlo.
Si seleccionó el método de inicio de sesión / contraseña en lugar de las claves SSH, puede usar ssh root @ <ip_address> para acceder a su VM.

Actualice los paquetes de su sistema

En primer lugar, le sugiero que actualice sus paquetes con el comando Apt (estamos usando Ubuntu, por lo que tenemos Apt). Con el primer acceso estás usando un usuario “root”, por lo que por ahora no necesitas usar sudo.

apt-get update
apt-get upgrade

Ahora, podemos comenzar con la instalación de todos los paquetes necesarios:

  • Nginx
  • PHP 8 (fpm) (y los módulos que necesita Laravel 8)
  • MySql 8

Está instalando algunos servicios, por lo que mi sugerencia es configurar también el firewall.

Instalar Nginx

apt-get install nginx

Opcional: si desea alojar varios dominios (o subdominios), le sugiero que cree un directorio para cada subdominio que desee servir con Nginx. De todos modos, el directorio predeterminado es: /var/www/html/. Entonces, después de instalar Nginx, intente ir a su URL http://<ip_address>, verá el archivo html predeterminado servido por nginx desde el directorio/var/www/html.

máquina virtual
La página de bienvenida de una nueva instalación nueva de Nginx

Vamos a instalar Laravel, por lo que debemos establecer public / como raíz del documento.

mkdir -p /var/www/mydomain/htdocs/public

En este caso:

  • /var/www/mydomain/ htdocs será el directorio donde se copiará su aplicación Laravel;
  • /var/www/mydomain/htdocs/public será la raíz del documento.

Instalar PHP 8

Acabamos de instalar Ubuntu 20.04 que incluye PHP 7.4. Antes de instalar PHP, necesitamos agregar un repositorio para tener la oportunidad de instalar PHP 8. Así que instalaremos PHP desde el repositorio PPA ondrej/php. Para habilitar el repositorio y los paquetes de actualización:

apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt update
apt upgrade

Ahora puede instalar PHP 8:

apt install php8.0-fpm

Para probar si tiene PHP 8:

php -v
Tu nuevo PHP 8

Para comprobar si PHP-fpm está funcionando:

systemctl status php8.0-fpm

Ahora podemos instalar todas las dependencias PHP para su aplicación Laravel 8:

apt-get install php8.0-mysql php8.0-mbstring php8.0-xml php8.0-bcmath

Configurar Nginx y PHP 8 fpm

Ahora está utilizando el usuario root y podría estar bien para la configuración inicial. Sugiero crear un usuario sin privilegios para iniciar sesión en el sistema y acceder al directorio donde se implementa su aplicación Laravel.

adduser deploy
usermod -aG www-data deploy
chown -R deploy:www-data /var/www/mydomain/

Ahora centrémonos en la configuración de Nginx, podemos comenzar desde la configuración predeterminada para Nginx y luego la personalizaremos:

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mydomain

Edite su nuevo archivo siguiendo este ejemplo:

server {
        listen 80;
        listen [::]:80;
        # SSL configuration
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        # Set root directive with your /public Laravel directory
        root /var/www/ghygen.hi-folks.dev/htdocs/public;
        # Set index directive with index.php
        index index.php;
        # Set server_name directive with the hostname
        server_name ghygen.hi-folks.dev;
        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }
        # pass PHP scripts to FastCGI server
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        }
        location ~ /\.ht {
                deny all;
        }
}

Luego, debe crear un enlace simbólico para activar la nueva configuración (eche un vistazo a los sitios disponibles VS. sitios habilitados):

ln -s /etc/nginx/sites-available/mydomain /etc/nginx/sites-enabled/

Si desea verificar la sintaxis de su configuración:

nginx -t

Para reiniciar Nginx y cargar su nueva configuración:

service nginx restart

Instalar base de datos

Vamos a instalar el servidor MySql 8:

apt install mysql-server
mysql_secure_installation

Durante la ejecución de este script, le pedirá que escriba la contraseña de la base de datos raíz. Cuando se complete la ejecución, intente acceder a su servidor de base de datos:

mysql -u root -p

Y escriba la nueva contraseña para acceder a la consola de administración de la base de datos. En la consola de administración de la base de datos:

  • Crear la base de datos db_laravel8;
  • Crear el usuario para acceder a la base de datos (userdb) con la contraseña somepassword
  • Otorgar los privilegios adecuados al nuevo usuario;
CREATE DATABASE db_laravel8;
CREATE USER 'userdb'@'localhost' IDENTIFIED BY 'somepassword';
GRANT ALL PRIVILEGES ON * . * TO 'userdb'@'localhost';
FLUSH PRIVILEGES;

Configurar Firewall

Abra solo puertos HTTP y SSH:

ufw allow 'Nginx HTTP'
ufw allow 'OpenSSH'

Activar el firewall:

ufw enable

Y finalmente verifique el estado:

ufw status

La salida debería ser algo como esto:

Status: active
To Action From
 — — — — — — 
Nginx HTTP ALLOW Anywhere
OpenSSH ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)

Configurar HTTPS

Para el proyecto paralelo, generalmente uso https://letsencrypt.org/ para obtener el certificado para habilitar el protocolo HTTPS.

Como root, para instalar la herramienta para instalar el certificado, ejecute:

apt-get install certbot python3-certbot-nginx

Si necesita instalar un certificado para el nombre de host host.midominio.com:

certbot --nginx -d host.mydomain.com

Este comando actualizará también el archivo de configuración de Nginx (habilitando la escucha de directivas en el puerto 443 y el certificado de carga recién creado).

También necesita abrir su firewall para puertos HTTPS:

ufw allow 'Nginx HTTPS'

Envuelto

Si siguió estos pasos:

  • Crear una máquina virtual en DigitalOcean con Ubuntu 20.04 LTS
  • Instalar Nginx para servir archivos a través de HTTP;
    instalado PHP8 y los módulos necesarios para Laravel 8
  • Instalar el servidor MySql 8;
  • Configurar Nginx para servir archivos PHP y un directorio específico donde podemos copiar archivos Laravel;
  • Configurar un usuario sin privilegios para acceder a la VM;
  • Configurar un usuario de base de datos y cree una nueva base de datos para usarla con la aplicación Laravel (recuerde actualizar su archivo .env con DB_NAME, DB_USER, DB_PASSWORD);
  • Configurar HTTPS para servir la aplicación Laravel.

Ahora puede implementar su aplicación en /var/www/mydomain/htdocs.


Siéntase libre de dejar comentarios y sugerencias, podría mejorar este tutorial.

Recent Post