Installation des LEMP-Stacks auf Ubuntu 22.04 Server/Desktop

|

In dieser Anleitung wird erklärt, wie du einen LEMP-Stack (bestehend aus Nginx, MariaDB und PHP8.1) auf Ubuntu 22.04 installierst. Ein Software-Stack ist eine Zusammenstellung von gebündelten Softwaretools. LEMP ist die Abkürzung für Linux, Nginx (Engine-X), MariaDB/MySQL und PHP, die alle Open-Source und kostenfrei sind.

In dieser Anleitung wird erklärt, wie du einen LEMP-Stack (bestehend aus Nginx, MariaDB und PHP8.1) auf Ubuntu 22.04 installierst. Ein Software-Stack ist eine Zusammenstellung von gebündelten Softwaretools. LEMP ist die Abkürzung für Linux, Nginx (Engine-X), MariaDB/MySQL und PHP, die alle Open-Source und kostenfrei sind.

Der LEMP-Stack ist eine weit verbreitete Software-Kombination, die dynamische Websites und Webanwendungen betreibt.

Hier die einzelnen Komponenten:

  • Linux bildet das Betriebssystem.
  • Nginx fungiert als Webserver.
  • MariaDB/MySQL agiert als Datenbankserver.
  • PHP ist die serverseitige Skriptsprache, die für die Erzeugung dynamischer Webseiten zuständig ist.

Voraussetzungen

Um dieser Anleitung folgen zu können, benötigst du ein System mit Ubuntu 22.04, welches entweder lokal oder auf einem entfernten Server läuft.

Falls du nach einem virtuellen privaten Server (VPS) suchst, empfehle ich dir die Hetzner Cloud mit folgenden Features:

  • 20 € Cloud Guthaben für Neukunden
  • Ab 4,51€/Monat (mit z.B. 4GB RAM, 2 CPU, 20 GB SSD, inkl. IPv4 in Deutschland oder Finnland)
  • Hochleistungsfähiger VPS
  • 5 Rechenzentren weltweit auf 2 Kontinenten, unter anderem in den Oregon (USA), Virginia (USA) Nürnberg (DE), Falkenstein (DE) und Helsinki Finnland). Um deinen Linux VPS Server bei Hetzner Cloud zu erstellen, folge der dieser Anleitung:

    🖥️ Virtual Private Server (VPS) bei Hetzner Cloud einrichten ⚙️

oder wenn Du mehr Auswahl bei den Rechenzentren benötigst, dann wähle UpCloud mit folgenden Features:

  • 3 Tage kostenlose Testphase.
  • Ab 7€/Monat (mit 1GB RAM, 1 CPU, 25 GB SSD, 1 TB Transfer)
  • Hochleistungsfähiger VPS
  • 12 Rechenzentren weltweit auf 4 Kontinenten, unter anderem in den USA, Großbritannien, Deutschland, den Niederlanden, Finnland, Spanien, Polen, Singapure und Australien. Um deinen Linux VPS Server bei UpCloud zu erstellen, folge der unten verlinkten Anleitung:

***So erstellst du einen Linux VPS Server bei UpCloud. Sobald dein VPS mit Ubuntu 22.04 betriebsbereit ist, folge den untenstehenden Instruktionen.

Falls du den LEMP-Stack mit einem Domainnamen einrichten möchtest, rate ich, Domainnamen bei checkdomain aus Lübeck zu kaufen. Dort sind die Preise günstig, und der Whois-Privatsphärenschutz ist lebenslang kostenlos inbegriffen.

Schritt 1: Softwarepakete aktualisieren

Bevor wir mit der Installation des LEMP-Stacks beginnen, ist es ratsam, das Repository und die Softwarepakete auf deinem Ubuntu 22.04 System zu aktualisieren. Führe dazu die folgenden Befehle aus:

sudo apt update
sudo apt upgrade -y

Schritt 2: Installation des Nginx Webservers

Nginx ist ein leistungsstarker Webserver, der heutzutage sehr beliebt ist. Er kann auch als Reverse Proxy und Caching-Server verwendet werden. Gib den folgenden Befehl ein, um den Nginx-Webserver zu installieren:

sudo apt install nginx

