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:
- Un software que le ayuda a mantener servidores como Forge (https://forge.laravel.com/);
- Un enfoque sin servidor, utilizando Vapor (https://vapor.laravel.com/);
- Una plataforma de aplicaciones como la plataforma de aplicaciones DigitalOcean (https://www.digitalocean.com/products/app-platform/)
- Una máquina virtual Linux proporcionada por DigitalOcean Droplets.
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…
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.
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.
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
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.