// 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.
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
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-Profil | Was es braucht |
|---|---|
| Kleine App, leichter Traffic | Einsteiger-VPS: ein paar GB RAM, NVMe-Speicher, 1–2 vCPUs — PHP-FPM plus eine kleine Datenbank. |
| Queues + Redis + Datenbank | Mehr RAM-Reserve, damit Redis, die Datenbank und mehrere PHP-FPM- und Worker-Prozesse bequem nebeneinander bestehen. |
| Höherer Traffic / schwere Jobs | Dedizierte 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.