Instalar Laravel 13 en un servidor Debian 13 con nginx
5 capítulos · 1 h 15 min · Intermedio · Composer, Debian · verificado el 7 septiembre 2026
En Debian 13, PHP 8.4 viene en los repositorios oficiales: no hace falta ningún repositorio externo. Instala PHP y sus extensiones, Composer (verificando la firma), crea el proyecto con composer create-project laravel/laravel, da permisos de escritura a storage/ y bootstrap/cache/, y apunta la raíz de nginx a public/. Comprueba el resultado: la portada debe responder 200 y /.env debe responder 403.
Esta guía recorre la instalación completa de una aplicación Laravel 13 en un servidor Debian 13, desde un sistema virgen hasta una página servida por nginx. Cada paso se ejecutó sobre un Debian 13 «trixie» limpio el 2 de septiembre de 2026, y el resultado final se comprobó: respuesta HTTP 200 en la portada y fichero .env inaccesible desde la web.
Artículo del itinerario Desarrollo web. Cinco de los pasos tienen su propio capítulo detallado, listado en la barra lateral. Lo que sigue es la secuencia completa, con lo justo para llegar hasta el final.
Lo que necesitas antes de empezar
- Un servidor Debian 13 «trixie» accesible por SSH. Debian 12 también sirve, con PHP 8.2.
- Un usuario sin privilegios de root con acceso a
sudo. No instales ni despliegues como root. - Un equipo de desarrollo en tu lado. En macOS, el atasco habitual es el comando
laravelque no se encuentra. - Un nombre de dominio apuntando al servidor, si tienes previsto usar HTTPS.
Crea el usuario que alojará la aplicación, si aún no lo has hecho:
sudo adduser deploy
sudo usermod -aG sudo deploy1. PHP y sus extensiones
Debian 13 trae PHP 8.4, así que no hace falta el repositorio externo Sury:
sudo apt update
sudo apt install -y php-cli php-fpm \
php-mbstring php-xml php-curl php-zip \
php-bcmath php-intl php-mysql php-sqlite3 \
unzip curl ca-certificates
php -v # PHP 8.4.24El detalle de las extensiones necesarias, los ajustes de php.ini y los pasos para instalar otra versión de PHP están en el capítulo dedicado a PHP.
2. Composer
Instálalo verificando la huella del instalador, tal como indica la documentación oficial:
EXPECTED="$(curl -sS https://composer.github.io/installer.sig)"
curl -sS https://getcomposer.org/installer -o composer-setup.php
ACTUAL="$(php -r 'echo hash_file("sha384", "composer-setup.php");')"
if [ "$EXPECTED" = "$ACTUAL" ]; then
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
fi
rm composer-setup.php
composer --version # Composer version 2.10.33. Crear el proyecto Laravel
Como usuario deploy, nunca como root:
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version # Laravel Framework 13.30.1create-project genera el fichero .env, crea la clave de aplicación y ejecuta las migraciones sobre la base SQLite por defecto. Para una base MySQL o MariaDB, cuya instalación tiene su propio capítulo, rellena la conexión y vuelve a lanzar las migraciones:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=un_mot_de_passe_solidephp artisan migrate --force4. Permisos de los ficheros
Es el paso que se salta y que produce la página en blanco, o un error 500. Las carpetas afectadas corresponden a storage_path() y bootstrap/cache, descritas en las rutas de la aplicación, más database/ mientras la aplicación use la base SQLite creada en la instalación: el controlador de sesión escribe en ella en cada visita. El servidor web debe poder escribir en estas tres carpetas, y solo en ellas:
sudo chown -R deploy:www-data /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/database
sudo chmod -R 775 /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/databaseSi el proyecto vive en la carpeta personal de un usuario, nginx tiene que poder atravesarla:
sudo chmod o+x /home/deployEs el consejo más extendido y también el más peligroso: deja la aplicación en manos de cualquier cuenta del servidor. Con 775 y el grupo correcto basta, y es lo que se ha usado para la comprobación.
5. nginx y PHP-FPM
Esta sección instala nginx. Si prefieres Apache, más habitual en alojamiento compartido, sigue el capítulo dedicado a Apache en su lugar: el resto de la guía sigue siendo válido.
sudo apt install -y nginx php-fpmAnota la ruta exacta del socket, porque lleva el número de versión de PHP:
grep -h '^listen' /etc/php/8.4/fpm/pool.d/www.conf
# listen = /run/php/php8.4-fpm.sockCrea el fichero del sitio. La raíz apunta a public/, nunca a la raíz del proyecto:
server {
listen 80;
server_name exemple.com;
root /home/deploy/app/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ /\.(?!well-known).* {
deny all;
}
}Activa el sitio, desactiva el que viene por defecto y comprueba la sintaxis:
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginxnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful6. Comprobar la instalación
Con dos comprobaciones basta para saber si la instalación se sostiene:
curl -s -o /dev/null -w "page d'accueil : %{http_code}\n" http://127.0.0.1/
curl -s -o /dev/null -w ".env : %{http_code}\n" http://127.0.0.1/.envpage d'accueil : 200
.env : 403La segunda es la más importante. Un 200 en /.env significaría que tus credenciales de base de datos y tu APP_KEY son legibles públicamente. Lo impide el bloque location ~ /\.(?!well-known).*, y por eso la raíz del sitio debe ser public/.
7. Pasar a producción
La configuración de desarrollo filtra información. Tres líneas en el .env:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comDespués las cachés, que hay que regenerar tras cada despliegue:
composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan about --only=environment # Debug Mode debe mostrar OFFEl detalle de este ajuste se trata en el artículo sobre el modo de depuración.
Añade HTTPS con Certbot, que modifica por su cuenta la configuración de nginx:
Si la aplicación expone formularios públicos, prevé también una protección contra los envíos automatizados.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d exemple.comPor último, el planificador de tareas, si la aplicación lo usa:
sudo crontab -u deploy -e
# * * * * * cd /home/deploy/app && php artisan schedule:run >> /dev/null 2>&1Para la caché, las sesiones y las colas sobre Redis, continúa con el capítulo dedicado a Redis.
Errores frecuentes
chmod o+x /home/deploy, o nginx devolverá un error de permisos.