Nach der Installation kannst du Nginx so einstellen, dass es automatisch beim Systemstart hochfährt. Führe dazu den nachstehenden Befehl aus:

sudo systemctl enable nginx

Starte Nginx anschließend mit diesem Befehl:

sudo systemctl start nginx

Überprüfe nun den Status von Nginx:

sudo systemctl status nginx

Ausgabe

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-09-30 14:11:43 UTC; 3s ago
       Docs: man:nginx(8)
    Process: 8533 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 8545 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 8549 (nginx)
      Tasks: 3 (limit: 9451)
     Memory: 3.9M
     CGroup: /system.slice/nginx.service
             ├─8549 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─8550 nginx: worker process
             └─8551 nginx: worker process

„Enabled“ signalisiert, dass die Auto-Start-Funktion beim Booten aktiviert ist und Nginx läuft. Du kannst auch sehen, wie viel RAM Nginx verbraucht, dies wird in der Ausgabe angezeigt. Wenn der obige Befehl nicht sofort nach der Ausführung beendet wird, musst du „q“ drücken, um ihn zu beenden.

Überprüfe die Nginx-Version mit:

nginx -v

Ausgabe:

nginx version: nginx/1.18.0 (Ubuntu)

Gib nun die öffentliche IP-Adresse deines Ubuntu 22.04 Servers in die Adressleiste deines Browsers ein. Du solltest die „Welcome to Nginx“-Webseite sehen, was bedeutet, dass der Nginx Webserver korrekt läuft. Falls du den LEMP-Stack auf deinem lokalen Ubuntu 22.04 Computer installierst, gib 127.0.0.1 oder localhost in die Adressleiste des Browsers ein.

Falls die Verbindung abgelehnt wird oder nicht zustande kommt, könnte eine Firewall eingehende Anfragen an den TCP-Port 80 blockieren. Solltest du die iptables-Firewall verwenden, musst du den folgenden Befehl ausführen, um den TCP-Port 80 zu öffnen:

sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Wenn du die UFW-Firewall nutzt, führe diesen Befehl aus, um TCP-Port 80 freizugeben:

sudo ufw allow http

Abschließend müssen wir den Benutzer „www-data“ (der Nginx-Benutzer) als Besitzer des Webverzeichnisses festlegen. Standardmäßig gehört dieses dem Root-Benutzer.

sudo chown www-data:www-data /usr/share/nginx/html -R

Schritt 3: Installation des MariaDB Datenbankservers

MariaDB dient als direkter Ersatz für MySQL und wurde von ehemaligen Mitgliedern des MySQL-Teams entwickelt, die befürchteten, dass Oracle MySQL in ein Closed-Source-Produkt umwandeln könnte. Führe den folgenden Befehl aus, um MariaDB auf Ubuntu 22.04 zu installieren:

sudo apt install mariadb-server mariadb-client

Nach der Installation sollte der MariaDB-Server automatisch starten. Überprüfe seinen Status mit systemctl:

systemctl status mariadb

Ausgabe:

● mariadb.service - MariaDB 10.6.7 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-09-30 14:19:16 UTC; 18s ago
       Docs: man:mysqld(8)
             https://mariadb.com/kb/en/library/systemd/
   Main PID: 9161 (mysqld)
     Status: "Taking your SQL requests now..."
      Tasks: 31 (limit: 9451)
     Memory: 64.7M
     CGroup: /system.slice/mariadb.service
             └─9161 /usr/sbin/mysqld

📌 Hinweis: Falls der obige Befehl nicht sofort nach der Ausführung beendet wird, musst du „q“ drücken, um ihn zu beenden.

Falls der Server nicht läuft, starte ihn mit dem folgenden Befehl:

sudo systemctl start mariadb

Um MariaDB so einzustellen, dass es automatisch beim Hochfahren des Systems startet, führe den Befehl aus:

sudo systemctl enable mariadb

Führe nun das nach der Installation empfohlene Sicherheitsskript aus:

sudo mysql_secure_installation

Wenn du aufgefordert wirst, das MariaDB-Root-Passwort einzugeben, drücke die Enter-Taste, da noch kein Root-Passwort gesetzt ist. Du solltest nicht zur unix_socket-Authentifizierung wechseln, da MariaDB bereits unix_socket für die Authentifizierung verwendet. Ändere auch nicht das Root-Passwort, da bei Verwendung der unix_socket-Authentifizierung kein Root-Passwort gesetzt werden muss.

