Laravel mit Nginx auf Ubuntu 24.04 bereitstellen

Laravel ist ein weit verbreitetes PHP-Framework für die Entwicklung moderner Webanwendungen. Es überzeugt durch eine ausdrucksstarke Syntax und starke Funktionen wie Routing, Authentifizierung und Datenbankverwaltung. Das Framework läuft mit mehreren PHP-Versionen und lässt sich problemlos mit weiteren Backend-Diensten wie Datenbankservern kombinieren. Wenn du Laravel hinter Nginx betreibst, kannst du performante und skalierbare Produktiv-Anwendungen ausliefern und zeitgemäße Weblösungen umsetzen.

Diese Anleitung zeigt, wie du Laravel zusammen mit Nginx auf Ubuntu 24.04 deployst. Dafür richtest du Laravel ein und erstellst anschließend ein neues Projekt, das du über Nginx unter einer eigenen Domain wie app.example.com veröffentlichst.

Voraussetzungen

Bevor du loslegst, stelle sicher, dass du:

  • Zugriff auf eine Ubuntu-24.04-Instanz als nicht-root Sudo-User hast.
  • Den Nginx Web Server installiert hast.
  • MySQL als Datenbank-Backend installiert hast.
  • Einen Domain-A-Record auf die öffentliche IP der Instanz gesetzt hast, zum Beispiel app.example.com.

Eine MySQL-Datenbank für Laravel erstellen

Laravel verwendet eine relationale Datenbank, um Anwendungsdaten zu speichern. Mit den folgenden Schritten richtest du eine neue MySQL-Datenbank ein, fügst Testdaten hinzu und erstellst einen eigenen Datenbankbenutzer für Laravel.

Melde dich in der MySQL-Konsole als root-Datenbankbenutzer an.

Code-Erklärung (BETA, powered by centron Agent): Führe den folgenden Befehl aus, um den APT-Paketindex zu aktualisieren, MySQL bei Bedarf zu installieren und anschließend die Datenbankkonsole zu öffnen.

$ sudo apt update && sudo apt install mysql-server -y && sudo mysql

Code-Erklärung (BETA, powered by centron Agent): Erstelle eine neue centron_demo-Datenbank für Laravel.

mysql> CREATE DATABASE centron_demo;

Code-Erklärung (BETA, powered by centron Agent): Lege einen neuen MySQL-Benutzer centron_user mit einem starken Passwort an. Ersetze secure_password durch dein gewünschtes Passwort.

mysql> CREATE USER 'centron_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secure_password';

Code-Erklärung (BETA, powered by centron Agent): Gib dem Benutzer centron_user volle Rechte auf die centron_demo-Datenbank.

mysql> GRANT ALL ON centron_demo.* TO 'centron_user'@'localhost';

Code-Erklärung (BETA, powered by centron Agent): Lade die MySQL-Privilegien neu, damit die Änderungen aktiv werden.

Code-Erklärung (BETA, powered by centron Agent): Beende die MySQL-Konsole.

Code-Erklärung (BETA, powered by centron Agent): Melde dich als centron_user an und gib das Passwort ein, wenn du dazu aufgefordert wirst.

$ mysql -u centron_user -p

Code-Erklärung (BETA, powered by centron Agent): Liste alle Datenbanken auf und prüfe, ob centron_demo vorhanden ist.

Ausgabe:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| centron_demo       |
+--------------------+
3 rows in set (0.00 sec)

Wechsle in die centron_demo-Datenbank.

Erstelle eine server_stats-Tabelle mit aktiven Spalten zur Erfassung von Server-Kennzahlen.

mysql> CREATE TABLE server_stats (  
            id INT AUTO_INCREMENT,  
            server_name VARCHAR(255),  
            region VARCHAR(255),  
            cpu_usage DECIMAL(5,2),  
            memory_usage DECIMAL(5,2),  
            status ENUM('active', 'maintenance', 'offline'),  
            last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  
            PRIMARY KEY(id)  
        );

