Tutorial: Nginx, PHP, MySQL auf Ubuntu 18.04 installieren

Die Nutzung von nginx als Webserver erfreut sich stark zunehmender Beliebtheit. Die Gründe dafür ist die teilweise bessere Performance als Apache (siehe dazu Apache vs. nginx) und die vergleichsweise einfache Konfigurierbarkeit von Nginx.

In der Tutorial-Serie Eigener Webserver – Nginx setzen wir einen Ubuntu-Server so auf, dass dieser als Webserver fungiert, z.B. für eine WordPress-Website. Dieser Artikel legt die Basis und wir installieren auf Ubuntu 18.04 folgende Komponenten:

  • Nginx 1.14: Webserver
  • MySQL 5.7: Datenbankserver
  • PHP 7.2: Für dynamische Inhalte wie beispielsweise WordPress. Dabei nutzen wir php-fpm.

Voraussetzung: sudo user ist vorhanden

Auf einem Linux-Server empfiehlt es sich aus Sicherheitsgründen nicht als root zu arbeiten. Stattdessen nehme ich in diesem Tutorial an, dass ihr bereits einen Benutzer auf dem Server habt, der mittels sudo Administrationsrechte erhalten kann.

Um einen neuen Benutzer mit sudo-Rechten zu erstellen, könnt ihr folgende Befehle ausführen. Bei allen Befehlen müsst ihr USERNAME durch euren gewünschten Benutzernamen austauschen.

Neuer Benutzer erstellen:

USERNAME sudo-Rechte verleihen:

Login als USERNAME:

Alle weiteren Schritte sollten dann mit diesem Benutzer erfolgen.

Express-Setup: Alle Befehle im Überblick

Hier die Übersicht über alle notwendigen Schritte. In den nachfolgenden Abschnitte erkläre ich dann Schritt-für-Schritt wie die Installation erfolgt.

Bei diesen Befehlen nehme ich an, dass ihr euch im Home-Folder des Benutzers befindet, der Zugriff auf die Website bekommen soll. Für diesen Benutzer wird ein Ordner ~/websites erstellt, der auf die Webdateien für den Webserver verweist. Dieser Benutzer benötigt sudo-Rechte.

Anschließend könnt ihr das Setup testen, indem ihr http://IP_des_Servers/phpinfo.php aufruft.

Schritt 1 – Installation Nginx

Nginx zählt zu den beliebtesten Webservern und der Großteil erfolgreicher Websites verwendet diesen diesen. Die Installation unter Ubuntu ist vergleichsweise einfach:

Danach solltet ihr die Website unter der URL http://EURE_IP erreichen. Dort solltet ihr die Nginx-Default Seite sehen, die in etwa wie folgt aussieht:

Schritt 2 – Firewall einrichten

Um euren Webserver abzusichern, empfiehlt es sich eine entsprechende Firewall einzurichten. Dies ist unter Ubuntu mittels ufw zum Glück sehr einfach. Meistens ist ufw bereits installiert. Falls nicht, lässt es sich so installieren:

Damit ihr weiter per SSH auf den Server zugreifen könnt, solltet ihr auf alle Fälle SSH Verbindungen erlauben:

Anschließend könnt ihr http und https-Verbindungen erlauben:

Danach die Firewall starten:

Den Status der Firewall könnt ihr wie folgt überprüfen:

Hier sieht man, dass die Ports 22 (SSH), 80 (https) und 443 (https) geöffnet sind, sowohl für IPv4 als auch für IPv6.

Schritt 3 – MySQL installieren

Die Installation des MySQL-Datenbankservers ist unter Ubuntu sehr einfach:

Ihr könnt den MySQL-Server wie folgt testen:

Dies sollte euch mit dem MySQL-Server verbinden und per Kommandozeile könnt ihr Befehle an den MySQL-Server senden. Beispielsweise erhaltet ihr so eine Übersicht über alle existenten Datenbanken:

Standardmäßig hat der MySQL-Server nur einen Nutzer: root. Mit diesem Benutzer kann man sich an der Datenbank nur anmelden, wenn man als root-User auf dem Linux-System den Befehl mysql ausführt.

Eine Eingabe eines Passworts ist nicht nötig und wird auch nicht benötigt: Der root-User auf eurem Server muss entsprechend abgesichert sein, damit eurer Server sicher ist.

Es empfiehlt sich, einen weiteren Benutzer anzulegen der sich per Passwort verbinden kann. So könnt ihr beispielsweise per PHP-Script dann auf die Datenbank zugreifen. Die Erstellung eines neuen Benutzers kann so erfolgen:

Ihr müsst newuser und password entsprechend mit eurem Benutzernamen und einem sicheren Passwort ersetzen.

Danach könnt ihr testen, ob ihr euch mit dem MySQL-Server wie folgt verbinden könnt:

 

Schritt 4 – PHP-FPM installieren

Es gibt verschiedene Varianten, wie PHP in Kombination mit Apache installiert werden kann. Lange Zeit wurde mod_php verwendet, womit PHP direkt in Apache integriert wurde. Allerdings hat sich gezeigt, dass gerade bei vielen Websiteaufrufen die Integration per  php-fpm besser ist. PHP läuft dabei als eigener Prozess und Apache übergibt bei dem Aufruf einer .php-Datei das Kommando an die von PHP erstellten Prozesse. In diesem Artikel erfahrt ihr, warum dies eine bessere Performance bringt.

