Bereitstellen einer Laravel-Anwendung mit Nginx unter Ubuntu 16.04

Laravel ist eines der beliebtesten Open-Source-Frameworks für Webanwendungen, die in PHP geschrieben wurden. Es soll Entwicklern dabei helfen, sowohl einfache als auch komplexe Anwendungen zu erstellen, indem häufig verwendete Anwendungsaufgaben (wie Caching und Authentifizierung) vereinfacht werden.

In diesem Lernprogramm stellen wir eine einfache Laravel-Anwendung mit Blick auf die Produktionsumgebung bereit, für die einige allgemeine Schritte erforderlich sind. Beispielsweise sollten Anwendungen einen dedizierten Datenbankbenutzer verwenden, der nur auf die erforderlichen Datenbanken zugreifen kann. Dateiberechtigungen sollten sicherstellen, dass nur die erforderlichen Verzeichnisse und Dateien beschreibbar sind. Anwendungseinstellungen sollten berücksichtigt werden, um sicherzustellen, dass dem Endbenutzer keine Debugging-Informationen angezeigt werden, durch die Details zur Anwendungskonfiguration angezeigt werden könnten.

In diesem Lernprogramm wird die Bereitstellung einer vorhandenen Anwendung beschrieben. Wenn Sie stattdessen mehr über die Verwendung des Laravel-Frameworks selbst erfahren möchten, bietet sich die Laravel-eigene Laravel from Scratch -Serie an.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Paketabhängigkeiten installieren

Zum Ausführen von Laravel-Anwendungen benötigen Sie neben dem grundlegenden LEMP-Stack einige PHP-Erweiterungen und einen PHP-Abhängigkeits-Manager namens Composer.

Aktualisieren Sie zunächst den Paketmanager-Cache.

sudo apt-get update

Die PHP-Erweiterungen, die Sie benötigen, sind für die Unterstützung von Multibyte-Strings und XML vorgesehen. Sie können diese Erweiterungen, Composer und "+ unzip +" (mit denen Composer Zip-Dateien verarbeiten kann) gleichzeitig installieren.

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

Nachdem die Paketabhängigkeiten installiert wurden, erstellen und konfigurieren wir eine MySQL-Datenbank und ein dediziertes Benutzerkonto für die App.

Schritt 2 - Konfiguration von MySQL

Laravel unterstützt eine Vielzahl von Datenbankservern. Da dieses Tutorial den LE M P-Stack verwendet, speichert MySQL Daten für die Anwendung.

In einer Standardinstallation erstellt MySQL nur das Administratorkonto * root *. Es ist eine schlechte Sicherheitspraxis, den * root * -Datenbankbenutzer innerhalb einer Website zu verwenden, da er über unbegrenzte Berechtigungen auf dem Datenbankserver verfügt. Erstellen wir stattdessen einen dedizierten Datenbankbenutzer für die Laravel-Anwendung sowie eine neue Datenbank, auf die der Laravel-Benutzer zugreifen darf.

Melden Sie sich beim MySQL-Administratorkonto "+ root +" an.

mysql -u root -p

Sie werden aufgefordert, das Kennwort einzugeben, das Sie während der Installation für das MySQL-Konto * root * festgelegt haben.

Erstellen Sie zunächst eine neue Datenbank mit dem Namen "++", die wir für die Website verwenden. Sie können einen anderen Namen wählen, müssen sich diesen jedoch merken, da Sie ihn später benötigen.

CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Als Nächstes erstellen Sie einen neuen Benutzer, der auf diese Datenbank zugreifen darf. Hier verwenden wir "" als Benutzernamen, aber Sie können dies auch anpassen. Denken Sie daran, "" in der folgenden Zeile durch ein sicheres Passwort zu ersetzen.

GRANT ALL ON .* TO ''@'localhost' IDENTIFIED BY '';

Erlöschen Sie die Berechtigungen, um den MySQL-Server über die Änderungen zu informieren.

FLUSH PRIVILEGES;

Und beenden Sie MySQL.

EXIT;

Sie haben jetzt eine dedizierte Datenbank und das Benutzerkonto für Laravel konfiguriert. Die Datenbankkomponenten sind bereit. Als Nächstes richten wir die Demoanwendung ein.

Schritt 3 - Einrichten der Demo-Anwendung

Die Demo-Anwendung "+ quickstart +", distributed by Laravel on GitHub, ist eine einfache Aufgabenliste. Sie können Aufgaben hinzufügen und entfernen und ihre Aufgaben in der MySQL-Datenbank speichern.

Erstellen Sie zunächst ein Verzeichnis im Nginx-Webstamm, in dem sich die Anwendung befindet. Da die Demo-Anwendung "+ quickstart " heißt, verwenden wir " / var / www / html / quickstart +".