Füge Demodaten in die server_stats-Tabelle ein.

mysql> INSERT INTO server_stats (
           server_name, region, cpu_usage, memory_usage, status
       )
       VALUES 
           ('CENTRON-APP-01', 'New York', 24.50, 45.30, 'active'),
           ('CENTRON-DB-01',  'London',    12.75, 78.20, 'active'),
           ('CENTRON-WEB-01', 'Tokyo',     65.80, 89.50, 'active');

Verlasse die MySQL-Konsole.

Composer und PHP-Erweiterungen installieren

Laravel benötigt Composer sowie bestimmte PHP-Extensions, um auf einem Server sauber zu laufen. Mit den folgenden Schritten installierst du PHP, Composer und alle erforderlichen PHP-Module für Laravel.

Aktualisiere den APT-Paketindex.

Installiere Composer und die PHP-Erweiterungen, die Laravel voraussetzt.

$ sudo apt install composer php php-curl php-fpm php-bcmath php-json php-mysql php-mbstring php-xml php-tokenizer php-zip -y

Dieser Befehl installiert Composer, PHP und die von Laravel benötigten Erweiterungen. Zu den Paketen gehören:

  • composer: Ein Abhängigkeitsmanager für PHP.
  • php-fpm: Der PHP FastCGI Process Manager, der PHP als Dienst bereitstellt und Anfragen von Webservern wie Nginx annimmt.
  • php-mysql: Stellt die Verbindung von PHP zu MySQL-Datenbanken her.
  • php-mbstring: Aktiviert die Multibyte-String-Unterstützung, die Laravel benötigt.
  • php-curl: Ermöglicht PHP, HTTP-Anfragen an externe URLs zu senden.
  • php-bcmath: Liefert Mathematikfunktionen mit beliebiger Genauigkeit für PHP-Anwendungen.
  • php-json: Unterstützt das Kodieren und Dekodieren von JSON für APIs, JavaScript und strukturierte Daten.
  • php-xml: Ermöglicht das Erstellen und Verarbeiten von XML-Dokumenten in Anwendungen.
  • php-tokenizer: Enthält Werkzeuge zum Tokenisieren von PHP-Code.
  • php-zip: Erlaubt Laravel das Lesen und Schreiben komprimierter .zip-Archive.

Prüfe die installierte Composer-Version.

Ausgabe:

Composer version 2.7.1 2024-02-09 15:26:28
.................

Überprüfe die installierte PHP-Version.

Ausgabe:

PHP 8.3.6 (cli) (built: Mar 19 2025 10:08:38) (NTS)
  Copyright (c) The PHP Group
...

Starte PHP-FPM passend zur installierten Version neu, zum Beispiel php8.3-fpm.

$ sudo systemctl restart php8.3-fpm

Laravel-Anwendung erstellen

Folge den nachstehenden Schritten, um eine Laravel-Anwendung anzulegen und sie so zu konfigurieren, dass sie die zuvor erstellte MySQL-Datenbank nutzt.

Wechsle in das Home-Verzeichnis deines Users.

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Lege ein neues Laravel-Projekt an, zum Beispiel centron-demo.

$ composer create-project --prefer-dist laravel/laravel centron-demo

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Der Befehl lädt Laravel inklusive aller Abhängigkeiten herunter und erzeugt das Projektverzeichnis centron-demo.

Wechsle in das centron-demo Projektverzeichnis.

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Erzeuge einen eindeutigen Application-Key, der für sichere Verschlüsselung benötigt wird.

$ php artisan key:generate

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Ausgabe:

INFO Application key set successfully.

Öffne die Datei .env mit einem Editor wie nano, um die Datenbankverbindung für Laravel sowie den Session-Treiber einzustellen.

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Passe den ersten Abschnitt an: Trage deinen Projektnamen wie centron-demo ein, ändere die Umgebung von local auf development und setze die URL von http://localhost auf deine Domain. Ersetze app.example.com durch deine echte Domain.

