Tutorial · Laravel

Laravel 13 auf einem Server mit Debian 13 installieren

5 Kapitel · 1 Std. 15 Min. · Fortgeschritten · Composer, Debian · geprüft am 7 September 2026

Schnelle Antwort

Unter Debian 13 kommt PHP 8.4 aus den offiziellen Paketquellen: Ein Fremdrepository ist nicht nötig. Installiere PHP und seine Erweiterungen, dann Composer (mit Signaturprüfung), lege das Projekt mit composer create-project laravel/laravel an, gib storage/ und bootstrap/cache/ Schreibrechte und richte das Wurzelverzeichnis von nginx auf public/. Prüfe das Ergebnis: Die Startseite muss 200 antworten, /.env muss 403 antworten.

Diese Anleitung führt die vollständige Installation einer Laravel-13-Anwendung auf einem Debian-13-Server durch, vom jungfräulichen System bis zur Seite, die von nginx ausgeliefert wird. Jeder Schritt wurde am 2. September 2026 auf einem frischen Debian 13 „trixie“ ausgeführt und das Ergebnis geprüft: HTTP 200 auf der Startseite, die Datei .env aus dem Web nicht erreichbar.

Artikel aus der Reihe Webentwicklung. Fünf Schritte haben ihr eigenes ausführliches Kapitel, aufgelistet in der Seitenleiste. Was folgt, ist der komplette Ablauf mit genau dem, was du brauchst, um ans Ziel zu kommen.

Was du vorher brauchst

  • Einen Debian-13-Server („trixie“) mit SSH-Zugang. Debian 12 funktioniert ebenfalls, dann mit PHP 8.2.
  • Einen Benutzer ohne Root-Rechte, der sudo verwenden darf. Installiere und deploye nie als root.
  • Einen Entwicklungsrechner auf deiner Seite. Unter macOS ist die übliche Hürde der Befehl laravel, der nicht gefunden wird.
  • Eine Domain, die auf den Server zeigt, falls HTTPS geplant ist.

Lege den Benutzer an, dem die Anwendung gehören wird, falls noch nicht geschehen:

bash
sudo adduser deploy
sudo usermod -aG sudo deploy

1. PHP und seine Erweiterungen

Debian 13 liefert PHP 8.4 mit, das Fremdrepository Sury wird also nicht gebraucht:

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

Welche Erweiterungen im Einzelnen nötig sind, wie php.ini eingestellt wird und wie du eine andere PHP-Version installierst, steht im Kapitel zu PHP.

2. Composer

Installiere ihn und prüfe dabei die Signatur des Installers, so wie es die offizielle Dokumentation vorschreibt:

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. Das Laravel-Projekt anlegen

Als Benutzer deploy, niemals 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 erzeugt die Datei .env, legt den Application Key an und führt die Migrationen auf der standardmäßigen SQLite-Datenbank aus. Für MySQL oder MariaDB, deren Installation ein eigenes Kapitel hat, trägst du die Verbindung ein und lässt die Migrationen erneut laufen:

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

Das ist der Schritt, den man überspringt und der die weiße Seite oder einen Fehler 500 erzeugt. Die betroffenen Ordner entsprechen storage_path() und bootstrap/cache, beschrieben in den Pfaden der Anwendung, plus database/, solange die Anwendung die bei der Installation erzeugte SQLite-Datenbank nutzt: Der Session-Treiber schreibt bei jedem Besuch hinein. Der Webserver muss in diese drei Ordner schreiben können, und nur in diese:

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

Liegt das Projekt im Home-Verzeichnis eines Benutzers, muss nginx es durchqueren dürfen:

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

Das ist der am weitesten verbreitete und zugleich gefährlichste Rat: Er macht die Anwendung für jedes Konto auf dem Server veränderbar. 775 mit der richtigen Gruppe reicht aus, und genau das wurde für die Prüfung verwendet.

5. nginx und PHP-FPM

Dieser Abschnitt installiert nginx. Wenn du Apache bevorzugst, im Shared Hosting der häufigere Fall, folge stattdessen dem Kapitel zu Apache: Der Rest der Anleitung bleibt gültig.

bash
sudo apt install -y nginx php-fpm

Lies den genauen Pfad des Sockets aus, er trägt die PHP-Versionsnummer:

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

Lege die Datei für die Site an. Das Wurzelverzeichnis zeigt auf public/, nie auf das Projektverzeichnis:

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

Aktiviere die Site, deaktiviere die Standard-Site, prüfe die Syntax:

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. Die Installation prüfen

Zwei Kontrollen genügen, um zu wissen, ob die Installation trägt:

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

Die zweite Kontrolle ist die wichtigere. Eine 200 auf /.env würde bedeuten, dass deine Datenbank-Zugangsdaten und dein APP_KEY öffentlich lesbar sind. Verhindert wird das vom Block location ~ /\.(?!well-known).*, und deshalb muss das Wurzelverzeichnis der Site public/ sein.

7. In den Produktivbetrieb gehen

Die Entwicklungskonfiguration lässt Informationen nach außen dringen. Drei Zeilen in der .env:

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

Dann die Caches, die nach jedem Deployment neu erzeugt werden müssen:

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 muss OFF anzeigen

Diese Einstellung wird im Detail im Artikel zum Debug-Modus behandelt.

Ergänze HTTPS mit Certbot, das die nginx-Konfiguration selbst anpasst:

Wenn die Anwendung öffentliche Formulare hat, plane außerdem einen Schutz gegen automatisierte Einsendungen ein.

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

Zum Schluss der Scheduler, falls die Anwendung ihn nutzt:

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

Für Cache, Sessions und Queues auf Redis geht es weiter mit dem Kapitel zu Redis.

Tutorial starten

Häufige Fehler

nginx-Wurzelverzeichnis auf dem Projekt statt auf public/ Der gesamte Quellcode wird herunterladbar, die Datei .env eingeschlossen. Prüfe immer, ob /.env eine 403 liefert.
chmod -R 777 auf storage Macht die Anwendung für jedes Konto auf dem Server veränderbar. 775 mit der Gruppe www-data reicht.
Composer mit sudo gestartet Die Skripte der Abhängigkeiten laufen als root, und der Webserver kann die erzeugten Dateien anschließend nicht mehr beschreiben.
PHP-FPM-Socket fest verdrahtet Der Pfad enthält die Versionsnummer: /run/php/php8.4-fpm.sock. Lies ihn aus dem Pool aus, statt ihn abzuschreiben.
Home-Verzeichnis nicht durchquerbar Ein Projekt in /home/deploy verlangt chmod o+x /home/deploy, sonst liefert nginx einen Berechtigungsfehler.
Caches nicht neu erzeugt Nach einem Deployment müssen config:cache, route:cache und view:cache erneut laufen, sonst bleibt die alte Konfiguration aktiv.
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.