Laravel 13 auf einem Server mit Debian 13 installieren
5 Kapitel · 1 Std. 15 Min. · Fortgeschritten · Composer, Debian · geprüft am 7 September 2026
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
sudoverwenden 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:
sudo adduser deploy
sudo usermod -aG sudo deploy1. PHP und seine Erweiterungen
Debian 13 liefert PHP 8.4 mit, das Fremdrepository Sury wird also nicht gebraucht:
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.24Welche 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:
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. Das Laravel-Projekt anlegen
Als Benutzer deploy, niemals als 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 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:
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. 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:
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/databaseLiegt das Projekt im Home-Verzeichnis eines Benutzers, muss nginx es durchqueren dürfen:
sudo chmod o+x /home/deployDas 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.
sudo apt install -y nginx php-fpmLies den genauen Pfad des Sockets aus, er trägt die PHP-Versionsnummer:
grep -h '^listen' /etc/php/8.4/fpm/pool.d/www.conf
# listen = /run/php/php8.4-fpm.sockLege die Datei für die Site an. Das Wurzelverzeichnis zeigt auf public/, nie auf das Projektverzeichnis:
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:
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. Die Installation prüfen
Zwei Kontrollen genügen, um zu wissen, ob die Installation trägt:
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 : 403Die 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:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comDann die Caches, die nach jedem Deployment neu erzeugt werden müssen:
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 anzeigenDiese 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.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d exemple.comZum Schluss der Scheduler, falls die Anwendung ihn nutzt:
sudo crontab -u deploy -e
# * * * * * cd /home/deploy/app && php artisan schedule:run >> /dev/null 2>&1Für Cache, Sessions und Queues auf Redis geht es weiter mit dem Kapitel zu Redis.
Häufige Fehler
chmod o+x /home/deploy, sonst liefert nginx einen Berechtigungsfehler.