Servidores Dedicados y VPS15 de diciembre de 2025 52 vistas

Cómo instalar Laravel en un VPS Linux (Debian 13 / Ubuntu 24.04)

Cómo instalar Laravel en un VPS Linux (Debian 13 / Ubuntu 24.04)

Cómo instalar Laravel en un VPS Linux (Debian 13 / Ubuntu 24.04)

Tiempo estimado: 30-45 minutos
Dificultad: Intermedia ⭐⭐
Sistema: Debian 13 (Trixie) / Ubuntu 24.04 LTS


📋 Introducción

Esta guía explica cómo instalar Laravel 12 (última versión) en un VPS Linux con Debian 13 o Ubuntu 24.04. Al finalizar este tutorial, tendrá un entorno de producción listo con:

  • PHP 8.3 (requerido para Laravel 12)
  • Composer (gestor de dependencias PHP)
  • Nginx (servidor web de alto rendimiento)
  • MariaDB (base de datos)
  • Laravel 12 (framework PHP)

Requisitos previos

Requisito Descripción
🖥️ VPS Linux Debian 13 o Ubuntu 24.04 con acceso root
🔑 Acceso SSH Conexión como root o usuario sudo
🌐 Nombre de dominio (Opcional) Para acceder a través de una URL
💾 RAM Mínimo recomendado 1 GB
💿 Almacenamiento Mínimo 10 GB

Configuración necesaria para Laravel 12

Componente Versión mínima
PHP 8.2 (se recomienda 8.3 o 8.4)
Composer 2.x
Base de datos MySQL 5.7+ / MariaDB 10.3+ / PostgreSQL 10+ / SQLite 3.26+

🔄 Paso 1: Actualizar el Sistema

Antes de cualquier instalación, actualice su sistema.

Conexión SSH

ssh root@your-server-ip

Actualizar los paquetes

# Actualizar la lista de paquetes
apt update

# Actualizar los paquetes instalados
apt upgrade -y

Resultado esperado: Todos los paquetes están actualizados.


🐘 Paso 2: Instalar PHP 8.3

Laravel 12 requiere PHP 8.2 como mínimo. Vamos a instalar PHP 8.3 para un mejor rendimiento.

Para Debian 13

Debian 13 (Trixie) incluye PHP 8.4 por defecto. Para instalar PHP 8.3, agregue el repositorio Sury:

# Instalar las dependencias
apt install -y apt-transport-https lsb-release ca-certificates curl gnupg


# Descargar la clave GPG del repositorio Sury
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/sury-php.gpg


# Agregar el repositorio Sury
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list


# Actualizar la lista de paquetes
apt update

Para Ubuntu 24.04

Ubuntu 24.04 incluye PHP 8.3 por defecto. Si desea una versión más reciente, agregue el PPA de Ondřej:

# Instalar las dependencias
apt install -y software-properties-common


# Agregar el PPA de PHP (opcional para PHP 8.4)
add-apt-repository ppa:ondrej/php -y


# Actualizar la lista de paquetes
apt update

Instalar PHP 8.3 y las extensiones necesarias

apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common \
    php8.3-mysql php8.3-pgsql php8.3-sqlite3 \
    php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml \
    php8.3-zip php8.3-bcmath php8.3-intl php8.3-readline \
    php8.3-tokenizer php8.3-opcache
Extensión Utilidad
php8.3-fpm Administrador de procesos FastCGI (para Nginx)
php8.3-mysql Conexión MySQL/MariaDB
php8.3-curl Peticiones HTTP
php8.3-gd Manipulación de imágenes
php8.3-mbstring Cadenas multibyte (UTF-8)
php8.3-xml Procesamiento XML
php8.3-zip Compresión ZIP
php8.3-bcmath Cálculos de precisión
php8.3-intl Internacionalización

Verificar la instalación

php -v

Resultado esperado:

PHP 8.3.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.3.x, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.x, Copyright (c), by Zend Technologies

📦 Paso 3: Instalar Composer

Composer es el gestor de dependencias PHP, esencial para Laravel.

