</> HTML5Advent
ENFRESDEITPT

// hosting

Eine Laravel-App hosten: VPS, Anforderungen und Deployment

Ein praktischer Leitfaden zum Hosten einer Laravel-Anwendung — warum ein VPS meist die richtige Wahl ist, welche Server-Anforderungen zählen (PHP, Erweiterungen, Queue-Worker, Scheduler) und ein echtes Deployment-Durchgang mit Composer, .env, Nginx und Supervisor.

Ein Entwickler mit Kopfhörern arbeitet an einem Schreibtisch vor einem Monitor voller Code, mit an die Wand dahinter projiziertem Code

Laravel ist ein vollständiges PHP-Anwendungsframework, kein Satz von Seiten, die man per FTP hochlädt. Es erwartet eine echte Laufzeitumgebung: ein aktuelles PHP, mehrere Erweiterungen, ein beschreibbares Storage-Verzeichnis, geplante Aufgaben und — für alles Nicht-Triviale — Queue-Worker im Hintergrund. Deshalb kämpft einfaches Shared-Hosting oft gegen Sie, und deshalb ist ein VPS meist das richtige Zuhause für eine Laravel-App. Dieser Leitfaden behandelt, was der Server tatsächlich braucht, und führt durch ein echtes Deployment.

Warum ein VPS zu Laravel passt

Shared-Hosting ist für „Dateien in ein Web-Root ablegen" gebaut. Laravel will mehr als das: SSH-Zugriff, um composer und artisan auszuführen, die Möglichkeit, den Webserver auf das Verzeichnis public/ zu richten, einen lang laufenden Prozess, um die Queue abzuarbeiten, und einen Cron-Eintrag für den Scheduler. Ein VPS gibt Ihnen Root-Zugriff, garantierten RAM und CPU sowie volle Kontrolle über den Stack — genau das, was diese Anforderungen verlangen. Eine Managed-Plattform kann ebenfalls funktionieren, aber ein VPS ist der flexibelste Mittelweg, sobald eine App Queues, eine Datenbank und einen Cache hat.

Server-Anforderungen

PHP und Erweiterungen

Betreiben Sie eine aktuell unterstützte PHP-Version, die zu Ihrem Laravel-Release passt — prüfen Sie die Dokumentation des Frameworks für das genaue Minimum. Laravel benötigt einen Standardsatz an aktivierten PHP-Erweiterungen; auf einem Debian/Ubuntu-VPS werden sie typischerweise zusammen installiert:

# Ubuntu/Debian: PHP-FPM + the extensions Laravel expects
sudo apt install -y php-fpm php-cli php-mbstring php-xml \
  php-bcmath php-curl php-mysql php-zip php-gd php-intl

# Composer (dependency manager)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Die genauen Paketnamen variieren je nach Distribution, aber die zu bestätigenden Erweiterungen sind mbstring, xml, bcmath, curl, der Datenbanktreiber (pdo_mysql oder pdo_pgsql), zip und openssl. Fehlt eine, zeigt sich das meist als klare Fehlermeldung während composer install oder beim Start.

Datenbank, Cache und Queue-Backend

Die meisten Laravel-Apps werden mit MySQL/MariaDB oder PostgreSQL kombiniert. Für alles, was Queues, Sessions oder Caching im großen Maßstab nutzt, fügen Sie Redis hinzu — es dient zugleich als schneller Cache, Session-Speicher und Queue-Treiber. Stellen Sie sicher, dass der VPS genug RAM für die Datenbank und Redis neben den PHP-FPM-Workern hat; Arbeitsspeicher ist die Ressource, die Sie am ehesten ausschöpfen.

Storage-Berechtigungen

Laravel schreibt in zwei Verzeichnisse, storage/ und bootstrap/cache/. Der Webserver-Benutzer (oft www-data) muss in sie schreiben können, sonst erhalten Sie Berechtigungsfehler, die wie Anwendungsfehler aussehen:

sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R ug+rwX storage bootstrap/cache
Nahaufnahme eines Bildschirms mit syntaxhervorgehobenem Code mit Funktionen und Bedingungen
Ein Laravel-Deployment ist eine wiederholbare Befehlssequenz — Abhängigkeiten installieren, Konfiguration und Routen cachen, Migrationen ausführen — statt Dateien von Hand hochzuladen.

Deployment-Durchgang

1. Code holen und Abhängigkeiten installieren

Ziehen Sie das Repository auf den Server und installieren Sie dann die Produktionsabhängigkeiten. Die Flags unten überspringen Dev-Pakete und bauen einen optimierten Autoloader:

git clone https://github.com/you/your-app.git /var/www/app
cd /var/www/app
composer install --no-dev --optimize-autoloader

