// hosting
Alojar una aplicación Laravel: VPS, requisitos y despliegue
Una guía práctica para alojar una aplicación Laravel — por qué un VPS suele ser la opción adecuada, los requisitos de servidor que importan (PHP, extensiones, workers de cola, planificador) y un recorrido de despliegue real con Composer, .env, Nginx y Supervisor.
Laravel es un framework de aplicaciones PHP completo, no un conjunto de páginas que subes por FTP. Espera un entorno de ejecución real: un PHP reciente, varias extensiones, un directorio de almacenamiento con permiso de escritura, tareas programadas y — para cualquier cosa no trivial — workers de cola en segundo plano. Por eso un alojamiento compartido básico a menudo te pone trabas, y por eso un VPS suele ser el hogar adecuado para una aplicación Laravel. Esta guía cubre lo que el servidor realmente necesita y recorre un despliegue real.
Por qué un VPS le va bien a Laravel
El alojamiento compartido está pensado para «soltar archivos en una raíz web». Laravel quiere más que eso: acceso SSH para ejecutar composer y artisan, la capacidad de apuntar el servidor web al directorio public/, un proceso de larga duración para vaciar la cola y una entrada cron para el planificador. Un VPS te da acceso root, RAM y CPU garantizadas y control total del stack — exactamente lo que requieren esas necesidades. Una plataforma gestionada también puede servir, pero un VPS es el término medio más flexible una vez que una aplicación tiene colas, una base de datos y una caché.
Requisitos del servidor
PHP y extensiones
Ejecuta una versión de PHP actualmente soportada que coincida con tu versión de Laravel — consulta la documentación del framework para el mínimo exacto. Laravel necesita un conjunto estándar de extensiones PHP activadas; en un VPS Debian/Ubuntu normalmente se instalan juntas:
# Ubuntu/Debian: PHP-FPM + the extensions Laravel expects
sudo apt install -y php-fpm php-cli php-mbstring php-xml \
php-bcmath php-curl php-mysql php-zip php-gd php-intl
# Composer (dependency manager)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer Los nombres exactos de los paquetes varían según la distribución, pero las extensiones a confirmar son mbstring, xml, bcmath, curl, el controlador de base de datos (pdo_mysql o pdo_pgsql), zip y openssl. Si falta alguna, suele aparecer como un error claro durante composer install o al arrancar.
Base de datos, caché y backend de cola
La mayoría de las aplicaciones Laravel se emparejan con MySQL/MariaDB o PostgreSQL. Para cualquier cosa que use colas, sesiones o caché a escala, añade Redis — sirve a la vez como caché rápida, almacén de sesiones y driver de cola. Asegúrate de que el VPS tenga RAM suficiente para la base de datos y Redis junto a los workers de PHP-FPM; la memoria es el recurso que más probablemente agotarás.
Permisos de almacenamiento
Laravel escribe en dos directorios, storage/ y bootstrap/cache/. El usuario del servidor web (a menudo www-data) debe poder escribir en ellos, o tendrás errores de permisos que parecen fallos de la aplicación:
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R ug+rwX storage bootstrap/cache
Recorrido del despliegue
1. Obtener el código e instalar dependencias
Clona el repositorio en el servidor y luego instala las dependencias de producción. Las opciones de abajo omiten los paquetes de desarrollo y construyen un autoloader optimizado:
git clone https://github.com/you/your-app.git /var/www/app
cd /var/www/app
composer install --no-dev --optimize-autoloader 2. Configurar el entorno
Laravel lee la configuración desde un archivo .env que nunca se versiona en git. Copia el ejemplo, genera la clave de la aplicación y rellena los valores reales:
cp .env.example .env
php artisan key:generate Un .env de producción mínimo se ve así — pon APP_DEBUG en false para que los errores no se filtren a los visitantes:
APP_NAME="Your App"
APP_ENV=production
APP_KEY=base64:...generated...
APP_DEBUG=false
APP_URL=https://yourapp.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=yourapp
DB_USERNAME=yourapp
DB_PASSWORD=change-me
CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1 3. Migrar y cachear para producción
Ejecuta las migraciones de base de datos y luego construye la configuración, las rutas y las vistas cacheadas de Laravel. Cachear esto es lo que hace rápido al framework en producción — pero recuerda reconstruirlas en cada despliegue, ya que congelan el estado actual:
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache 4. Apuntar Nginx a public/
La raíz de documentos del servidor web debe ser el directorio public/ — nunca la raíz del proyecto, o expondrías .env y los archivos fuente. Un bloque de servidor Nginx + PHP-FPM estándar:
server {
listen 80;
server_name yourapp.com;
root /var/www/app/public;
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
} Añade HTTPS con un certificado automatizado gratuito (la mayoría de los alojamientos y herramientas como Certbot lo convierten en una sola línea) — una aplicación de producción siempre debería servirse sobre TLS.
5. Ejecutar el worker de cola con Supervisor
Los trabajos en segundo plano (correos, notificaciones, exportaciones) se ejecutan a través de un worker de cola, un proceso de larga duración que debe sobrevivir a caídas y reinicios. No ejecutes php artisan queue:work a mano en una sesión SSH — usa un gestor de procesos como Supervisor para mantenerlo vivo:
# /etc/supervisor/conf.d/app-worker.conf
[program:app-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log
stopwaitsecs=3600 sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start app-worker:* 6. Programar el planificador
El planificador de tareas de Laravel se impulsa con una sola entrada cron que se ejecuta cada minuto; Laravel mismo decide qué tareas tocan. Añádela al crontab del usuario de despliegue:
* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1 Dimensionar el VPS
| Perfil de la aplicación | Lo que necesita |
|---|---|
| Aplicación pequeña, tráfico ligero | VPS de entrada: un par de GB de RAM, almacenamiento NVMe, 1–2 vCPU — PHP-FPM más una base de datos pequeña. |
| Colas + Redis + base de datos | Más margen de RAM para que Redis, la base de datos y varios procesos de PHP-FPM y workers convivan cómodamente. |
| Tráfico más alto / trabajos pesados | vCPU dedicadas para carga sostenida, más procesos workers, espacio para escalar; considera separar la base de datos más adelante. |
Para quién es
- Prefiere no gestionar un servidor: una plataforma gestionada o un VPS gestionado se encarga del parcheo y la supervisión de procesos por ti, a un precio más alto.
- Cómodo en la línea de comandos: un VPS no gestionado es más barato y totalmente flexible — tú eres dueño de la configuración de PHP, Nginx, Supervisor y cron mostrada arriba.
- Aplicación en crecimiento con colas y caché: un VPS con RAM/CPU garantizadas y Redis es el ajuste natural; dimensiona primero la memoria, luego la CPU y después el almacenamiento.
Cómo decidir
Parte de lo que Laravel necesita para funcionar bien: acceso SSH, un PHP soportado con las extensiones adecuadas, una base de datos y (para colas/caché) Redis, almacenamiento con permiso de escritura, un worker de cola bajo Supervisor y un cron de una línea para el planificador. Un VPS te da todo eso con recursos garantizados y un camino claro para escalar — haz coincidir el plan con tu tráfico y tu carga de trabajos en segundo plano, y elige el más pequeño que lo cubra con margen.