Tutoriel · Laravel

Installer Laravel 13 sur un serveur Debian 13

5 chapitres · 1 h 15 · Intermédiaire · Composer, Debian · vérifié le 7 septembre 2026

Réponse rapide

Sur Debian 13, PHP 8.4 est fourni par les dépôts officiels : aucun dépôt tiers n’est nécessaire. Installez PHP et ses extensions, Composer (avec vérification de signature), créez le projet avec composer create-project laravel/laravel, donnez les droits d’écriture à storage/ et bootstrap/cache/, puis pointez la racine nginx sur public/. Contrôlez le résultat : la page d’accueil doit répondre 200 et /.env doit répondre 403.

Ce guide déroule l’installation complète d’une application Laravel 13 sur un serveur Debian 13, depuis un système vierge jusqu’à une page servie par nginx. Chaque étape a été exécutée sur un Debian 13 « trixie » propre le 2 septembre 2026, et le résultat final vérifié : réponse HTTP 200 sur la page d’accueil, fichier .env inaccessible depuis le web.

Article du parcours Développement web. Cinq étapes ont leur propre chapitre détaillé, listé dans la barre latérale. Ce qui suit est la séquence complète, avec juste ce qu’il faut pour aller au bout.

Ce qu’il faut avant de commencer

  • Un serveur Debian 13 « trixie » accessible en SSH. Debian 12 fonctionne aussi, avec PHP 8.2.
  • Un utilisateur non-root disposant de sudo. N’installez pas et ne déployez pas en root.
  • Un poste de développement de votre côté. Sur macOS, le point de blocage habituel est la commande laravel introuvable.
  • Un nom de domaine pointant vers le serveur, si vous prévoyez du HTTPS.

Créez l’utilisateur qui portera l’application si ce n’est pas déjà fait :

bash
sudo adduser deploy
sudo usermod -aG sudo deploy

1. PHP et ses extensions

Debian 13 fournit PHP 8.4, ce qui dispense du dépôt tiers 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

Le détail des extensions requises, les réglages de php.ini et la marche à suivre pour installer une autre version de PHP figurent dans le chapitre consacré à PHP.

2. Composer

Installez-le en vérifiant l’empreinte du programme d’installation, comme le prescrit la documentation officielle :

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. Créer le projet Laravel

En tant qu’utilisateur deploy, jamais en 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 génère le fichier .env, crée la clé d’application et exécute les migrations sur la base SQLite par défaut. Pour une base MySQL ou MariaDB, dont l’installation fait l’objet d’un chapitre, renseignez la connexion puis relancez les migrations :

.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. Droits sur les fichiers

C’est l’étape que l’on saute et qui produit la page blanche, ou une erreur 500. Les dossiers concernés correspondent à storage_path() et bootstrap/cache, décrits dans les chemins de l’application, plus database/ tant que l’application utilise la base SQLite créée à l’installation : le pilote de session y écrit à chaque visite. Le serveur web doit pouvoir écrire dans ces trois dossiers, et ceux-là seulement :

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 le projet vit dans le dossier personnel d’un utilisateur, nginx doit pouvoir le traverser :

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

C’est le conseil le plus répandu et le plus dangereux : il rend l’application modifiable par n’importe quel compte du serveur. 775 avec le bon groupe suffit, et c’est ce qui a été utilisé pour la vérification.

5. nginx et PHP-FPM

Cette section installe nginx. Si vous préférez Apache, plus courant en hébergement mutualisé, suivez le chapitre consacré à Apache à la place : la suite du guide reste valable.

bash
sudo apt install -y nginx php-fpm

Relevez le chemin exact du socket, il porte le numéro de version de PHP :

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

Créez le fichier de site. La racine pointe sur public/, jamais sur la racine du projet :

/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;
    }
}

Activez le site, désactivez celui par défaut, contrôlez la syntaxe :

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. Vérifier l’installation

Deux contrôles suffisent à savoir si l’installation tient debout :

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

Le second contrôle est le plus important. Un 200 sur /.env signifierait que vos identifiants de base de données et votre APP_KEY sont publiquement lisibles. C’est le bloc location ~ /\.(?!well-known).* qui l’en empêche, et c’est pourquoi la racine du site doit être public/.

7. Passer en production

La configuration de développement laisse fuir des informations. Trois lignes dans le .env :

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

Puis les caches, à régénérer après chaque déploiement :

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 doit afficher OFF

Le détail de ce réglage est traité dans l’article sur le mode débogage.

Ajoutez le HTTPS avec Certbot, qui modifie lui-même la configuration nginx :

Si l’application expose des formulaires publics, prévoyez aussi une protection contre les envois automatisés.

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

Enfin, le planificateur de tâches, si l’application en utilise :

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

Pour le cache, les sessions et les files d’attente sur Redis, poursuivez avec le chapitre consacré à Redis.

Commencer le tutoriel

Erreurs fréquentes

Racine nginx sur le projet au lieu de public/ Tout le code source, y compris le fichier .env, devient téléchargeable. Vérifiez toujours que /.env renvoie 403.
chmod -R 777 sur storage Rend l’application modifiable par n’importe quel compte du serveur. 775 avec le groupe www-data suffit.
Composer lancé avec sudo Les scripts des dépendances s’exécutent en root et les fichiers créés deviennent inaccessibles en écriture au serveur web.
Socket PHP-FPM codé en dur Le chemin contient le numéro de version : /run/php/php8.4-fpm.sock. Relevez-le dans le pool plutôt que de le recopier.
Dossier personnel non traversable Un projet dans /home/deploy exige chmod o+x /home/deploy, sinon nginx renvoie une erreur de permission.
Oublier de régénérer les caches Après un déploiement, config:cache, route:cache et view:cache doivent être relancés, sinon l’ancienne configuration reste active.
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.