Descargar e instalar Composer

# Descargar el instalador
curl -sS https://getcomposer.org/installer -o composer-setup.php


# Instalar Composer globalmente
php composer-setup.php --install-dir=/usr/local/bin --filename=composer


# Eliminar el instalador
rm composer-setup.php

Verificar la instalación

composer --version

Resultado esperado:

Versión de Composer 2.x.x 2024-xx-xx xx:xx:xx

🌐 Paso 4: Instalar Nginx

Nginx es un servidor web de alto rendimiento, ideal para Laravel.

Instalar Nginx

apt install -y nginx

Iniciar y activar Nginx

# Iniciar Nginx
systemctl start nginx
# Activar en el inicio
systemctl enable nginx
# Verificar el estado
systemctl status nginx

Resultado esperado:

● nginx.service - Un servidor web de alto rendimiento y un servidor proxy inverso
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; ...)
     Active: active (running) since ...

Probar Nginx

Abra su navegador y acceda a http://your-server-ip. Debería ver la página predeterminada de Nginx.


🗄️ Paso 5: Instalar MariaDB

MariaDB es una base de datos compatible con MySQL, eficiente y de código abierto.

Instalar MariaDB

apt install -y mariadb-server mariadb-client

Iniciar y activar MariaDB

# Iniciar MariaDB
systemctl start mariadb
# Activar en el inicio
systemctl enable mariadb
# Verificar el estado
systemctl status mariadb

Seguridad de la instalación

mysql_secure_installation

Responda a las preguntas:

Pregunta Respuesta recomendada
Ingrese la contraseña actual para root Pulse Enter (vacío)
Cambiar a autenticación unix_socket n
Cambiar la contraseña de root Y luego ingrese una contraseña segura
Eliminar usuarios anónimos Y
Denegar inicio de sesión de root de forma remota Y
Eliminar la base de datos de prueba Y
Recargar las tablas de privilegios Y

Crear una base de datos para Laravel

# Conectar a MariaDB
mysql -u root -p
-- Crear la base de datos
CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- Crear un usuario
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'YourSecurePassword123!';

-- Otorgar permisos
GRANT ALL PRIVILEGES ON laravel.* TO 'laravel_user'@'localhost';

-- Aplicar cambios
FLUSH PRIVILEGES;

-- Salir
EXIT;

📝 Nota: Mantenga esta información para la configuración de Laravel:

  • Base de datos: laravel
  • Usuario: laravel_user
  • Contraseña: YourSecurePassword123!

🚀 Paso 6: Instalar Laravel 12

Crear el directorio del proyecto

# Crear la carpeta para los sitios web
mkdir -p /var/www

# Ir al directorio
cd /var/www

Instalar Laravel mediante Composer

composer create-project laravel/laravel monsite

💡 Reemplace monsite con el nombre de su proyecto.

Resultado esperado:

Creating a "laravel/laravel" project at "./monsite"
Installing laravel/laravel (v12.x.x)
  - Downloading laravel/laravel (v12.x.x)
  - Installing laravel/laravel (v12.x.x): Extracting archive
...
Application ready! Build something amazing.

Structure du projet Laravel

📁 /var/www/monsite/
├── 📁 app/              ← Código de la aplicación
├── 📁 bootstrap/        ← Archivos de inicio
├── 📁 config/           ← Configuración
├── 📁 database/         ← Migraciones y seeds
├── 📁 public/           ← Punto de entrada web (index.php)
├── 📁 resources/        ← Vistas, CSS, JS
├── 📁 routes/           ← Rutas de la aplicación
├── 📁 storage/          ← Archivos generados, logs, cache
├── 📁 tests/            ← Pruebas unitarias
├── 📁 vendor/           ← Dependencias Composer
├── 📄 .env              ← Variables de entorno
├── 📄 artisan           ← CLI Laravel
└── 📄 composer.json     ← Dependencias del proyecto

⚙️ Paso 7: Configurar Laravel

Configurar el archivo .env

cd /var/www/monsite
nano .env

Modifique las siguientes líneas:

APP_NAME="Mi Sitio Laravel"
APP_ENV=production
APP_DEBUG=false
APP_URL=http://your-domain.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel_user
DB_PASSWORD=YourSecurePassword123!

⚠️ Importante: En producción, establezca APP_DEBUG=false para no exponer información sensible.

Generar la clave de la aplicación

php artisan key:generate

Resultado esperado:

INFO  Application key set successfully.

Ejecutar las migraciones

php artisan migrate

Resultado esperado:

INFO  Running migrations.

2024_01_01_000000_create_users_table ............... 45ms DONE
2024_01_01_000001_create_password_reset_tokens_table  12ms DONE
2024_01_01_000002_create_sessions_table ............ 18ms DONE
...

📁 Paso 8: Configurar los Permisos

Laravel requiere que ciertas carpetas sean accesibles en escritura.

Establecer el propietario

# Cambiar el propietario al usuario web
chown -R www-data:www-data /var/www/monsite

Establecer los permisos

# Permisos para carpetas
find /var/www/monsite -type d -exec chmod 755 {} \;

# Permisos para archivos
find /var/www/monsite -type f -exec chmod 644 {} \;

# Permisos especiales para storage y bootstrap/cache
chmod -R 775 /var/www/monsite/storage
chmod -R 775 /var/www/monsite/bootstrap/cache

🔧 Paso 9: Configurar Nginx para Laravel

Crear la configuración del sitio

nano /etc/nginx/sites-available/monsite

Pegue la siguiente configuración:

server {
    listen 80;
    listen [::]:80;
    
    # Reemplace con su dominio o IP
    server_name your-domain.com www.your-domain.com;
    
    # Raíz del sitio (carpeta public de Laravel)
    root /var/www/monsite/public;
    
    # Archivos index
    index index.php index.html index.htm;
    
    # Codificación
    charset utf-8;
    
    # Logs
    access_log /var/log/nginx/monsite.access.log;
    error_log /var/log/nginx/monsite.error.log;
    
    # Gestión de solicitudes
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    
    # Archivos estáticos
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
    
    # Error 404 → Laravel
    error_page 404 /index.php;
    
    # Procesamiento PHP via PHP-FPM
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }
    
    # Bloquear el acceso a archivos ocultos
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Activar el sitio

# Crear un enlace simbólico
ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/

# Desactivar el sitio predeterminado (opcional)
rm /etc/nginx/sites-enabled/default

# Probar la configuración
nginx -t

Resultado esperado:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reiniciar Nginx

systemctl restart nginx

✅ Paso 10: Probar la Instalación

Acceder al sitio

Abra su navegador y acceda a:

  • http://your-server-ip (si no tiene un dominio)
  • http://your-domain.com (si tiene un dominio configurado)

Debería ver la página de inicio de Laravel:

Verificar la salud de la aplicación

Laravel 12 incluye una ruta de verificación de salud:

curl http://localhost/up

Resultado esperado: Código HTTP 200 (OK)