APP_NAME=centron-demo
APP_ENV=development
APP_KEY=base64:APPLICATION_UNIQUE_KEY
APP_DEBUG=true
APP_URL=http://app.example.com

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Aktualisiere den Abschnitt für die Datenbankverbindung mit deinen Werten. Setze DB_CONNECTION von sqlite auf mysql, aktiviere Host, Port, Datenbank und Benutzer und ersetze die Platzhalter durch deine MySQL-Details für Laravel.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=centron_demo
DB_USERNAME=centron_user
DB_PASSWORD=secure_password

SESSION_DRIVER=file

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Speichere die Datei und schließe sie.

Verschiebe dein centron-demo Projekt in ein Standard-Webroot-Verzeichnis wie /var/www.

$ sudo mv ~/centron-demo /var/www/centron-demo

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Übertrage den Besitz des Laravel-Projektordners /var/www/centron-demo an den Nginx-User und die Gruppe www-data.

$ sudo chown -R www-data:www-data /var/www/centron-demo

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Setze für /var/www/centron-demo/storage die Rechte auf 755, damit www-data volle Zugriffsrechte im Verzeichnis hat.

$ sudo chmod -R 755 /var/www/centron-demo/storage

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Setze für /var/www/centron-demo/bootstrap/cache die Rechte auf 755, damit www-data Cache-Dateien erstellen kann.

$ sudo chmod -R 755 /var/www/centron-demo/bootstrap/cache

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Wechsle in dein Projektverzeichnis /var/www/centron-demo.

$ cd /var/www/centron-demo

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Starte die Laravel-Migrationen, um die Datenbankverbindung zu prüfen.

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Wenn alles korrekt ist, sollte die Ausgabe ähnlich wie unten aussehen.

……………..

INFO Running migrations.

0001_01_01_000000_create_users_table ………. 15ms DONE

0001_01_01_000001_create_cache_table ……….. 5ms DONE

……………..

Laravel mit Nginx konfigurieren

Nginx stellt Laravel-Dateien über Server-Block-Konfigurationen aus deinem Projektverzeichnis bereit. Mit den folgenden Schritten richtest du Laravel unter Nginx ein, indem du eine neue Virtual-Host-Datei mit Server-Block und PHP-Anbindung erstellst.

Prüfe den Status des Nginx-Dienstes und stelle sicher, dass er läuft.

$ sudo systemctl status nginx

Code-Erklärung (BETA, powered by centron Agent): Ausgabe:

● nginx.service – A high performance web server and a reverse proxy server

Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)

Active: active (running) since Mon 2025-04-21 13:08:27 UTC; 18s ago

Docs: man:nginx(8)

Process: 19294 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)

Process: 19296 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)

Führe den folgenden Befehl aus, um Nginx bei Bedarf zu installieren, Apache zu stoppen (falls aktiv) und Nginx zu starten.

$ sudo apt install nginx -y && sudo systemctl stop apache2 && sudo systemctl start nginx

Code-Erklärung (BETA, powered by centron Agent): Erstelle eine neue Nginx-Konfigurationsdatei centron-demo.conf unter /etc/nginx/sites-available.

$ sudo nano /etc/nginx/sites-available/centron-demo.conf

Code-Erklärung (BETA, powered by centron Agent): Füge die folgenden Einstellungen in centron-demo.conf ein. Ersetze app.example.com durch deine eigene Domain.