2. Die Umgebung konfigurieren

Laravel liest die Konfiguration aus einer .env-Datei, die niemals in git eingecheckt wird. Kopieren Sie das Beispiel, generieren Sie den App-Schlüssel und tragen Sie die echten Werte ein:

cp .env.example .env
php artisan key:generate

Eine minimale Produktions-.env sieht so aus — setzen Sie APP_DEBUG auf false, damit Fehler nicht an Besucher durchsickern:

APP_NAME="Your App"
APP_ENV=production
APP_KEY=base64:...generated...
APP_DEBUG=false
APP_URL=https://yourapp.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=yourapp
DB_USERNAME=yourapp
DB_PASSWORD=change-me

CACHE_STORE=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1

3. Migrieren und für die Produktion cachen

Führen Sie die Datenbankmigrationen aus und bauen Sie dann Laravels gecachte Konfiguration, Routen und Views. Das Cachen dieser Dinge macht das Framework in der Produktion schnell — aber denken Sie daran, sie bei jedem Deployment neu zu bauen, da sie den aktuellen Zustand einfrieren:

php artisan migrate --force

php artisan config:cache
php artisan route:cache
php artisan view:cache

4. Nginx auf public/ richten

Das Document-Root des Webservers muss das Verzeichnis public/ sein — niemals das Projekt-Root, sonst würden Sie .env und Quelldateien offenlegen. Ein Standard-Nginx-+-PHP-FPM-Serverblock:

server {
    listen 80;
    server_name yourapp.com;
    root /var/www/app/public;

    index index.php;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Fügen Sie HTTPS mit einem kostenlosen automatisierten Zertifikat hinzu (die meisten Hoster und Tools wie Certbot machen daraus einen Einzeiler) — eine Produktions-App sollte immer über TLS ausgeliefert werden.

5. Den Queue-Worker mit Supervisor betreiben

Hintergrundjobs (E-Mails, Benachrichtigungen, Exporte) laufen über einen Queue-Worker, einen lang laufenden Prozess, der Abstürze und Reboots überleben muss. Führen Sie php artisan queue:work nicht von Hand in einer SSH-Sitzung aus — verwenden Sie einen Prozessmanager wie Supervisor, um ihn am Leben zu halten:

# /etc/supervisor/conf.d/app-worker.conf
[program:app-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start app-worker:*

6. Den Scheduler einplanen

Laravels Task-Scheduler wird von einem einzigen Cron-Eintrag angetrieben, der jede Minute läuft; Laravel selbst entscheidet, welche Aufgaben fällig sind. Fügen Sie ihn dem Crontab des Deploy-Benutzers hinzu:

* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1

Den VPS dimensionieren

App-ProfilWas es braucht
Kleine App, leichter TrafficEinsteiger-VPS: ein paar GB RAM, NVMe-Speicher, 1–2 vCPUs — PHP-FPM plus eine kleine Datenbank.
Queues + Redis + DatenbankMehr RAM-Reserve, damit Redis, die Datenbank und mehrere PHP-FPM- und Worker-Prozesse bequem nebeneinander bestehen.
Höherer Traffic / schwere JobsDedizierte vCPUs für gleichmäßige Last, mehr Worker-Prozesse, Raum zum Hochskalieren; erwägen Sie, die Datenbank später zu trennen.

Für wen es ist

  • Möchte lieber keinen Server verwalten: eine Managed-Plattform oder ein Managed-VPS übernimmt Patching und Prozessüberwachung für Sie, zu einem höheren Preis.
  • Sicher auf der Kommandozeile: ein unmanaged VPS ist günstiger und voll flexibel — Ihnen gehört die oben gezeigte PHP-, Nginx-, Supervisor- und Cron-Einrichtung.
  • Wachsende App mit Queues und Cache: ein VPS mit garantiertem RAM/CPU und Redis ist die natürliche Wahl; dimensionieren Sie zuerst den Speicher, dann die CPU, dann den Storage.

Wie man entscheidet

Gehen Sie davon aus, was Laravel braucht, um gut zu laufen: SSH-Zugriff, ein unterstütztes PHP mit den richtigen Erweiterungen, eine Datenbank und (für Queues/Cache) Redis, beschreibbaren Storage, einen Queue-Worker unter Supervisor und einen einzeiligen Cron für den Scheduler. Ein VPS gibt Ihnen all das mit garantierten Ressourcen und einem klaren Pfad zum Skalieren — gleichen Sie den Tarif mit Ihrem Traffic und Ihrer Hintergrundjob-Last ab und wählen Sie den kleinsten, der ihn mit Reserve abdeckt.