Tutorial: Apache, MySQL, PHP (LAMP) auf Ubuntu 18.04 installieren
LAMP ist eine bekannte Abkürzung und steht für Linux, Apache, MySQL, und PHP. Dies ist ein beliebtes Setup für Server und vServer zum Betrieb eines Webservers. Voraussetzung für dieses Tutorial ist Ubuntu 18.04 LTS (Bionic Beaver). Einen Überblick über gute und preiswerte vServer erhaltet ihr im Bereich vServer.
In der Tutorial-Serie Eigener Webserver – Apache 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:
- Apache 2.4: Webserver
- MySQL 5.7: Datenbankserver
- PHP 7.2: Für dynamische Inhalte wie beispielsweise WordPress. Dabei nutzen wir php-fpm.
In den darauffolgenden Artikel wird phpMyAdmin installieren, es werden Mehrere Domains angelegt und wir nutzen Let's Encrypt für kostenlosen SSL-Schutz.
Inhaltsverzeichnis
- 1 Voraussetzung: sudo user ist vorhanden
- 2 Express-Setup: Alle Befehle im Überblick
- 3 Schritt 1 – Installation Apache
- 4 Schritt 2 – Firewall einrichten
- 5 Schritt 3 – MySQL installieren
- 6 Schritt 4 – PHP-FPM installieren
- 7 Schritt 5 – Rechte auf /var/www anpassen
- 8 Schritt 6 – Eurem Benutzer Zugriff auf die Website-Dateien gewähren
- 9 Schritt 7 – PHP testen
- 10 Schritt 8 – Dateien hochladen
- 11 Nächste Schritte
- 12 Abschließende Sicherheitshinweise
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:
1 |
adduser USERNAME |
USERNAME sudo-Rechte verleihen:
1 |
usermod -aG sudo USERNAME |
Login als USERNAME:
1 |
su - 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#Im Home-Verzeichnis des sudo-Users ausführen #Notwendige System-Packages installieren sudo apt update sudo apt install -y ufw apache2 mysql-server php-fpm bindfs #Firewall aktivieren und SSH, HTTP und HTTPs Traffic erlauben sudo ufw allow ssh sudo ufw allow http sudo ufw allow https sudo ufw --force enable #PHP-FPM konfigurieren sudo a2enmod proxy_fcgi sudo a2enconf php7.2-fpm sudo systemctl restart apache2 #Rechte auf /var/www/ anpassen sudo chown -R www-data:www-data /var/www/ sudo find /var/www/ -type d -exec chmod g+s {} + # Erstelle Ordner /home/USERNAME/websites und verlinke /var/www/ mit diesem Verzeichnis mkdir ~/websites printf "\n\nbindfs#/var/www/ /home/$USER/websites/ fuse force-user=$USER,force-group=$USER,create-for-user=www-data,create-for-group=www-data,create-with-perms=0770,chgrp-ignore,chown-ignore,chmod-ignore 0 0" | sudo tee -a /etc/fstab sudo mount /home/$USER/websites # Erstelle phpinfo.php Datei zum testen echo "<?php phpinfo();" > ~/websites/html/phpinfo.php #Optional: Erstelle neuen mysql user 'newuser' mit Passwort 'password' #Bitte newuser und password durch entsprechend selbstgewählte Werte ersetzen sudo mysql -e "CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';" #newuser bekommt volle Zugriffsrechte (root-Zugriff) sudo mysql -e "GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' WITH GRANT OPTION;" sudo mysql -e "FLUSH PRIVILEGES;" |
Anschließend könnt ihr das Setup testen, indem ihr http://IP_des_Servers/phpinfo.php aufruft.
Schritt 1 – Installation Apache
Der Apache zählt zu den beliebtesten Webservern und viele Webhosting-Anbieter setzen auf diesen. Die Installation unter Ubuntu ist vergleichsweise einfach:
1 2 |
sudo apt update sudo apt install apache2 |
Danach solltet ihr die Website unter der URL http://123.123.123.123 erreichen, wobei ihr 123.123.123.123 entsprechend mit der IP des Servers austauschen müsst. Dort solltet ihr die Apache-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:
1 |
sudo apt install ufw |
Damit ihr weiter per SSH auf den Server zugreifen könnt, solltet ihr auf alle Fälle SSH Verbindungen erlauben:
1 |
sudo ufw allow ssh |
Anschließend könnt ihr http und https-Verbindungen erlauben:
1 2 |
sudo ufw allow http sudo ufw allow https |
Danach die Firewall starten:
1 |
sudo ufw enable |
Den Status der Firewall könnt ihr wie folgt überprüfen:
1 2 3 4 5 6 7 8 9 10 11 |
$ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) |
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:
1 |
sudo apt install mysql-server |
Ihr könnt den MySQL-Server wie folgt testen:
1 |
sudo mysql |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> SHOW databases; Output: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> exit; Bye |
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:
1 2 3 |
sudo mysql -e "CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';" sudo mysql -e "GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' WITH GRANT OPTION;" sudo mysql -e "FLUSH PRIVILEGES;" |
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:
1 |
mysql -u newuser -p |
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.
1 |
sudo apt install php-fpm |
Anschließend müssen wir das Apache-Module proxy_fcgi aktivieren:
1 |
sudo a2enmod proxy_fcgi |
Sowie die PHP-FPM-Konfiguration aktivieren:
1 |
sudo a2enconf php7.2-fpm |
Sollte eine andere PHP-Version installiert worden sein, müsst ihr diese entsprechend anpassen. Welche Version vorhanden ist, könnt ihr z.B. im Verzeichnis /etc/apache2/conf-available einsehen. Dort sollte eine Datei php7.2-fpm.conf vorhanden sein.
Anschließend muss Apache neu gestartet werden:
1 |
sudo systemctl restart apache2 |
Schritt 5 – 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.
1 |
sudo chown -R www-data:www-data /var/www/ |
Danach setzen wir für den Ordner das sogenannte setgit-Bit. Neu angelegte Dateien und Verzeichnisse haben dann automatisch www-data als Gruppe:
1 |
sudo find /var/www -type d -exec chmod g+s {} + |
Schritt 6 – 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:
1 |
sudo apt install bindfs |
Erstellt dann in eurem Home-Folder ein Verzeichnis, den ihr für eure Webanwendungen nutzen wollt:
1 |
mkdir ~/websites |
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:
1 |
printf "\n\nbindfs#/var/www/ /home/$USER/websites/ fuse force-user=$USER,force-group=$USER,create-for-user=www-data,create-for-group=www-data,create-with-perms=0770,chgrp-ignore,chown-ignore,chmod-ignore 0 0" | sudo tee -a /etc/fstab |
Anschließend führt folgenden Befehl aus, um das Verzeichnis /var/www/html in euren Home-Folder zu mounten:
1 |
sudo mount /home/$USER/websites |
Nun könnt ihr eure Website im website-Ordner bearbeiten, auch mittels SFTP.
Schritt 7 – PHP testen
Zum testen eures Setups, erstellt eine phpinfo.php-Datei mit folgendem Inhalt:
1 2 |
<?php phpinfo(); |
Wenn ihr die obige Rechte richtig gesetzt habt, könnt ihr die Datei wie folgt erstellen:
1 |
echo "<?php phpinfo();" > ~/websites/html/phpinfo.php |
Anschließend könnt ihr euren Webserver aufrufen unter der Adresse http://IP_vom_Servers/phpinfo.php
Ihr solltet dann folgende Seite sehen:
Schritt 8 – 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.
Nächste Schritte
Damit euer Webserver gut einsetzbar ist, empfehle ich noch folgende Tutorials sich anzuschauen:
- phpMyAdmin installieren: phpMyAdmin ist eine beliebte graphische Oberfläche für die Verwaltung von MySQL-Datenbanken.
- Mehrere Domains angelegen: Per Virtual Hosts können in Apache mehrere Domains für euren Webserver konfiguriert werden.
- SSL-Schutz per Let's Encrypt: Per Let’s Encrypt lassen sich kostenlose SSL-Zertifikate für eures Domain beziehen.
- E-Mails versenden: Damit PHP-Anwendungen E-Mails versenden können, muss am System die Zugangsdaten für einen SMTP-Server hinterlegt werden.
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