server {
    listen 80;
    server_name app.example.com;
    root /var/www/centron-demo/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

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

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

Code-Erklärung (BETA, powered by centron Agent): Speichere die Datei und schließe sie.

Diese Konfiguration sorgt dafür, dass Nginx die Laravel-App über Port 80 unter app.example.com ausliefert. Der Block location ~ \.php leitet PHP-Anfragen an den PHP-FPM-Socket weiter, sodass Nginx Laravel-Dateien korrekt bedienen kann.

Aktiviere die Konfiguration, indem du centron-demo.conf nach /etc/nginx/sites-enabled verlinkst.

$ sudo ln -s /etc/nginx/sites-available/centron-demo.conf /etc/nginx/sites-enabled/

Code-Erklärung (BETA, powered by centron Agent): Teste die Nginx-Konfiguration auf Fehler.

Code-Erklärung (BETA, powered by centron Agent): Ausgabe:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Starte Nginx neu, um die Änderungen zu übernehmen.

$ sudo systemctl restart nginx

Code-Erklärung (BETA, powered by centron Agent): Erlaube HTTP-Zugriff auf Port 80 in der Firewall.

Code-Erklärung (BETA, powered by centron Agent): Lade UFW neu, damit die Regeln wirksam werden.

Öffne app.example.com in einem Browser wie Chrome und prüfe, ob die Standard-Laravel-Seite erscheint.

http://app.example.com

Laravel application interface

Laravel mit vertrauenswürdigen Let’s-Encrypt-SSL-Zertifikaten absichern

Nginx liefert Laravel standardmäßig über HTTP aus, was per se unsicher ist. Mit SSL-Zertifikaten aktivierst du HTTPS und verschlüsselst die Verbindung zu deinem Webserver. Nutze die folgenden Schritte, um vertrauenswürdige Let’s-Encrypt-Zertifikate zu erstellen und Laravel abzusichern.

Installiere den Certbot-Client für Let’s Encrypt samt Nginx-Plugin.

$ sudo apt install certbot python3-certbot-nginx -y

Code-Erklärung (BETA, powered by centron Agent): Erzeuge ein neues SSL-Zertifikat über das Nginx-Plugin für deine Domain. Ersetze app.example.com durch deine Domain und admin@app.example.com durch deine aktive E-Mail-Adresse.

$ sudo certbot --nginx --redirect -d app.example.com -m admin@app.example.com --agree-tos

Code-Erklärung (BETA, powered by centron Agent): Bei Erfolg sollte die Ausgabe ähnlich wie unten aussehen.

Requesting a certificate for app.example.com

Successfully received certificate.

Certificate is saved at: /etc/letsencrypt/live/app.example.com/fullchain.pem

Key is saved at: /etc/letsencrypt/live/app.example.com/privkey.pem

This certificate expires on 2025-07-06.

These files will be updated when the certificate renews.

Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate

Successfully deployed certificate for app.example.com to /etc/nginx/sites-enabled/centron-demo.conf

Congratulations! You have successfully enabled HTTPS on https://app.example.com

Teste, ob Certbot das Zertifikat vor Ablauf automatisch erneuern kann.

$ sudo certbot renew --dry-run

Code-Erklärung (BETA, powered by centron Agent): Starte Nginx neu, um die SSL-Änderungen zu übernehmen.

$ sudo systemctl restart nginx

Code-Erklärung (BETA, powered by centron Agent): Erlaube HTTPS-Traffic über Port 443 in der Firewall.

Code-Erklärung (BETA, powered by centron Agent): Lade UFW neu, um die Firewall-Regeln anzuwenden.

Eine Demo-Laravel-Anwendung erstellen

Laravel bringt eine Beispielanwendung mit einer „Let’s get started“-Seite mit, die du durch eigenen Code ersetzen kannst. Mit den folgenden Schritten tauschst du die Standarddateien aus und baust eine Demo-App mit einem Dashboard, das Server-Metriken aus deiner MySQL-Datenbank anzeigt.

Öffne und bearbeite die Route-Datei von Laravel.

Sichere zuerst die Standarddatei web.php in deinem Projektverzeichnis.

$ sudo mv /var/www/centron-demo/routes/web.php /var/www/centron-demo/routes/web.php.ORIG

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Erstelle die web.php Datei neu.

$ sudo nano /var/www/centron-demo/routes/web.php

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Füge die folgende Standard-Route ein, um die in MySQL gespeicherten Server-Metriken abzufragen.

<?php

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    $servers = DB::table('server_stats')
                ->orderBy('status')
                ->orderBy('cpu_usage', 'desc')
                ->get();

    return view('dashboard', ['servers' => $servers]);
});

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Speichere die Datei und schließe sie.