Schritt 5 – Nginx-Konfiguration bearbeiten

Damit nginx PHP-Dateien ausführt, müssten wir dies entsprechend in der Konfigurationsdatei einstellen. Die /etc/nginx/sites-available/default sollte wie folgt aussehen:

Sofern eine andere PHP-Version als 7.2 installiert wurde, musst du den Pfad bei fastcgi_pass entsprechend anpassen.

Schritt 6 – Rechte auf /var/www anpassen

Die Dateien eures Apache-Webordners befinden sich im Ordner /var/www/.  Damit PHP optimal funktioniert, empfiehlt es sich die Rechte für diesen Ordner anzupassen. Dafür wird der Besitzer und die Gruppe des Ordners auf www-data geändert.

Danach setzen wir für den Ordner das sogenannte setgit-Bit. Neu angelegte Dateien und Verzeichnisse haben dann automatisch www-data als Gruppe:

Schritt 7 – Eurem Benutzer Zugriff auf die Website-Dateien gewähren

Möchtet ihr mit eurem User, z.B. per SFTP-Upload, die Dateien in /var/www/ bearbeiten, so empfehle ich dringend bindfs zu nutzen. Von PHP neu erstellte Verzeichnisse und Dateien werden den Besitzer www-data haben. Mir eurem Benutzer könnt ihr diese Dateien nicht bearbeiten oder löschen. Sprich, sobald ein PHP-Script neue Dateien erstellt, z.B. von einem Bildupload, könnt ihr ohne bindfs diese Dateien nicht bearbeiten oder löschen.

Per bindfs erstellen wir daher im Homeverzeichnis des Users einen Websites-Ordner und verlinken diesen auf /var/www/html. Euer User kann die Dateien in diesem Verzeichnis, z.B. per SFTP, bequem verändern. Auch von PHP erstellte Dateien oder Uploads kann man so bearbeiten bzw. per SFTP auch löschen.

Installiert zuerst bindfs:

Erstellt dann in eurem Home-Folder ein Verzeichnis, den ihr für eure Webanwendungen nutzen wollt:

Anschließend müsst ihr der /etc/fstab-Datei noch den entsprechend korrekten bindfs-Befehlen spezifizieren. Ihr müsst dafür an diese Datei folgende Zeile anhängen, wobei USERNAME durch den Benutzernamen eures Users ausgetauscht werden muss:
bindfs#/var/www/html /home/USERNAME/websites/ fuse force-user=USERNAME,force-group=USERNAME,create-for-user=www-data,create-for-group=www-data,create-with-perms=0770,chgrp-ignore,chown-ignore,chmod-ignore 0 0

Das könnt folgenden Befehl mit eurem User ausführen, um die /etc/fstab-Datei entsprechend zu bearbeiten:

Anschließend führt folgenden Befehl aus, um das Verzeichnis /var/www/html in euren Home-Folder zu mounten:

Nun könnt ihr eure Website im website-Ordner bearbeiten, auch mittels SFTP.

Schritt 8 – PHP testen

Zum testen eures Setups, erstellt eine phpinfo.php-Datei mit folgendem Inhalt:

Wenn ihr die obige Rechte richtig gesetzt habt, könnt ihr die Datei wie folgt erstellen:

Anschließend könnt ihr euren Webserver aufrufen unter der Adresse http://IP_vom_Servers/phpinfo.php

Ihr solltet dann folgende Seite sehen:

Schritt 9 – Dateien hochladen

Viele FTP-Programme, beispielsweise FileZilla, erlauben den Dateitransfer per SFTP. Die Installation eines FTP-Servers ist damit unnötig und wäre ein weiteres Sicherheitsrisiko.

In FileZilla, nutzt den Server-Manager um einen neuen Server anzulegen. Wählt als Protokoll entsprechend SFTP aus und tragt die IP und den zuvor genutzten Username (mit sudo-Rechten)  eures Server ein. Anschließend könnt ihr Dateien in den websites-Ordner im Home-Verzeichnis hochladen und die Dateien sind auf dem Webserver verfügbar.

Abschließende Sicherheitshinweise

Der Betrieb eines eigenes Servers bedeutet eine hohe Verantwortung. Der Server muss entsprechend vor Angreifern geschützt werden, ebenso muss man verhindern, dass der Server gehackt und für Angriffe missbraucht wird.

Dieses Tutorial ist nur eine grundlegende Anleitung wie die Dienste mit ihrer Standardkonfiguration installiert werden können. Für den sicheren Betrieb, empfiehlt es sich für jede Serveranwendung (Webserver, Datenbankserver, PHP etc.) die Konfiguration auf Schwachstellen zu überprüfen.

Ebenso sind Standardkonfigurationen meistens nicht auf Performance optimiert. Bei einer hohen Besucherlast kann es so passieren, dass der Server entsprechend langsam antwortet und nicht sein volles Potential ausnutzt. Durch eine Anpassung der einzelnen Komponenten kann zumeist eine deutlich bessere Performance erreicht werden.

Fehlt das notwendige technische Know-How, würde ich von einem eigenen Webserver abraten und stattdessen zu fertigen Webhosting-Tarifen raten. Eine Übersicht über entsprechende Tarife findet ihr hier: Webhosting Vergleich