Tutorial

Installieren und Konfigurieren von Laravel mit Nginx unter Ubuntu 20.04

NginxUbuntuPHPPHP FrameworksLEMPUbuntu 20.04

Einführung

Laravel ist ein Open-Source-PHP-Framework, das einen Satz von Tools und Ressourcen zur Entwicklung moderner PHP-Anwendungen bereitstellt. Dank eines umfassenden Ökosystems, das auf seine integrierten Funktionen zurückgreift, ist die Beliebtheit von Laravel in den letzten Jahren stark gestiegen. So nutzen es viele Entwickler als bevorzugtes Framework für ein optimiertes Entwicklungsverfahren.

In diesem Leitfaden werden Sie eine neue Laravel-Anwendung auf einem Ubuntu 20.04-Server installieren und konfigurieren, indem Sie Composer zum Herunterladen und Verwalten der Framework-Abhängigkeiten und Nginx zum Bereitstellen der Anwendung verwenden. Wenn Sie damit fertig sind, verfügen Sie über eine funktionale Laravel-Demoanwendung, die Inhalte aus einer MySQL 8-Datenbank abruft.

Voraussetzungen

Um diesen Leitfaden durchführen zu können, müssen Sie zunächst folgende Aufgaben auf Ihrem Ubuntu 20.04-Server erledigen:

Schritt 1 — Installieren von erforderlichen PHP-Modulen

Bevor Sie Laravel installieren können, müssen Sie einige PHP-Module installieren, die vom Framework benötigt werden. Wir verwenden apt, um die PHP-Module php-mbstring, php-xml und php-bcmath zu installieren. Diese PHP-Erweiterungen bieten zusätzliche Unterstützung für den Umgang mit Zeichencodierung, XML und mathematische Genauigkeit.

Wenn Sie apt in dieser Sitzung zum ersten Mal verwenden, sollten Sie zunächst den Befehl update zum Aktualisieren des Paketmanager-Cache ausführen:

  • sudo apt update

Sie können nun die erforderlichen Pakete installieren mit:

  • sudo apt install php-mbstring php-xml php-bcmath

Ihr System ist nun bereit, die Installation von Laravel über Composer auszuführen. Zuvor benötigen Sie jedoch noch eine Datenbank für Ihre Anwendung.

Schritt 2 — Erstellen einer Datenbank für die Anwendung

Um die grundlegende Installation und Nutzung von Laravel zu demonstrieren, erstellen wir eine Anwendung namens travel list, um eine Liste mit Orten, an die ein Benutzer gerne reisen würde, sowie eine Liste mit Orten anzuzeigen, die der Benutzer bereits besucht hat. Dies kann in einer Tabelle namens places gespeichert werden, mit einem Feld für Orte, das wir name nennen, und einem anderen Feld, das wir visited nennen, um die Orte als besucht oder nicht besucht zu markieren. Außerdem schließen wir ein id-Feld ein, um jeden Eintrag eindeutig zu identifizieren.

Um die Datenbank mit der Laravel-Anwendung zu verbinden, erstellen wir einen dedizierten MySQL-Benutzer und gewähren ihm volle Berechtigungen für die Datenbank travellist.

Zum Zeitpunkt der Verfassung dieses Dokuments unterstützt die native MySQL-PHP-Bibliothek mysqlnd nicht caching_sha2_authentication, die standardmäßige Authentifizierungsmethode für MySQL 8. Wir müssen unseren Datenbankbenutzer mit der Authentifizierungsmethode mysql_native_password einrichten, um über PHP eine Verbindung zur MySQL-Datenbank herzustellen.

Melden Sie sich zunächst als root-Datenbankbenutzer bei der MySQL-Konsole an mit:

  • sudo mysql

Um eine neue Datenbank zu erstellen, führen Sie den folgenden Befehl von Ihrer MySQL-Konsole aus:

  • CREATE DATABASE travellist;

Jetzt können Sie einen neuen Benutzer erstellen und ihm volle Berechtigungen auf der benutzerdefinierten Datenbank gewähren, die Sie gerade erstellt haben: In diesem Beispiel erstellen wir einen Benutzer namens travellist_user mit dem Passwort password; Sie sollten dies jedoch in ein sicheres Passwort Ihrer Wahl ändern:

  • CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Nun müssen wir diesem Benutzer eine Berechtigung für die Datenbank travellist erteilen:

  • GRANT ALL ON travellist.* TO 'travellist_user'@'%';