Als Nächstes kannst du bei allen verbleibenden Fragen Enter drücken. Dies wird den anonymen Benutzer entfernen, den Remote-Root-Login deaktivieren und die Testdatenbank löschen. Dieser Schritt ist grundlegend für die Sicherheit der MariaDB-Datenbank erforderlich. (Beachte, dass das „Y“ großgeschrieben ist, was bedeutet, dass es die Standardantwort ist.)

Standardmäßig verwendet das MariaDB-Paket auf Ubuntu unix_socket zur Authentifizierung von Benutzeranmeldungen. Das bedeutet im Grunde, dass du Benutzernamen und Passwort des Betriebssystems verwenden kannst, um dich bei der MariaDB-Konsole anzumelden. Deshalb kannst du den folgenden Befehl ausführen, um dich ohne MariaDB-Root-Passwort anzumelden:

sudo mariadb -u root

Um die Konsole zu verlassen, führe aus:

exit;

Überprüfe die Versionsinformationen des MariaDB-Servers mit:

mariadb --version

Wie du sehen kannst, wurde MariaDB 10.6.7 installiert:

mariadb Ver 15.1 Distrib 10.6.7-MariaDB, für debian-linux-gnu (x86_64) mit EditLine-Wrapper

Schritt 4: Installation von PHP8.1

PHP8.1 ist im Repository von Ubuntu 22.04 enthalten und bietet eine geringfügige Leistungsverbesserung gegenüber PHP8.0. Gib den folgenden Befehl ein, um PHP8.1 sowie einige gängige Erweiterungen zu installieren.

sudo apt install php8.1 php8.1-fpm php8.1-mysql php-common php8.1-cli php8.1-common php8.1-opcache php8.1-readline php8.1-mbstring php8.1-xml php8.1-gd php8.1-curl

Diese PHP-Erweiterungen werden häufig für Content-Management-Systeme (CMS) wie WordPress benötigt. Fehlt beispielsweise die Erweiterung php8.1-xml, könnten einige Seiten deiner WordPress-Site leer sein, und du könntest im Nginx-Fehlerprotokoll eine Fehlermeldung finden, die wie folgt aussieht:

PHP message: PHP Fatal error: Uncaught Error: Call to undefined function xml_parser_create()

Die Installation dieser PHP-Erweiterungen sorgt dafür, dass dein CMS reibungslos läuft. Starte nun php8.1-fpm:

sudo systemctl start php8.1-fpm

Aktiviere den Autostart beim Booten:

sudo systemctl enable php8.1-fpm

Überprüfe den Status:

systemctl status php8.1-fpm

Beispielausgabe:

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor pr>
     Active: active (running) since Fri 2023-09-30 14:40:26 UTC; 12s ago
       Docs: man:php-fpm8.1(8)
    Process: 21018 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /ru>
   Main PID: 21012 (php-fpm8.1)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req>
      Tasks: 3 (limit: 9451)
     Memory: 9.4M
     CGroup: /system.slice/php8.1-fpm.service
             ├─21012 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)
             ├─21017 php-fpm: pool www
             └─21018 php-fpm: pool www

If the above command doesn’t immediately quit after running. You need to press “q” to make it quit.

Schritt 5: Erstellen eines Nginx Server Blocks

Ein Nginx Server Block ist vergleichbar mit einem virtuellen Host in Apache. Wir werden den Standard-Server-Block nicht verwenden, da dieser unzureichend ist, um PHP-Code auszuführen, und Änderungen daran können für Unordnung sorgen. Entferne daher den Standard-Symlink im Verzeichnis sites-enabled mit folgendem Befehl. (Er ist immer noch als /etc/nginx/sites-available/default verfügbar.)

sudo rm /etc/nginx/sites-enabled/default

Nutze dann einen textbasierten Befehlszeilen-Editor wie Nano, um eine neue Server-Block-Datei im Verzeichnis <strong>/etc/nginx/conf.d/</strong> zu erstellen.

sudo nano /etc/nginx/conf.d/default.conf

