Zurück zum Blog

Laravel deployen: Anwendung auf dem vServer veröffentlichen

Laravel deployen auf dem Server: PHP-FPM, Composer, .env, Datenbank, Dateirechte, Nginx, Queue Worker, Scheduler, SSL und Updates Schritt für Schritt.

Nodesty-Team5 Min. LesezeitServer
Der Schriftzug Laravel Deploy mit PHP-FPM, Nginx und Queue auf dunklem Nodesty-Hintergrund

Eine Laravel-Anwendung auf dem Server zu deployen ist mehr, als nur den Code auf den Server zu bringen: PHP-FPM, die Composer-Abhängigkeiten, die Einstellungen in .env, die Datenbank, die Dateirechte, Nginx, die Queue Worker und der Scheduler müssen korrekt konfiguriert sein. Wenn Sie die Schritte in dieser Anleitung einmal durchgegangen sind, bringen Sie Ihre nächsten Projekte mit demselben Aufbau in wenigen Minuten online.

In dieser Anleitung zeigen wir, wie Sie eine Laravel-Anwendung auf einem frischen Ubuntu-Server von Anfang bis Ende deployen, Queue und Scheduler einrichten, SSL aktivieren und spätere Updates ausrollen.

Voraussetzungen

  • Server: Ein Ubuntu-Server mit Root-Zugriff. In dieser Anleitung verwenden wir Ubuntu 24.04.
  • PHP: Die PHP-Version und die Erweiterungen, die Ihre Laravel-Version verlangt. Die Zeile php in der Datei composer.json Ihres Projekts gibt die erforderliche Mindestversion an.
  • Datenbank: MariaDB, MySQL oder PostgreSQL. Zur Installation lesen Sie unsere Anleitungen MySQL und MariaDB installieren oder PostgreSQL installieren.
  • Domain: Ein A-Eintrag, der auf die IP-Adresse Ihres Servers zeigt.

Schritt 1: PHP, Composer und Nginx

Nachdem Sie sich per SSH mit Ihrem Server verbunden haben:

sudo apt update
sudo apt install nginx git unzip \
  php8.3-fpm php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml \
  php8.3-curl php8.3-zip php8.3-bcmath php8.3-intl php8.3-redis
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Verlangt Ihr Projekt eine andere PHP-Version, ändern Sie 8.3 in den Paketnamen; wie Sie mehrere Versionen parallel betreiben, erklären wir in unserer Anleitung PHP Version ändern. Wenn Sie PostgreSQL verwenden, installieren Sie statt php8.3-mysql das Paket php8.3-pgsql.

Schritt 2: Den Code auf den Server holen

Legen Sie den Ordner der Anwendung an und holen Sie den Code aus dem Git-Repository:

sudo mkdir -p /var/www/app
sudo chown $USER:www-data /var/www/app
git clone git@github.com:benutzer/app.git /var/www/app
cd /var/www/app
composer install --no-dev --optimize-autoloader

Wie Sie dem Server einen Deploy-Key hinzufügen, der nur dieses Repository lesen darf, und Deployments automatisieren, erklären wir in unserer Anleitung Deployment mit Git. Wenn Sie Ihre Frontend-Dateien mit Vite bauen, ergänzen Sie außerdem den Schritt npm ci && npm run build.

Schritt 3: Einstellungen in .env

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

Die wichtigsten Einstellungen für die Produktionsumgebung:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://ihredomain.de

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app
DB_USERNAME=app
DB_PASSWORD=ein-starkes-passwort
  • APP_DEBUG=false: Muss in der Produktionsumgebung unbedingt deaktiviert sein. Bleibt die Einstellung aktiv, können Fehlerseiten Besuchern Konfigurationsdaten einschließlich Passwörtern anzeigen.
  • APP_KEY: Wird mit key:generate erzeugt. Verlieren Sie diesen Schlüssel, lassen sich verschlüsselte Daten und Sessions nicht mehr lesen; sichern Sie ihn an einem sicheren Ort.
  • Wenn Sie Redis verwenden, setzen Sie CACHE_STORE, SESSION_DRIVER und QUEUE_CONNECTION auf redis; mehr dazu in unserem Artikel Was ist Redis?.

Fügen Sie die Datei .env niemals dem Git-Repository hinzu.

Schritt 4: Datenbank, Dateirechte und Cache

php artisan migrate --force
php artisan storage:link
sudo chown -R $USER:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
php artisan optimize
  • migrate --force: Legt in der Produktionsumgebung die Datenbanktabellen an; --force überspringt die Sicherheitsabfrage.
  • storage:link: Legt den Link public/storage an, damit hochgeladene Dateien über das Web erreichbar sind.
  • Dateirechte: Der Webserver muss in die Ordner storage und bootstrap/cache schreiben können. Vergeben Sie für das gesamte Projekt nicht 777.
  • optimize: Erstellt die Caches für Konfiguration, Routen und Views und beschleunigt so die Anwendung. Führen Sie diesen Befehl erneut aus, nachdem Sie die Datei .env geändert haben.