Dadurch erhält der Benutzer travellist_user volle Berechtigungen für die Datenbank travellist. Gleichzeitig wird verhindert, dass dieser Benutzer andere Datenbanken auf Ihrem Server erstellen oder verändern kann.

Beenden Sie anschließend die MySQ-Shell:

  • exit

Sie können nun testen, ob der neue Benutzer die richtigen Berechtigungen hat, indem Sie sich erneut bei der MySQL-Konsole anmelden, diesmal mit den benutzerdefinierten Anmeldedaten:

  • mysql -u travellist_user -p

Beachten Sie das -p-Flag in diesem Befehl, das Sie nach dem Passwort fragt, das Sie bei der Erstellung des Benutzers travellist_user gewählt haben. Nachdem Sie sich bei der MySQL-Konsole angemeldet haben, überprüfen Sie, ob Sie Zugriff auf die Datenbank travellist haben:

  • SHOW DATABASES;

Damit erhalten Sie die folgende Ausgabe:

Output
+--------------------+ | Database | +--------------------+ | information_schema | | travellist | +--------------------+ 2 rows in set (0.01 sec)

Erstellen Sie als Nächstes eine Tabelle namens places in der Datenbank travellist. Führen Sie die folgende Anweisung in der MySQL-Konsole aus:

  • CREATE TABLE travellist.places (
  • id INT AUTO_INCREMENT,
  • name VARCHAR(255),
  • visited BOOLEAN,
  • PRIMARY KEY(id)
  • );

Befüllen Sie nun die Tabelle places mit einigen Beispieldaten:

  • INSERT INTO travellist.places (name, visited)
  • VALUES ("Tokyo", false),
  • ("Budapest", true),
  • ("Nairobi", false),
  • ("Berlin", true),
  • ("Lisbon", true),
  • ("Denver", false),
  • ("Moscow", false),
  • ("Olso", false),
  • ("Rio", true),
  • ("Cincinnati", false),
  • ("Helsinki", false);

Um zu bestätigen, dass die Daten erfolgreich in Ihrer Tabelle gespeichert wurden, führen Sie Folgendes aus:

  • SELECT * FROM travellist.places;

Sie werden eine ähnliche Ausgabe wie diese sehen:

Output
+----+-----------+---------+ | id | name | visited | +----+-----------+---------+ | 1 | Tokyo | 0 | | 2 | Budapest | 1 | | 3 | Nairobi | 0 | | 4 | Berlin | 1 | | 5 | Lisbon | 1 | | 6 | Denver | 0 | | 7 | Moscow | 0 | | 8 | Oslo | 0 | | 9 | Rio | 1 | | 10 | Cincinnati| 0 | | 11 | Helsinki | 0 | +----+-----------+---------+ 11 rows in set (0.00 sec)

Nachdem Sie bestätigt haben, dass Sie gültige Daten in Ihrer Testtabelle haben, können Sie die MySQL-Konsole verlassen:

  • exit

Sie können nun die Anwendung erstellen und konfigurieren, um eine Verbindung mit der neuen Datenbank herzustellen.

Schritt 3 — Erstellen einer neuen Laravel-Anwendung

Sie erstellen nun eine neue Laravel-Anwendung mit dem Befehl composer create-project. Dieser Composer-Befehl dient typischerweise zum Booten neuer Anwendungen auf Grundlage vorhandener Frameworks und Content-Management-Systeme.

In diesem Leitfaden verwenden wir travellist als Beispielanwendung. Sie können jedoch auch etwas anderes verwenden. Die Anwendung travellist zeigt eine Liste mit Orten an, die von einem lokalen MySQL-Server abgerufen wurde, um die grundlegende Konfiguration von Laravel zu demonstrieren und zu prüfen, ob Sie eine Verbindung mit der Datenbank herstellen können.

Gehen Sie zunächst zum Stammverzeichnis Ihres Benutzers:

  • cd ~

Der folgende Befehl erstellt anhand von Standardeinstellungen ein neues travellist-Verzeichnis, das eine einfache Laravel-Anwendung enthält:

  • composer create-project --prefer-dist laravel/laravel travellist

Sie werden eine ähnliche Ausgabe wie diese sehen:

Output
Installing laravel/laravel (v5.8.17) - Installing laravel/laravel (v5.8.17): Downloading (100%) Created project in travellist > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 80 installs, 0 updates, 0 removals - Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%) - Installing phpoption/phpoption (1.5.0): Downloading (100%) - Installing vlucas/phpdotenv (v3.4.0): Downloading (100%) - Installing symfony/css-selector (v4.3.2): Downloading (100%) ...

Nachdem die Installation abgeschlossen ist, greifen Sie auf das Verzeichnis der Anwendung zu und führen Sie den artisan-Befehl von Laravel aus, um zu überprüfen, ob alle Komponenten erfolgreich installiert wurden:

  • cd travellist
  • php artisan

Sie sehen eine Ausgabe, die dieser ähnelt:

Output
Laravel Framework 7.11.0 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug ...

Diese Ausgabe bestätigt, dass die Anwendungsdateien vorhanden sind und die Befehlszeilentools von Laravel wie erwartet funktionieren. Wir müssen die Anwendung jedoch noch konfigurieren, um die Datenbank und einige weitere Details einzurichten.

Schritt 4 — Konfigurieren von Laravel

Die Laravel-Konfigurationsdateien befinden sich im Verzeichnis config, das Sie im Stammverzeichnis der Anwendung finden. Wenn Sie Laravel mit Composer installieren, wird außerdem eine Umgebungsdatei erstellt. Diese Datei enthält Einstellungen, die für die aktuelle von der Anwendung ausgeführte Umgebung spezifisch sind und Vorrang gegenüber den Werten haben, die im Verzeichnis config in regulären Konfigurationsdateien festgelegt sind. Jede Installation in einer neuen Umgebung erfordert eine maßgeschneiderte Umgebungsdatei, um Dinge wie Datenbank-Verbindungseinstellungen, Debug-Optionen, Anwendungs-URL und andere Objekte festzulegen, die je nach den Umgebungsbedingungen variieren können.

Warnung: Die Umgebungs-Konfigurationsdatei enthält sensible Informationen über Ihren Server, einschließlich Anmeldedaten zur Datenbank und Sicherheitsschlüssel. Aus diesem Grund sollten Sie diese Datei nie öffentlich teilen.

Wir bearbeiten nun die .env-Datei, um die Konfigurationsoptionen für die aktuelle Anwendungsumgebung anzupassen.

Öffnen Sie die .env-Datei mit Ihrem bevorzugten Befehlszeileneditor. Hier verwenden wir nano:

  • nano .env

Es gibt zwar ziemlich viele Konfigurationsvariablen in dieser Datei, aber Sie müssen sie nicht alle jetzt einrichten. Die folgende Liste enthält einen Überblick über die Variablen, die Sie sofort beachten müssen:

  • APP_NAME: Anwendungsname, der für Benachrichtigungen und Nachrichten verwendet wird.
  • APP_ENV: Aktuelle Anwendungsumgebung.
  • APP_KEY: Dieser eindeutige Schlüssel wird für die Erzeugung von Salts und Hashes verwendet und wird beim Installieren von Laravel über Composer automatisch erstellt. Daher müssen Sie ihn nicht ändern.
  • APP_DEBUG: Ob auf der Client-Seite Debug-Informationen angezeigt werden oder nicht.
  • APP_URL: Basis-URL für die Anwendung, die zum Erstellen von Anwendungslinks verwendet wird.
  • DB_DATABASE: Name der Datenbank.
  • DB_USERNAME: Benutzername für die Verbindung zur Datenbank.
  • DB_PASSWORD: Passwort für die Verbindung zur Datenbank.

Standardmäßig werden diese Werte für eine lokale Entwicklungsumgebung konfiguriert, die Homestead nutzt, eine vorab verpackte Vagrant-Box, die von Laravel bereitgestellt wird. Wir ändern diese Werte, damit sie die aktuellen Umgebungseinstellungen unserer Beispielanwendung widerspiegeln.

Wenn Sie Laravel in einer development- oder testing-Umgebung installieren, können Sie die Option APP_DEBUG aktiviert lassen, da Sie so beim Testen der Anwendung wichtige Debug-Informationen über einen Browser erhalten. Die Variable APP_ENV sollte in diesem Fall auf development oder testing gesetzt werden.