sudo mkdir -p /var/www/html/

Ändern Sie als nächstes den Besitz des neu erstellten Verzeichnisses in Ihren Benutzer, damit Sie mit den darin enthaltenen Dateien arbeiten können, ohne + sudo + zu verwenden.

sudo chown  /var/www/html/

Wechseln Sie in das neue Verzeichnis und klonen Sie die Demo-Anwendung mit Git.

cd /var/www/html/quickstart
git clone https://github.com/laravel/quickstart-basic .

Git lädt alle Dateien aus dem Demo-Anwendungs-Repository herunter. Die Ausgabe sieht folgendermaßen aus:

Git outputCloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.

Als nächstes müssen wir die Projektabhängigkeiten installieren. Laravel verwendet Composer für das Abhängigkeitsmanagement, wodurch die Installation der erforderlichen Pakete in einem Durchgang vereinfacht wird.

composer install

Die etwas längere Ausgabe zeigt den Installationsfortschritt für alle Projektabhängigkeiten:

Composer outputLoading composer repositories with package information
Installing dependencies (including require-dev) from lock file
. . .
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader

Die App selbst wird eingerichtet, und im nächsten Schritt wird die App-Umgebung konfiguriert. Dazu müssen Sie die Anwendung und die Datenbank verbinden und einige Einstellungen für die Produktion anpassen.

Schritt 4 - Konfigurieren der Anwendungsumgebung

In diesem Schritt ändern wir einige sicherheitsrelevante Anwendungseinstellungen, ermöglichen der Anwendung, eine Verbindung zur Datenbank herzustellen, und bereiten die Datenbank für die Verwendung vor. Dies sind die notwendigen Schritte für alle LEMP-gestützten Laravel-Anwendungen, nicht nur für die Demo-Anwendung, die wir hier verwenden.

Öffnen Sie die Laravel-Umgebungskonfigurationsdatei mit "+ nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /var/www/html/quickstart/.env

Sie müssen die folgenden Änderungen an der Datei vornehmen. Stellen Sie sicher, dass Sie die Platzhaltervariablen wie "" und "" mit den entsprechenden Werten aktualisieren.

/var/www/html/quickstart/.env

APP_ENV=
APP_DEBUG=
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://

DB_HOST=127.0.0.1
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

. . .

Speichern Sie die Datei und beenden Sie sie.

Gehen wir diese Änderungen genauer durch. Hier gibt es zwei Konfigurationsblöcke; Die erste ist für die Anwendungskonfiguration und die zweite für die Datenbankkonfiguration.

Im Abschnitt zur Anwendungskonfiguration:

  • Die Variable "+ APP_ENV " bezeichnet die Systemumgebung, in der die Anwendung ausgeführt wird. Der Standardwert ist ` local `, der für lokale Entwicklungsumgebungen verwendet wird. Für die Produktionsbereitstellung sollte es wie hier in " Produktion" geändert werden.
    Durch Ändern dieser Variablen werden die Ausführlichkeit des Protokolls, die Caching-Einstellungen und die Anzeige der Fehler (je nach App) gesteuert. Mit den Einstellungen "+ local +" wird das Entwickeln und Debuggen vereinfacht. Dies ist praktisch, wenn Sie an einer App arbeiten, sollte aber nicht in einem Produktions-Setup verwendet werden.

  • Die Variable "+ APP_DEBUG " ergänzt " APP_ENV " und aktiviert oder deaktiviert explizit die Debug-Informationen und die ausführliche Fehleranzeige. Bei Produktions-Setups sollte dieser Wert auf " false +" gesetzt werden, um zu verhindern, dass den Benutzern Debugging-Informationen angezeigt werden.

  • Die Variable "+ APP_URL " gibt die IP-Adresse oder den Domänennamen an, unter denen auf die Site zugegriffen werden soll. Wir haben hier den `+` - Domainnamen verwendet, aber Sie sollten ihn durch Ihre eigene Domain ersetzen, mit der auf die Website zugegriffen werden soll.

Der Abschnitt zur Datenbankkonfiguration ist etwas übersichtlicher:

  • + DB_DATABASE + ist der Name der Datenbank.

  • + DB_USERNAME + ist der Name des MySQL-Benutzers, den die App verwenden soll.

  • "+ DB_PASSWORD +" ist das Datenbankkennwort für diesen Benutzer.

Als Nächstes müssen wir database migrations ausführen, wodurch die neu erstellte Datenbank mit den erforderlichen Tabellen gefüllt wird, damit die Demoanwendung ordnungsgemäß ausgeführt werden kann.

php artisan migrate

