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
monsitecon 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=falsepara 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:
- Ingrese su correo electrónico
- Acepte los términos
- 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:installophp artisan jetstream:install - 📊 Configurar colas con Redis o Supervisor
- 📧 Configurar el envío de emails (SMTP, Mailgun, etc.)