Wenn Sie Laravel in einer Produktionsumgebung installieren, sollten Sie die Option APP_DEBUG deaktivieren, da sie dem endgültigen Benutzer sensible Daten über Ihre Anwendung anzeigt. Die Option APP_ENV sollte in diesem Fall auf production gesetzt werden.

Die folgende .env-Datei richtet unsere Beispielanwendung für development ein:

Anmerkung: Die Variable APP_KEY enthält einen eindeutigen Schlüssel, der automatisch generiert wurde, als Sie Laravel über Composer installiert haben. Sie müssen diesen Wert nicht ändern. Wenn Sie einen neuen sicheren Schlüssel erstellen möchten, können Sie den Befehl php artisan key:generate verwenden.

/var/www/travellist/.env
APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

...

Passen Sie Ihre Variablen entsprechend an. Wenn Sie mit der Bearbeitung fertig sind, speichern und schließen Sie die Datei, um Ihre Änderungen zu speichern. Wenn Sie nano verwenden, drücken Sie dazu STRG+X, dann Y und die Eingabetaste, um zu bestätigen.

Ihre Laravel-Anwendung ist nun eingerichtet. Sie müssen jedoch noch den Webserver konfigurieren, um über einen Browser auf sie zugreifen zu können. Im nächsten Schritt konfigurieren wir Nginx, um Ihre Laravel-Anwendung bereitzustellen.

Schritt 5 — Einrichten von Nginx

Wir haben Laravel in einem lokalen Ordner des Stammverzeichnisses Ihres Remotebenutzers installiert. Das eignet sich zwar gut für lokale Entwicklungsumgebungen, ist aber keine empfohlene Praxis für Webserver, die offen für das öffentliche Internet sind. Wir verschieben den Anwendungsordner nach /var/www. Dabei handelt es sich um den üblichen Speicherort für Webanwendungen, die unter Nginx ausgeführt werden.

Verwenden Sie zunächst den Befehl mv, um den Anwendungsordner mit all seinen Inhalten in /var/www/travellist zu verschieben:

  • sudo mv ~/travellist /var/www/travellist

Jetzt müssen wir dem Benutzer des Webservers Schreibzugriff auf die Ordner storage und cache gewähren, in denen Laravel von der Anwendung generierte Dateien speichert:

  • sudo chown -R www-data.www-data /var/www/travellist/storage
  • sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache

Die Anwendungsdateien sind nun fertig, aber wir müssen noch Nginx konfigurieren, um die Inhalte bereitzustellen. Dazu erstellen wir eine neue Virtual Host-Konfigurationsdatei in /etc/nginx/sites-available:

  • sudo nano /etc/nginx/sites-available/travellist

Die folgende Konfigurationsdatei enthält die empfohlenen Einstellungen für Laravel-Anwendungen in Nginx:

/etc/nginx/sites-available/travellist
server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travellist/public;

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

    index index.html index.htm 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; }

    error_page 404 /index.php;

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

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

Kopieren Sie diesen Inhalt in Ihre Datei /etc/nginx/sites-available/travellist und passen Sie bei Bedarf die hervorgehobenen Werte an, um sie auf Ihre eigene Konfiguration abzustimmen. Speichern und schließen Sie die Datei, wenn die Bearbeitung abgeschlossen ist.

Um die neue Virtual Host-Konfigurationsdatei zu aktivieren, erstellen Sie einen symbolischen Link zu travellist in sites-enabled:

  • sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Anmerkung: Wenn Sie über eine andere Virtual Host-Datei verfügen, die zuvor für den gleichen im virtuellen Host travellist verwendeten server_name konfiguriert wurde, müssen Sie die alte Konfiguration deaktivieren, indem Sie den entsprechenden symbolischen Link in /etc/nginx/sites-enabled/ entfernen.

Um zu überprüfen, ob die Konfiguration keine Syntaxfehler enthält, können Sie Folgendes verwenden:

  • sudo nginx -t

Sie sollten eine Ausgabe wie diese sehen:

Output
  • nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  • nginx: configuration file /etc/nginx/nginx.conf test is successful

Um die Änderungen anzuwenden, laden Sie Nginx neu mit:

  • sudo systemctl reload nginx

Greifen Sie nun über Ihren Browser mit dem Domänennamen oder der IP-Adresse des Servers, wie mit der Direktive server_name in Ihrer Konfigurationsdatei definiert, auf die Anwendung zu:

http://server_domain_or_IP

Sie sehen eine Seite wie diese:

Laravel-Begrüßungsseite

Das bestätigt, dass Ihr Nginx-Server richtig konfiguriert ist, um Laravel bereitzustellen. Jetzt können Sie mit der Erstellung Ihrer Anwendung über das von der Standardinstallation bereitgestellte Skelett beginnen.

Im nächsten Schritt ändern wir die Hauptroute der Anwendung, um Daten in der Datenbank mit der DB-Fassade von Laravel abfragen zu können.

Schritt 6 — Anpassen der Hauptseite

Wenn Sie in diesem Leitfaden alle Schritte befolgt haben, sollten Sie über eine funktionierende Laravel-Anwendung und eine Datenbanktabelle namens places mit einigen Beispieldaten verfügen.

Wir bearbeiten nun die Hauptroute der Anwendung, um die Datenbank abfragen und die Inhalte in der Ansicht der Anwendung zurückgeben zu können.

Öffnen Sie die Datei für die Hauptroute, routes/web.php:

  • nano routes/web.php

Diese Datei weist standardmäßig folgenden Inhalt auf:

routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Routen werden in dieser Datei mit der statischen Methode Route::get definiert, die einen Pfad und eine Callback-Funktion als Argumente erhält.

Der folgende Code ersetzt die Callback-Funktion der Hauptroute. Es werden 2 Abfragen an die Datenbank gestellt, wobei das Flag visited zum Filtern der Ergebnisse dient. Die Ergebnisse werden in einer Ansicht namens travellist zurückgegeben, die wir als Nächstes erstellen werden. Kopieren Sie diesen Inhalt in Ihre Datei routes/web.php und ersetzen Sie den bereits vorhandenen Code:

routes/web.php
<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $visited = DB::select('select * from places where visited = ?', [1]); 
  $togo = DB::select('select * from places where visited = ?', [0]);

  return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});

Speichern und schließen Sie die Datei, wenn die Bearbeitung abgeschlossen ist. Wir erstellen nun die Ansicht, die die Datenbankergebnisse für den Benutzer rendern wird. Erstellen Sie eine neue Datei in resources/views:

  • nano resources/views/travellist.blade.php

Die folgende Vorlage erstellt zwei Listen mit Orten auf der Grundlage der Variablen visited und togo. Kopieren Sie diesen Inhalt in Ihre neue Datei:

resources/views/travellist/blade.php
<html>
<head>
    <title>Travel List</title>
</head>

<body>
    <h1>My Travel Bucket List</h1>
    <h2>Places I'd Like to Visit</h2>
    <ul>
      @foreach ($togo as $newplace)
        <li>{{ $newplace->name }}</li>
      @endforeach
    </ul>

    <h2>Places I've Already Been To</h2>
    <ul>
          @foreach ($visited as $place)
                <li>{{ $place->name }}</li>
          @endforeach
    </ul>
</body>
</html>

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Gehen Sie nun zu Ihrem Browser und laden Sie die Anwendung neu. Sie sehen in etwa folgende Seite:

Demoversion der Laravel-Anwendung

Sie verfügen nun über eine funktierende Laravel-Anwendung, die Inhalte aus einer MySQL-Datenbank abruft.

Zusammenfassung

In diesem Tutorial haben Sie eine neue Laravel-Anwendung auf einem LEMP-Stack (Linux, Nginx, MySQL und PHP) eingerichtet, der auf einem Ubuntu 20.04-Server ausgeführt wird. Außerdem haben Sie Ihre Standardroute angepasst, um Datenbankinhalte abfragen und die Ergebnisse in einer benutzerdefinierten Ansicht anzeigen zu können.

Nun können Sie neue Routen und Ansichten für zusätzliche Seiten erstellen, die Sie für Ihre Anwendung benötigen. Weitere Informationen über Routen, Ansichten und unterstützte Datenbanken finden Sie in der offiziellen Laravel-Dokumentation. Wenn Sie in der Produktionsumgebung bereitstellen, sollten Sie auch den Optimierungsabschnitt konsultieren, um zu erfahren, wie Sie die Leistung Ihrer Anwendung auf verschiedene Weise verbessern können.

Creative Commons License