Artisan wird Sie um Bestätigung bitten, wenn wir beabsichtigen, es im Produktionsmodus auszuführen. Beantworten Sie die Frage mit + y +. Anschließend werden die erforderlichen Datenbankaufgaben ausgeführt.

Artisan output**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] (yes/no) [no]:
>

Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_10_27_141258_create_tasks_table

Wir haben Laravel jetzt vollständig installiert und konfiguriert. Als nächstes müssen wir Nginx konfigurieren, um die Anwendung zu bedienen.

Schritt 5 - Konfigurieren von Nginx

Das Anwendungsverzeichnis gehört unserem Systembenutzer * sammy * und kann vom Webserver gelesen, aber nicht beschrieben werden. Dies gilt für die meisten Anwendungsdateien, es gibt jedoch nur wenige Verzeichnisse, die einer besonderen Behandlung bedürfen. Überall dort, wo Laravel hochgeladene Medien und zwischengespeicherte Daten speichert, muss der Webserver nicht nur auf diese zugreifen, sondern auch Dateien darauf schreiben können.

Ändern Sie den Gruppeneigentum des Verzeichnisses "+ storage" und "+ bootstrap / cache" in "www-data".

sudo chgrp -R www-data storage bootstrap/cache

Gewähren Sie anschließend der Gruppe rekursiv alle Berechtigungen, einschließlich Schreiben und Ausführen.

sudo chmod -R ug+rwx storage bootstrap/cache

Wir haben jetzt alle Demoanwendungsdateien mit den entsprechenden Berechtigungen eingerichtet. Als Nächstes müssen wir die Nginx-Konfiguration ändern, damit sie ordnungsgemäß mit der Laravel-Installation funktioniert. Erstellen wir zunächst eine new server block config file für unsere Anwendung durch Kopieren über die Standarddatei.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/

Öffnen Sie die neu erstellte Konfigurationsdatei.

sudo nano /etc/nginx/sites-enabled/

Es sind nur wenige Änderungen erforderlich:

  • Entfernen der Bezeichnung "+ default_server " aus den Direktiven " listen +",

  • Aktualisieren des Webroot durch Ändern der Direktive + root +,

  • Aktualisieren der Direktive "+ Servername +", um korrekt auf einen Domainnamen für den Server zu verweisen,

  • Aktualisieren der Behandlung von Anforderungs-URIs durch Ändern der Direktive + try_files +.

Die geänderte Nginx-Konfigurationsdatei sieht folgendermaßen aus:

/etc/nginx/sites-enabled/example.com

server {
   listen
   listen

   . . .

   root
   index index.php index.html index.htm index.nginx-debian.html;

   server_name  www.;

   location / {
       try_files $uri $uri/
   }

   . . .
}

Lassen Sie uns diese Änderungen genauer erläutern.

In der Direktive "+ listen " in der Standardkonfigurationsdatei ist die Option " default_server " aktiviert, die angibt, dass der Serverblock eine Anforderung bedienen soll, wenn kein anderer Serverblock geeignet ist. Nur für einen der aktivierten Serverblöcke kann diese Option aktiviert werden. Da der Standardserverblock nicht geändert wurde, wird die Bezeichnung " default_server +" aus dieser zweiten Konfigurationsdatei entfernt.

Die Direktive + root + gibt an, wo Anwendungsdateien gespeichert werden. Die Laravel-Anwendung ist in + / var / www / html / + gespeichert, aber nur das Unterverzeichnis + / public + sollte für das Internet zugänglich sein. Alle anderen Anwendungsdateien sollten überhaupt nicht über den Browser zugänglich sein. Um diesen Best Practices zu entsprechen, setzen wir das Web-Stammverzeichnis auf "+ / var / www / html // public +".

Die Anweisung "+ Servername " gibt die Liste der Domänennamen an, auf die der Serverblock reagiert. Wir haben hier "+" und "+ www. +" Verwendet, aber Sie sollten diese durch den Domainnamen ersetzen, den Sie für Ihre Website verwenden möchten.

Wir haben auch die Behandlung der Anforderungs-URI geändert. Die Standardeinstellungen weisen den Webserver an, eine vorhandene Datei und dann ein vorhandenes Verzeichnis zu suchen oder schließlich einen Fehler 404 Not Found (unter Verwendung der integrierten Einstellung + = 404 +) auszulösen. Damit Laravel ordnungsgemäß funktioniert, müssen alle Anforderungen an Laravel selbst weitergeleitet werden. Dies bedeutet, dass wir Nginxs Standard-404-Fehlerbehandlungsroutine entfernen und auf "+ / index.php? $ Query_string " setzen, wodurch die Anforderungsabfrage an " index.php +", eine Hauptanwendungsdatei von Laravel, weitergeleitet wird.