Füge den folgenden Text in die Datei ein. Der folgende Code-Snippet bewirkt, dass Nginx auf IPv4-Port 80 und IPv6-Port 80 hört, mit einem Catch-All-Servernamen.

server {
  listen 80;
  listen [::]:80;
  server_name _;
  root /usr/share/nginx/html/;
  index index.php index.html index.htm index.nginx-debian.html;

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

  location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
  }

 # A long browser cache lifetime can speed up repeat visits to your page
  location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico|xml)$ {
       access_log        off;
       log_not_found     off;
       expires           360d;
  }

  # disable access to hidden files
  location ~ /\.ht {
      access_log off;
      log_not_found off;
      deny all;
  }
}

Speichere und schließe die Datei. (Um eine Datei im Nano-Texteditor zu speichern, drücke Ctrl+O und bestätige mit Enter. Zum Beenden drücke Ctrl+X.)

Überprüfe anschließend die Nginx-Konfigurationen mit:

sudo nginx -t

Wenn der Test erfolgreich ist, lade Nginx neu:

sudo systemctl reload nginx

Schritt 6: PHP testen

Um PHP-FPM mit dem Nginx-Webserver zu testen, müssen wir eine info.php Datei im Webroot-Verzeichnis erstellen.

sudo nano /usr/share/nginx/html/info.php

Füge den folgenden PHP-Code in die Datei ein:

<?php phpinfo(); ?>

Speichere und schließe die Datei. Gib nun in der Adressleiste des Browsers <strong>server-ip-address/info.php</strong> ein. Ersetze dabei <strong>server-ip-address</strong> durch die tatsächliche IP-Adresse deines Servers. Wenn du dieser Anleitung auf deinem lokalen Computer folgst, gib <strong>127.0.0.1/info.php</strong> oder <strong>localhost/info.php</strong> ein.

Du solltest die PHP-Informationen deines Servers sehen. Das bedeutet, dass PHP-Skripte korrekt mit dem Nginx-Webserver ausgeführt werden können.

Schritt 7: PHP-Leistung verbessern

Die Standard-PHP-Konfigurationen (/etc/php/8.1/fpm/php.ini) sind für Server mit sehr geringen Ressourcen (wie einem Server mit 256MB RAM) ausgelegt. Um die Leistung von Webanwendungen zu verbessern, sollten einige dieser Einstellungen angepasst werden.

Zwar könnte man die PHP-Konfigurationsdatei (php.ini) direkt bearbeiten, es ist jedoch ratsam, eine benutzerdefinierte PHP-Konfigurationsdatei zu erstellen. So bleiben deine individuellen Einstellungen auch nach einem Upgrade auf eine neuere PHP8.1-Version erhalten.

Öffne oder erstelle die benutzerdefinierte Konfigurationsdatei mit einem Texteditor:

sudo nano /etc/php/8.1/fpm/conf.d/60-custom.ini

Füge in diese Datei die folgenden Zeilen ein:

; Maximale Menge an Speicher, die ein Skript verwenden darf. Standard ist 128M
memory_limit = 512M

; Maximale Größe für hochgeladene Dateien. Standard ist 2M.
upload_max_filesize = 20M

; Maximale Größe von POST-Daten, die PHP akzeptiert. Standard ist 2M.
post_max_size = 20M

; Die Größe des OPcache Shared Memory Speichers. Standard ist 128
opcache.memory_consumption=256

; Menge an Speicher für interned strings in Mbytes. Standard ist 8.
opcache.interned_strings_buffer=32

Speichere und schließe die Datei. Lade dann PHP8.1-FPM neu, damit die Änderungen wirksam werden.

sudo systemctl reload php8.1-fpm

OPcache verbessert die Leistung von PHP-Anwendungen, indem es vorkompilierten Bytecode zwischenspeichert. Du kannst die OPcache-Statistiken über die Seite info.php einsehen.

Glückwunsch! Du hast erfolgreich Nginx, MariaDB und PHP8.1 auf Ubuntu 22.04 installiert. Aus Sicherheitsgründen solltest du nun die Datei info.php löschen, um zu verhindern, dass Hacker darauf zugreifen können.

sudo rm /usr/share/nginx/html/info.php

✅ Mit diesen Schritten ist deine Basisinstallation für einen Webserver abgeschlossen.