Der Anwendungscode nutzt Laravels Query-Builder, um alle Einträge aus der Tabelle server_stats in der MySQL-Datenbank zu laden. Danach werden die Server nach Status und CPU-Auslastung sortiert und an eine Dashboard-View übergeben.

Erstelle eine neue Blade-Vorlage dashboard.blade.php für die Dashboard-View.

$ sudo nano /var/www/centron-demo/resources/views/dashboard.blade.php

<h4>Code-Erklärung</h4> (BETA, powered by centron Agent): Füge den folgenden HTML-Code in dashboard.blade.php ein, damit die Server-Metriken angezeigt werden.

<!DOCTYPE html>
<html>
<head>
    <title>Server Dashboard | Centron Demo</title>
    <style>
        body { font-family: 'Segoe UI', sans-serif; margin: 2rem; }
        .server-card { 
            padding: 1rem; 
            margin-bottom: 1rem; 
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1); 
        }
        .active { 
            border-left: 4px solid #10B981; 
            background: #F0FDF4; 
        }
        .maintenance { 
            border-left: 4px solid #F59E0B; 
            background: #FFFBEB; 
        }
        .offline { 
            border-left: 4px solid #EF4444; 
            background: #FEF2F2; 
        }
        .metric { 
            font-weight: 600; 
            color: #1F2937; 
        }
    </style>
</head>
<body>
    <h1>Server Status Dashboard</h1>
    <p>Real-time metrics from your infrastructure</p>

    @foreach($servers as $server)
    <div class="server-card {{ $server->status }}">
        <h3>{{ $server->server_name }} <small>({{ $server->region }})</small></h3>
        <p class="metric">Status: {{ ucfirst($server->status) }}</p>

        @if($server->status != 'offline')
            <p class="metric">CPU: {{ $server->cpu_usage }}%</p>
            <p class="metric">Memory: {{ $server->memory_usage }}%</p>
        @endif

        <p>Last updated: {{ $server->last_updated }}</p>
    </div>
    @endforeach
</body>
</html>

Code-Erklärung (BETA, powered by centron Agent): Speichere die Datei und schließe sie.

Der obige Anwendungscode zeigt die aus web.php übergebenen Server-Metriken gesammelt auf einer einzelnen Seite an.

Starte Nginx neu, damit die Änderungen aktiv werden.

$ sudo systemctl restart nginx

Rufe deine Domain anschließend über HTTPS in einem neuen Browserfenster auf und prüfe, ob die Laravel-Anwendung korrekt mit Daten aus MySQL angezeigt wird.

https://app.example.com

Laravel Demo Dashboard Showing Server Metrics

Fazit

Du hast Laravel zusammen mit Nginx auf Ubuntu 24.04 bereitgestellt und eine Beispielanwendung erstellt, die Daten aus einer MySQL-Datenbank abfragt und live darstellt. Du kannst dein Laravel-Projekt mit weiteren Modellen, Views und Controllern erweitern, um Anwendungen über Nginx produktiv auszuliefern. Weitere Details und Optionen findest du in der offiziellen Laravel-Dokumentation.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren:

Moderne Hosting Services mit Cloud Server, Managed Server und skalierbarem Cloud Hosting für professionelle IT-Infrastrukturen

TensorRT und ONNX: High-Performance-ML auf NVIDIA-GPUs

AI/ML, Tutorial
VijonaHeute um 12:58 Uhr Machine-Learning-Frameworks, Modell-Tools und Deployment-Strategien in der ML-Pipeline Machine-Learning-Frameworks, spezialisierte Modell-Tools und Deployment-Lösungen übernehmen jeweils unterschiedliche Aufgaben innerhalb eines Machine-Learning-(ML)-Workflows. In jeder Phase – von der Modellerstellung über…