🚀 Despliegue de Laravel con PHP-FPM, MySQL y NGINX en una máquina remota
Esta guía explica paso a paso cómo desplegar manualmente una aplicación Laravel en un entorno real (sin Docker) en una máquina remota, utilizando PHP-FPM, MySQL y NGINX. El objetivo es replicar un entorno de producción funcional para Laravel, siguiendo buenas prácticas y cumpliendo con los criterios de evaluación de la UF2 y UF4.
El proyecto Laravel se instala en el directorio estándar de servidor: /var/www/html/laravel-proyecto
.
1️⃣ Preparación Inicial
🔐 Acceso a la máquina remota
ssh usuario@IP-del-servidor
🔸 Reemplaza usuario
por el nombre de usuario con permisos administrativos y IP-del-servidor
por la IP real.
📦 Instalación de paquetes básicos
apt update && apt upgrade -y
apt install -y nodejs npm curl nano git unzip mariadb-server nginx php8.2 php8.2-fpm php8.2-mysql php8.2-cli php8.2-mbstring php8.2-xml php8.2-curl composer
2️⃣ Clonar el proyecto Laravel
cd /var/www/html
rm -rf laravel-proyecto
sudo git clone https://gitlab.inf.edt.cat/usuario/laravel-proyecto.git
cd laravel-proyecto
chown -R www-data:www-data .
chmod -R 775 storage bootstrap/cache
cp .env.example .env
nano .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=
3️⃣ Configuración de Laravel
composer install
npm install
npm run build
composer require laravel/breeze --dev
php artisan breeze:install
php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan migrate --seed
4️⃣ Configuración de PHP-FPM
mkdir -p /run/php
chown -R www-data:www-data /run/php
chmod 755 /run/php
nano /etc/php/8.2/fpm/pool.d/www.conf
Asegúrate de tener:
listen = /run/php/php8.2-fpm.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
systemctl restart php8.2-fpm
5️⃣ Configuración de MariaDB
systemctl start mariadb
mysql_secure_installation
mariadb
CREATE DATABASE laravel_db;
GRANT ALL ON laravel_db.* TO 'root'@'localhost';
FLUSH PRIVILEGES;
6️⃣ Configuración de NGINX
mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
Archivo /etc/nginx/sites-available/laravel.conf
:
# Redirección HTTP ➝ HTTPS
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
# Bloque principal Laravel en HTTPS
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/public.crt;
ssl_certificate_key /etc/ssl/private.key;
root /var/www/html/laravel-proyecto/public;
index index.php index.html index.htm;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
error_page 401 403 404 = /errors/40x.html;
error_page 500 501 502 503 = /errors/50x.html;
location = /errors/40x.html {
root /var/www/html;
internal;
}
location = /errors/50x.html {
root /var/www/html;
internal;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
Activar la configuración:
ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/
unlink /etc/nginx/sites-enabled/default
nano /etc/nginx/nginx.conf
Dentro de http {}
:
include /etc/nginx/sites-enabled/*.conf;
7️⃣ Crear HTMLs de errores personalizados
mkdir -p /var/www/html/errors
nano /var/www/html/errors/40x.html
nano /var/www/html/errors/50x.html
Ejemplo 40x.html
:
<h1>Error 40X</h1><p>Página no autorizada o no encontrada</p>
Ejemplo 50x.html
:
<h1>Error 50X</h1><p>Ocurrió un error en el servidor</p>
8️⃣ Gestión dinámica de errores (opcional +1 punto)
Incluye en tu vista Blade:
<div id="error"></div>
<script>
fetch('/admin')
.then(res => {
if (!res.ok) {
document.getElementById('error').textContent = `Error ${res.status}`;
}
});
</script>
✅ Verificación Final
nginx -t
nginx -s reload
Accede a:
https://IP-del-servidor
🔁 Comandos útiles
pkill php-fpm8.2
pkill mysqld
nginx -s stop
php-fpm8.2
mysqld --user=mysql &
systemctl restart nginx
Documentación lista para cumplir los máximos criterios de la UF2 y UF4.