Tutorial · Laravel

Laravel 13 installeren op een Debian 13-server met nginx

5 hoofdstukken · 1 uur 15 · Gemiddeld · Composer, Debian · geverifieerd op 7 september 2026

Kort antwoord

Op Debian 13 komt PHP 8.4 uit de officiële repository's: een externe repository heb je niet nodig. Installeer PHP en zijn extensies, dan Composer (met controle van de checksum), maak het project met composer create-project laravel/laravel, geef schrijfrechten op storage/ en bootstrap/cache/ en laat de nginx-root naar public/ wijzen. Controleer het resultaat: de homepage moet 200 antwoorden en /.env moet 403 antwoorden.

Deze gids doorloopt de volledige installatie van een Laravel 13-applicatie op een Debian 13-server, van een kaal systeem tot een pagina die door nginx wordt geserveerd. Elke stap is op 2 september 2026 uitgevoerd op een schone Debian 13 “trixie”, en het eindresultaat is gecontroleerd: HTTP 200 op de homepage, het bestand .env niet bereikbaar vanaf het web.

Artikel uit het leertraject Webontwikkeling. Vijf stappen hebben hun eigen uitgewerkte hoofdstuk, te vinden in de zijbalk. Hieronder staat de volledige reeks, met precies genoeg om tot het einde te komen.

Wat je nodig hebt voor je begint

  • Een Debian 13-server “trixie” die via SSH bereikbaar is. Debian 12 werkt ook, met PHP 8.2.
  • Een gebruiker zonder root-rechten die over sudo beschikt. Installeer en deploy nooit als root.
  • Een ontwikkelmachine aan jouw kant. Op macOS is het commando laravel dat niet gevonden wordt het klassieke struikelblok.
  • Een domeinnaam die naar de server wijst, als je HTTPS wilt.

Maak de gebruiker aan die de applicatie gaat dragen, als dat nog niet gebeurd is:

bash
sudo adduser deploy
sudo usermod -aG sudo deploy

1. PHP en zijn extensies

Debian 13 levert PHP 8.4 mee, waardoor je de externe Sury-repository niet nodig hebt:

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

Welke extensies precies nodig zijn, de instellingen in php.ini en de werkwijze om een andere PHP-versie te installeren staan in het hoofdstuk over PHP.

2. Composer

Installeer hem en controleer daarbij de checksum van het installatieprogramma, zoals de officiële documentatie voorschrijft:

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. Het Laravel-project aanmaken

Als gebruiker deploy, nooit als 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 genereert het bestand .env, maakt de application key aan en draait de migraties op de standaard SQLite-database. Voor een MySQL- of MariaDB-database, waarvan de installatie een eigen hoofdstuk heeft, vul je de verbinding in en draai je de migraties opnieuw:

.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. Rechten op de bestanden

Dit is de stap die men overslaat en die de witte pagina, of een 500-fout, oplevert. De betrokken mappen zijn storage_path() en bootstrap/cache, beschreven in de paden van de applicatie, plus database/ zolang de applicatie de bij de installatie aangemaakte SQLite-database gebruikt: de sessiedriver schrijft erin bij elk bezoek. De webserver moet in deze drie mappen kunnen schrijven, en alleen in deze:

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

Staat het project in de persoonlijke map van een gebruiker, dan moet nginx die kunnen doorlopen:

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

Dat is het meest verspreide en het gevaarlijkste advies: het maakt je applicatie wijzigbaar vanaf elk account op de server. 775 met de juiste groep volstaat, en dat is ook wat voor de controle is gebruikt.

5. nginx en PHP-FPM

Dit onderdeel installeert nginx. Geef je de voorkeur aan Apache, gebruikelijker bij shared hosting, volg dan het hoofdstuk over Apache in de plaats: de rest van de gids blijft geldig.

bash
sudo apt install -y nginx php-fpm

Noteer het exacte pad van de socket, het bevat het versienummer van PHP:

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

Maak het bestand voor de site aan. De root wijst naar public/, nooit naar de projectmap zelf:

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

Activeer de site, schakel de standaardsite uit en controleer de syntaxis:

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. De installatie controleren

Twee controles volstaan om te weten of de installatie overeind blijft:

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

De tweede controle is de belangrijkste. Een 200 op /.env zou betekenen dat je databasegegevens en je APP_KEY publiek leesbaar zijn. Het blok location ~ /\.(?!well-known).* houdt dat tegen, en daarom moet de root van de site public/ zijn.

7. Naar productie

De ontwikkelconfiguratie laat informatie lekken. Drie regels in de .env:

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

Daarna de caches, die je na elke deployment opnieuw opbouwt:

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 moet OFF tonen

Deze instelling wordt uitgewerkt in het artikel over de debugmodus.

Voeg HTTPS toe met Certbot, dat zelf de nginx-configuratie aanpast:

Als de applicatie publieke formulieren aanbiedt, voorzie dan ook een bescherming tegen geautomatiseerde inzendingen.

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

Tot slot de scheduler, als de applicatie er gebruik van maakt:

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

Voor cache, sessies en queues op Redis ga je verder met het hoofdstuk over Redis.

Start de tutorial

Veelgemaakte fouten

nginx-root op het project in plaats van public/ De volledige broncode, inclusief het bestand .env, wordt downloadbaar. Controleer altijd of /.env een 403 teruggeeft.
chmod -R 777 op storage Maakt de applicatie wijzigbaar vanaf elk account op de server. 775 met de groep www-data volstaat.
Composer met sudo gedraaid De scripts van de dependencies draaien als root en de aangemaakte bestanden worden onbeschrijfbaar voor de webserver.
PHP-FPM-socket hardgecodeerd Het pad bevat het versienummer: /run/php/php8.4-fpm.sock. Lees het uit de pool in plaats van het over te schrijven.
Persoonlijke map niet doorloopbaar Een project in /home/deploy vraagt chmod o+x /home/deploy, anders geeft nginx een permissiefout.
Vergeten de caches opnieuw op te bouwen Na een deployment moeten config:cache, route:cache en view:cache opnieuw draaien, anders blijft de oude configuratie actief.
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.