Wenn Sie die obigen Änderungen vorgenommen haben, können Sie die Datei speichern und schließen. Wir müssen die neue Konfigurationsdatei aktivieren, indem wir eine symbolische Verknüpfung von dieser Datei zum Verzeichnis "+ sites-enabled +" erstellen.

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

Und schließlich laden Sie Nginx neu, um die Änderungen zu berücksichtigen.

sudo systemctl reload nginx

Nachdem Nginx für die Bereitstellung der Demo-Laravel-Anwendung konfiguriert wurde, werden alle Komponenten eingerichtet.

Es ist einfach sicherzustellen, dass Ihre Bereitstellung zu diesem Zeitpunkt funktioniert. Besuchen Sie einfach + http: // + in Ihrem bevorzugten Browser. Sie sehen eine Seite mit der einfachen Aufgaben-App und können versuchen, Aufgaben hinzuzufügen oder zu entfernen. Alle von Ihnen vorgenommenen Änderungen werden in der Datenbank gespeichert und für spätere Besuche der Website gespeichert. Sie können dies überprüfen, indem Sie den Browser schließen und die Website erneut öffnen.

Im nächsten und letzten Schritt konfigurieren wir die TLS-Verschlüsselung, um die Anwendung über eine sichere Verbindung bereitzustellen.

Schritt 6 - Sichern Ihrer Anwendung mit TLS

Um die Produktionskonfiguration abzuschließen, wird empfohlen, die Anwendung über sicheres HTTPS mit TLS bereitzustellen. Dadurch wird sichergestellt, dass die gesamte Kommunikation zwischen der Anwendung und ihren Besuchern verschlüsselt wird. Dies ist besonders wichtig, wenn die Anwendung nach vertraulichen Informationen wie Login oder Passwort fragt.

Let’s Encrypt ist eine kostenlose Zertifizierungsstelle, mit der Sie ganz einfach TLS zu Ihrer Website hinzufügen können. Um HTTPS für die neu bereitgestellte Anwendung zu aktivieren, folgen wir der https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16 -04 [So sichern Sie Nginx mit Let’s Encrypt unter Ubuntu 16.04] Tutorial mit einigen kleinen Änderungen, die dem Setup dieser speziellen Laravel-App Rechnung tragen.

Die einzigen Änderungen sind:

  • Verwenden des Laravel-Anwendungsverzeichnisses ("+ / var / www / html / ") anstelle des Standardwebstamms (" / var / www / html"), wenn ein SSL-Zertifikat angefordert wird.

  • Ändern der Konfigurationsdatei "+ / etc / nginx / sites-available / +" anstelle der Standard-Serverblockdatei.

Im Einzelnen lautet der Befehl zum Abrufen des Zertifikats:

sudo certbot certonly --webroot --webroot-path= -d  -d

Und die endgültige Version der Konfigurationsdatei "+ / etc / nginx / sites-available / example.com +" sieht folgendermaßen aus

/etc/nginx/sites-enabled/example.com

server {
       listen 80;
       listen [::]:80;

       server_name  www.;
       return 301 https://$server_name$request_uri;
}

server {
       listen 443 ssl http2;
       listen [::]:443 ssl http2;

       include snippets/ssl-.conf;
       include snippets/ssl-params.conf;

       root /var/www/html/quickstart/public;

       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

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

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

       location ~ /\.ht {
               deny all;
       }

       location ~ /.well-known {
               allow all;
       }
}

Stellen Sie sicher, dass die Konfiguration keine Syntaxfehler enthält.

sudo nginx -t

Wenn alle Änderungen erfolgreich waren, erhalten Sie ein Ergebnis, das wie folgt aussieht:

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

In diesem Fall können Sie Nginx problemlos neu starten, damit die Änderungen wirksam werden.

sudo systemctl restart nginx

Das TLS / SSL-Zertifikat von Let’s Encrypt ist vollständig installiert und die Anwendung ist über eine sichere Verbindung verfügbar. Um zu überprüfen, ob alles wie erwartet funktioniert, besuchen Sie einfach +: // +. Sie sollten dasselbe Anmeldeformular wie zuvor sehen, aber diesmal ist die Verbindung vollständig gesichert.

Fazit

Sie haben jetzt eine mit Laravel gelieferte Demoanwendung mit dem LEMP-Stack erfolgreich in einer Produktionsumgebung bereitgestellt. Bei realen Anwendungen kann die Liste der Konfigurationsaufgaben weitere Schritte und anwendungsspezifische Aktionen umfassen. Im Zweifelsfall beziehen Sie sich immer auf die Dokumentation der Anwendung, die Sie bereitstellen. Sie finden jedoch auch viele nützliche Informationen unter die offizielle Laravel-Dokumentation.