🔒 Paso 11: Seguridad con HTTPS (Let's Encrypt)

Instalar Certbot

apt install -y certbot python3-certbot-nginx

Obtener un certificado SSL

certbot --nginx -d your-domain.com -d www.your-domain.com

Siga las instrucciones:

  1. Ingrese su correo electrónico
  2. Acepte los términos
  3. Elija redirigir de HTTP a HTTPS (recomendado)

Verificar la renovación automática

certbot renew --dry-run

Resultado esperado:

Congratulations, all simulated renewals succeeded

✅ Su sitio ahora es accesible a través de https://your-domain.com


🛠️ Comandos Útiles de Laravel

Artisan (CLI Laravel)

# Ir al directorio del proyecto
cd /var/www/misitio

# Ver todas las comandos disponibles
php artisan list

# Limpiar la caché
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

# Optimizar para producción
php artisan optimize

# Crear un controlador
php artisan make:controller NombreControlador

# Crear un modelo con migración
php artisan make:model NombreModelo -m

# Ejecutar las migraciones
php artisan migrate

# Retroceder
php artisan migrate:rollback

# Modo de mantenimiento
php artisan down
php artisan up

📊 Optimización para la Producción

Optimizar Laravel

cd /var/www/misitio

# Cachear la configuración
php artisan config:cache

# Cachear las rutas
php artisan route:cache

# Cachear las vistas
php artisan view:cache

# Optimización global
php artisan optimize

Configurar OPcache

nano /etc/php/8.3/fpm/conf.d/10-opcache.ini

Agregar o modificar:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.save_comments=1

Reiniciar PHP-FPM:

systemctl restart php8.3-fpm

🔧 Solución de Problemas

Error 500 - Error Interno del Servidor

❌ Causa ✅ Solución
Permisos incorrectos chown -R www-data:www-data /var/www/misitio
Storage no accesible chmod -R 775 /var/www/misitio/storage
Falta la clave APP_KEY php artisan key:generate
.env mal configurado Verificar los parámetros de la base de datos
# Ver los errores de Laravel
tail -f /var/www/misitio/storage/logs/laravel.log

Error 502 Bad Gateway

❌ Causa ✅ Solución
PHP-FPM no iniciado systemctl start php8.3-fpm
Socket PHP incorrecto Verificar /var/run/php/php8.3-fpm.sock
Versión PHP incorrecta update-alternatives --config php

Error de Conexión a la Base de Datos

❌ Causa ✅ Solución
MariaDB no iniciada systemctl start mariadb
Credenciales incorrectas Verificar .env (DB_DATABASE, DB_USERNAME, DB_PASSWORD)
Base de datos no creada Crear la base con mysql -u root -p
# Probar la conexión
php artisan tinker
>>> DB::connection()->getPdo();

Página en Blanco

# Activar temporalmente el debug
nano /var/www/misitio/.env
# Cambiar APP_DEBUG=true

# Limpiar la caché
php artisan cache:clear
php artisan config:clear

# Revisar los logs
tail -50 /var/www/misitio/storage/logs/laravel.log

📝 Resumen de Comandos

# === ACTUALIZACIÓN DEL SISTEMA ===
apt update && apt upgrade -y

# === INSTALACIÓN PHP 8.3 (Debian 13) ===
apt install -y apt-transport-https lsb-release ca-certificates curl gnupg
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/sury-php.gpg
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list
apt update
apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php8.3-intl

# === INSTALACIÓN COMPOSER ===
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# === INSTALACIÓN NGINX ===
apt install -y nginx
systemctl enable nginx && systemctl start nginx

# === INSTALACIÓN MARIADB ===
apt install -y mariadb-server mariadb-client
systemctl enable mariadb && systemctl start mariadb
mysql_secure_installation

# === CREACIÓN DE BASE DE DATOS ===
mysql -u root -p -e "CREATE DATABASE laravel; CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'Contraseña'; GRANT ALL ON laravel.* TO 'laravel_user'@'localhost'; FLUSH PRIVILEGES;"

# === INSTALACIÓN LARAVEL ===
cd /var/www
composer create-project laravel/laravel misitio
cd misitio
php artisan key:generate
php artisan migrate

# === PERMISOS ===
chown -R www-data:www-data /var/www/misitio
chmod -R 775 /var/www/misitio/storage /var/www/misitio/bootstrap/cache

# === HTTPS (Let's Encrypt) ===
apt install -y certbot python3-certbot-nginx
certbot --nginx -d tu-dominio.com

🎉 Conclusión

¡Felicidades! Has instalado exitosamente:

  • PHP 8.3 con todas las extensiones de Laravel
  • Composer 2.x para la gestión de dependencias
  • Nginx configurado para Laravel
  • MariaDB con una base de datos dedicada
  • Laravel 12 listo para producción
  • HTTPS con Let's Encrypt (opcional)

Próximos Pasos

  • 📖 Consultar la documentación de Laravel
  • 🎨 Instalar un kit inicial: php artisan breeze:install o php artisan jetstream:install
  • 📊 Configurar colas con Redis o Supervisor
  • 📧 Configurar el envío de emails (SMTP, Mailgun, etc.)