Fehlerbehebungstipp

Wenn Fehler auftreten, kannst du das Nginx-Fehlerprotokoll (/var/log/nginx/error.log) überprüfen, um die Ursache zu finden.

Automatischer Neustart

Automatischer Neustart von Nginx

Wenn der Nginx-Prozess aus irgendeinem Grund beendet wird, solltest du folgenden Befehl ausführen, um ihn neu zu starten:

sudo systemctl restart nginx

Statt diesen Befehl manuell einzugeben, können wir Nginx so konfigurieren, dass es automatisch neu startet. Dazu bearbeiten wir die systemd-Service-Einheit <strong>nginx.service</strong>. Wir erstellen dafür ein separates Verzeichnis:

sudo mkdir -p /etc/systemd/system/nginx.service.d/

Dann erstellen wir eine Datei in diesem Verzeichnis:

sudo nano /etc/systemd/system/nginx.service.d/restart.conf

Füge die folgenden Zeilen in die Datei ein. Damit wird Nginx automatisch 5 Sekunden nachdem ein Fehler erkannt wurde, neu gestartet. Der Standardwert für RestartSec ist 100ms, was zu kurz ist. Nginx könnte die Meldung „start request repeated too quickly“ anzeigen, wenn RestartSec nicht ausreichend groß ist.

[Service]
Restart=always
RestartSec=5s

Speichere und schließe die Datei und lade systemd neu, damit die Änderungen wirksam werden:

sudo systemctl daemon-reload

Um zu überprüfen, ob es funktioniert, beende Nginx mit:

sudo pkill nginx

Und überprüfe dann den Nginx-Status. Nginx sollte automatisch neu gestartet worden sein:

systemctl status nginx

Automatischer Start von MariaDB

Standardmäßig ist MariaDB so konfiguriert, dass es automatisch neu startet (/lib/systemd/system/mariadb.service). Wenn jedoch der Server keinen Speicher mehr hat und MariaDB beendet wird, startet es nicht automatisch neu. Wir können es so konfigurieren, dass es in jedem Fall neu startet.

Erstelle ein Verzeichnis für benutzerdefinierte Konfigurationen:

sudo mkdir -p /etc/systemd/system/mariadb.service.d/

Erstelle eine benutzerdefinierte Konfigurationsdatei:

sudo nano /etc/systemd/system/mariadb.service.d/restart.conf

Füge die folgenden Zeilen in die Datei ein:

[Service]
Restart=always
RestartSec=5s

Speichere und schließe die Datei. Dann lade systemd neu, damit die Änderungen wirksam werden:

sudo systemctl daemon-reload

Nächste Schritte

Wenn du diesen Beitrag hilfreich fandest, kannst du unseren kostenlosen Newsletter abonnieren, um mehr Tipps und Tricks zu erhalten. Du kannst auch WordPress auf dem LEMP-Stack installieren, um deine eigene Website oder deinen Blog zu erstellen.

  • WordPress auf Ubuntu 22.04 mit Nginx, MariaDB, PHP8.1 (LEMP) installieren

Verwandte Nginx-Tutorials:

  • Wie man häufige Fehler des Nginx-Webservers behebt
  • Backup ist wichtig für den Fall von Hackerangriffen, Datenzentrumskatastrophen usw. Du solltest eine Backup-Strategie für deinen Server haben.

Verwandte Artikel:

  • MariaDB-Datenbanken von der Kommandozeile aus sichern und wiederherstellen
  • Verwendung von Duplicati zur Sicherung von Dateien auf Debian, Ubuntu, Linux Mint
  • Leistungsoptimierung und -überwachung für Linux-Server

Leistungssteigernde Maßnahmen:

  • Steigere die Netzwerkleistung von Ubuntu einfach durch Aktivierung von TCP BBR
  • Was ist HTTP/2 und wie aktiviert man es in Nginx?
  • Leistungsüberwachung für Linux-Server mit Netdata (2022)

Happy coding 🙂

Robert Einsle
schnelle Problemlösung durch langjährige Erfahrung

1 Gedanke zu „Installation des LEMP-Stacks auf Ubuntu 22.04 Server/Desktop“

Schreibe einen Kommentar