Tutorial · Laravel

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

Respuesta rápida

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 laravel que 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:

bash
sudo adduser deploy
sudo usermod -aG sudo deploy

1. PHP y sus extensiones

Debian 13 trae PHP 8.4, así que no hace falta el repositorio externo Sury:

bash
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.24

El 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:

bash
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.3

3. Crear el proyecto Laravel

Como usuario deploy, nunca como root:

bash
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version   # Laravel Framework 13.30.1

create-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:

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=un_mot_de_passe_solide
bash
php artisan migrate --force

4. 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:

bash
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/database

Si el proyecto vive en la carpeta personal de un usuario, nginx tiene que poder atravesarla:

bash
sudo chmod o+x /home/deploy
Nunca chmod -R 777

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

bash
sudo apt install -y nginx php-fpm

Anota la ruta exacta del socket, porque lleva el número de versión de PHP:

bash
grep -h '^listen' /etc/php/8.4/fpm/pool.d/www.conf
# listen = /run/php/php8.4-fpm.sock

Crea el fichero del sitio. La raíz apunta a public/, nunca a la raíz del proyecto:

/etc/nginx/sites-available/laravel
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:

bash
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 nginx
code
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6. Comprobar la instalación

Con dos comprobaciones basta para saber si la instalación se sostiene:

bash
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/.env
code
page d'accueil : 200
.env          : 403

La 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:

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com

Después las cachés, que hay que regenerar tras cada despliegue:

bash
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 OFF

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

bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d exemple.com

Por último, el planificador de tareas, si la aplicación lo usa:

bash
sudo crontab -u deploy -e
# * * * * * cd /home/deploy/app && php artisan schedule:run >> /dev/null 2>&1

Para la caché, las sesiones y las colas sobre Redis, continúa con el capítulo dedicado a Redis.

Empezar el tutorial

Errores frecuentes

Raíz de nginx en el proyecto en vez de public/ Todo el código fuente, incluido el fichero .env, queda descargable. Comprueba siempre que /.env devuelve 403.
chmod -R 777 sobre storage Deja la aplicación modificable por cualquier cuenta del servidor. Basta con 775 y el grupo www-data.
Composer lanzado con sudo Los scripts de las dependencias se ejecutan como root y los ficheros creados dejan de ser escribibles por el servidor web.
Ruta del socket de PHP-FPM escrita a mano La ruta lleva el número de versión: /run/php/php8.4-fpm.sock. Léela en el pool en vez de copiarla.
Carpeta personal no atravesable Un proyecto en /home/deploy exige chmod o+x /home/deploy, o nginx devolverá un error de permisos.
Olvidar regenerar las cachés Tras un despliegue hay que volver a lanzar config:cache, route:cache y view:cache, o seguirá activa la configuración anterior.
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.