Skip to content

🚀 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.