Schritt 5: Nginx konfigurieren

Legen Sie die Datei /etc/nginx/sites-available/app an. Achten Sie darauf, dass das Web-Root nicht das Projekt selbst ist, sondern der Ordner public:

server {
    listen 80;
    listen [::]:80;
    server_name ihredomain.de;
    root /var/www/app/public;
    index index.php;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

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

Aktivieren Sie die Website:

sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Wenn Sie statt public den Projektordner als Web-Root festlegen, kann Ihre Datei .env aus dem Internet lesbar werden. Die Grundlagen von Nginx erklären wir in unserer Anleitung Nginx installieren.

Schritt 6: SSL

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d ihredomain.de

Certbot holt das Zertifikat, passt die Nginx-Konfiguration für HTTPS an und richtet die automatische Verlängerung ein. Mehr dazu in unserem Artikel Was ist ein SSL-Zertifikat?.

Schritt 7: Queue Worker und Scheduler

Queue Worker: Führt Aufgaben wie den E-Mail-Versand und die Dateiverarbeitung im Hintergrund aus. Legen Sie die Datei /etc/systemd/system/app-queue.service an:

[Unit]
Description=Laravel Queue Worker
After=network.target

[Service]
User=www-data
Group=www-data
Restart=always
WorkingDirectory=/var/www/app
ExecStart=/usr/bin/php artisan queue:work --sleep=3 --tries=3 --max-time=3600

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now app-queue

Scheduler: Für die geplanten Aufgaben von Laravel genügt eine einzige Cron-Zeile, die jede Minute ausgeführt wird. Fügen Sie sie mit sudo crontab -u www-data -e hinzu:

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

Wie Cron funktioniert, erklären wir in unserer Anleitung Cronjob einrichten.

Updates deployen

Wenn Sie eine neue Version veröffentlichen, gehen Sie so vor:

cd /var/www/app
php artisan down
git pull
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize
php artisan queue:restart
php artisan up

queue:restart sorgt dafür, dass die Queue Worker den neuen Code verwenden. Wie Sie diese Schritte in einem Skript bündeln und mit GitHub Actions automatisieren, erklären wir in unserer Anleitung Deployment mit Git. Vergessen Sie nicht, vor Deployments mit Datenbankänderungen ein Backup der Datenbank zu erstellen.

Nodesty Server für Laravel

Die AMD Ryzen 9 9950X vServer von Nodesty sorgen mit hoher Single-Core-Leistung für kurze Antwortzeiten bei PHP-Anfragen; die AMD EPYC 7763 vServer bieten viel RAM, um Anwendung, Datenbank, Redis und Queue Worker auf demselben Server zu betreiben. Mit vollem Root-Zugriff, NVMe-Speicher, DDoS-Schutz durch nShield und kostenlosen täglichen Backups mit 7 Tagen Aufbewahrung bringen Sie Ihre Laravel-Projekte sicher online.

Häufig gestellte Fragen

Kann ich Laravel auf Shared Hosting betreiben?

Bei kleinen Projekten ist das möglich, aber für Queue Worker, den Scheduler und Werkzeuge wie Composer brauchen Sie SSH-Zugriff und Kontrolle über den Server. Für Anwendungen, die Queues und Hintergrundjobs nutzen, ist ein vServer mit vollem Root-Zugriff deutlich besser geeignet.

Ich bekomme einen 500-Fehler, aber keine Fehlermeldung. Warum?

In der Produktionsumgebung ist APP_DEBUG auf false gesetzt, daher werden keine ausführlichen Fehler angezeigt. Die Details zum Fehler stehen in der Datei storage/logs/laravel.log. Die häufigsten Ursachen sind ein fehlender APP_KEY, falsche Datenbankzugangsdaten und ein Ordner storage, der nicht beschreibbar ist.

Ich habe die .env-Datei geändert, aber die Änderung greift nicht. Warum?

Wurde die Konfiguration gecacht, liest Laravel die .env-Datei nicht erneut ein. Erneuern Sie den Cache, indem Sie php artisan config:cache noch einmal ausführen; laufen Queue Worker, starten Sie diese mit php artisan queue:restart ebenfalls neu.

Warum führt der Queue Worker den neuen Code nicht aus?

Queue Worker sind lang laufende Prozesse und halten den Code, der beim Start geladen wurde, im Arbeitsspeicher. Führen Sie nach jedem Deployment php artisan queue:restart aus; systemd oder Supervisor starten die Worker dann automatisch neu.

Kann ich die Anwendung während des Deployments in den Wartungsmodus versetzen?

Ja. Der Befehl php artisan down versetzt die Anwendung in den Wartungsmodus und zeigt Besuchern eine Wartungsseite; nach dem Deployment schalten Sie sie mit php artisan up wieder frei. Bei kurzen Deployments können Sie stattdessen auch ein unterbrechungsfreies Deployment einrichten.

Welche Datenbank sollte ich für Laravel verwenden?

Laravel unterstützt MariaDB, MySQL und PostgreSQL. Welche Sie wählen, hängt von den Anforderungen Ihres Projekts und der Erfahrung Ihres Teams ab. Zusätzlich Redis für Queues, Cache und Sessions zu nutzen, verbessert die Performance.

Nodesty

Über den Autor

Nodesty-Team · Infrastruktur und Support

Das Nodesty-Team betreibt unsere Server, unser Netzwerk und unseren DDoS-Schutz im Alltag und beantwortet Support-Anfragen rund um die Uhr. Diese Ratgeber entstehen aus dieser Arbeit.

Verwandte Artikel

Starte deinen Server jetzt.

Erstellen, wachsen und skalieren Sie Ihre Projekte grenzenlos auf der Premium-Infrastruktur von Nodesty.

                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                             ············································                                                   
                                                ··································································································..........···························                                     
                                       ················..........................................................................................................................··············                             
                                  ·············.................::::::::::::::::::::::::::::::::::::::::::::::....................:::::::::::::::::::::::::::::::::::::::................···········                        
                             ············................:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::............·········                     
                         ············.................:::::::::::::::::::::::::::::::::::::::::::::::::::------------::::::::::::::::::::::::::::::----------------:::::::::::::::::::::..........········                  
                    ············......................::::::::::::::::::::::::::::::::::::------------------------------------------------------------------------------------:::::::::::::.........········                
                ··········.............................................::::::::::::::::::-------------==========================================-----------------------------------:::::::::::........·······               
             ········..................:.....................................::::::::::--------=======+++++++++++++++++++++++++++++++++++++=========================------------------::::::::::.......·······              
           ······.........::::::::::::::::::::................................:::::::-----=====++++xxxxxx**************************xxxxxxxxx++++++++++++++===================------------::::::::.......·······             
          ·····.......:::::::::::::::::::::::::::.............................:::::----===+++xxx****%%%%&&&&&&#############&&&&&&&%%%%%*******xxxxxxxx++++++++++++++==============----------:::::::......······             
         ····......::::::::-------------:::::::::::..........................::::---===+++xx***%%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@####&&&&&%%%%*******xxxxxxxxx+++++++++++++===========--------::::::......·····             
        ····.....:::::::--------------------:::::::::.......................::::---===++xxx**%%&&&###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&%%%%%********xxxxxxxxxxx++++++++++++========------::::::.....······            
        ····.....:::::--------------------------::::::::....................::::---===++xx***%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&&%%%%%**********xxxxxxxxxxxxx+++++++++=======------:::::.....·····            
        ····....::::::-------=============---------:::::::::................:::::---===+++xx***%%%&&&#####@@@@@@@@@@@@@@@@@@@@@@@@@#####&&&&&%%%%%%*************xxxxxxxxxxxxxx+++++++++======-----:::::....·····            
         ····....:::::-------================---------:::::::::...............:::::----===++++xxx***%%%%&&&&&&#################&&&&&&%%%%%%%*******************xxxxxxxxxxxxxxxxx++++++++======----:::::....·····            
         ·····....:::::--------=================---------::::::::::..............:::::::-----====+++++xxxxxx**************************xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx++++++++=====-----::::....·····            
          ·····.....:::::--------=================----------:::::::::::.................:::::::::-------=============++++++++++++++++++++++++++++++++++++xxxxxxxxxxxxxxxxxxxxxxx++++++++======-----::::....·····            
            ·····.....:::::::----------===========-------------::::::::::::.........................::::::::::::::::::------------------=============+++++++++++++++++++++++++++++++++=======-----::::.....·····            
              ······......:::::::---------------------------------:::::::::::::........................................:::::::::::::::-----------============+++++++++++++++++++++========------:::::.....·····             
                 ······........:::::::::---------------------------:::::::::::::::::...........................................:::::::::::::------------=============================--------::::::.....······              
                    ·········.........:::::::::::::::-------------::::::::::::::::::::::::.......................................::::::::::::::::--------------------------------------::::::::......·······                
                          ··········............::::::::::::::::::::::::::::::::::::::::::::::::::................................::::::::::::::::::::::::::-------------:::::::::::::::.........········                   
                                  ············..................:::::::::::::::::::::::::::::::::::::::::::.........................:::::::::::::::::::::::::::::::::::::................···········                        
                                             ················.............................................................................................................·················                                 
                                                           ······················................................................................···························                                                
                                                                               ·········································································