Tutorials  /  Ubuntu

LAMP Stack auf Ubuntu 20.04 installieren & absichern

Ccentron Redaktion · Oktober 2025 ·12 Min. Lesezeit ·Ubuntu, Tutorial

Der LAMP-Stack – bestehend aus Linux, Apache, MySQL und PHP – ist ein Paket aus Open-Source-Tools zur Entwicklung und Bereitstellung dynamischer Webanwendungen. In dieser Umgebung gilt:

  • Linux dient als Betriebssystem
  • Apache liefert Webinhalte aus
  • MySQL verwaltet Datenbanken
  • PHP verarbeitet dynamische Inhalte

Diese Anleitung erklärt, wie Sie den LAMP-Stack auf Ubuntu 20.04 installieren und konfigurieren, um Webanwendungen auf Ihrem Server zu hosten.

Voraussetzungen

Vor dem Start stellen Sie sicher, dass Folgendes vorhanden ist:

  • Ein Server mit Ubuntu 20.04
  • SSH-Zugriff als Nicht-Root-Benutzer mit sudo-Rechten
  • Ein neuer A-Record für Ihre Domain, der auf die Server-IP zeigt
  • Ein aktualisiertes System
VM

Passende Infrastruktur bei centron

Ubuntu-Server ohne eigene Hardware: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat, stundengenau abgerechnet und in Sekunden bereit. Cloud Server mieten →

Apache installieren

Die Standard-APT-Repositories von Ubuntu 20.04 enthalten die aktuelle Apache-Version. Führen Sie folgende Schritte aus, um den Paketindex zu aktualisieren und Apache zu installieren.

Paketindex aktualisieren

Konsole
$ sudo apt update

Apache installieren

Konsole
$ sudo apt install apache2 -y

Apache starten

Konsole
$ sudo systemctl start apache2

Apache für Autostart aktivieren

Konsole
$ sudo systemctl enable apache2

Status des Apache-Dienstes prüfen

Konsole
$ sudo systemctl status apache2

Beispielausgabe:

YAML
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-06 10:56:28 UTC; 20s ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 2622 (apache2)
      Tasks: 55 (limit: 9415)
     Memory: 6.9M
     CGroup: /system.slice/apache2.service
             ├─2622 /usr/sbin/apache2 -k start
             ├─2623 /usr/sbin/apache2 -k start
             └─2624 /usr/sbin/apache2 -k start

HTTP-Zugriff in der Firewall erlauben

Konsole
$ sudo ufw allow 80/tcp

Öffnen Sie einen Browser und rufen Sie Ihre Domain oder die Server-IP (z. B. http://SERVER-IP) auf, um zu prüfen, ob die Apache-Standardseite angezeigt wird.

MySQL installieren

MySQL fungiert als Datenbank-Backend für den LAMP-Stack. Alternativ können Sie auch MariaDB nutzen. In den Standard-Repositories von Ubuntu 20.04 ist das aktuelle MySQL-Paket verfügbar. Verwenden Sie folgende Befehle, um MySQL über APT zu installieren.

MySQL-Server-Paket installieren

Konsole
$ sudo apt install -y mysql-server

MySQL für Autostart aktivieren

Konsole
$ sudo systemctl enable mysql

MySQL starten

Konsole
$ sudo systemctl start mysql

Status des MySQL-Dienstes prüfen

Konsole
$ sudo systemctl status mysql

Beispielausgabe:

YAML
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-06 10:58:51 UTC; 41s ago
   Main PID: 17189 (mysqld)
     Status: "Server is operational"
     Tasks: 38 (limit: 9415)
     Memory: 364.8M
     CGroup: /system.slice/mysql.service
             └─17189 /usr/sbin/mysqld

Wenn der Status active (running) anzeigt, läuft der MySQL-Server erfolgreich.

MySQL-Installation absichern

Führen Sie das MySQL-Sicherheits-Skript aus, um unsichere Standardeinstellungen zu entfernen und die Authentifizierung zu aktivieren.

Konsole
$ sudo mysql_secure_installation

Beantworten Sie die Abfragen wie folgt:

  • Passwortvalidierung aktivieren: y
  • Passwortrichtlinie wählen: 2 für starke Passwörter
  • Anonyme Benutzer entfernen: y
  • Root-Login per Remote deaktivieren: y
  • Testdatenbank löschen: y
  • Berechtigungstabellen neu laden: y

Nach erfolgreicher Konfiguration erscheint eine Meldung ähnlich „Success. All done!“.

Als Root in die MySQL-Konsole einloggen

Konsole
$ sudo mysql

Starkes Passwort für den Root-Benutzer setzen

Ersetzen Sie Strong@@password123 durch ein eigenes sicheres Passwort.

Code
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Strong@@password123';

Berechtigungsänderungen anwenden

Code
mysql> FLUSH PRIVILEGES;

MySQL-Konsole verlassen

Code
mysql> EXIT;

Erneut mit neuem Passwort einloggen

Konsole
$ mysql -u root -p

Beispieldatenbank anlegen

Code
mysql> CREATE database content_database;

Datenbanken auflisten, um zu bestätigen

Code
mysql> SHOW DATABASES;

Erwartete Ausgabe:

Code
+--------------------+
| Database           |
+--------------------+
| information_schema |
| content_database   |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

Neuen MySQL-Benutzer erstellen

Legen Sie beispielsweise den Benutzer dbadmin mit einem starken Passwort an (ersetzen Sie das Beispielpasswort durch ein eigenes):

Code
mysql> CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'Strong@@password123';

Berechtigungen für die Datenbank vergeben

Code
mysql> GRANT ALL PRIVILEGES ON content_database.* TO 'dbadmin'@'localhost';

Berechtigungsänderungen übernehmen

Code
mysql> FLUSH PRIVILEGES;

MySQL-Shell verlassen

Code
mysql> EXIT;

PHP installieren und PHP-FPM konfigurieren

PHP ist ein zentrales Element des LAMP-Stacks, das dynamische Inhalte verarbeitet und mit der MySQL-Datenbank kommuniziert. PHP-FPM (FastCGI Process Manager) verbessert die Leistung, indem es PHP-Anfragen über einen Pool von Worker-Prozessen steuert.

PHP und PHP-FPM installieren

Konsole
$ sudo apt install -y php php-fpm

Gängige PHP-Erweiterungen installieren

Konsole
$ sudo apt install -y php-mysql php-opcache php-cli libapache2-mod-php

Dieser Befehl installiert:

  • php-mysql: Ermöglicht PHP die Verbindung zu MySQL
  • libapache2-mod-php: Erlaubt Apache, PHP-Skripte auszuführen
  • php-opcache: Zwischenspeicherung vorkompilierter PHP-Skripte für bessere Performance
  • php-cli: Bietet Zugriff auf PHP über die Kommandozeile

PHP-Version prüfen

Konsole
$ php -v

Beispielausgabe:

Code
PHP 7.4.3-4ubuntu2.29 (cli) (built: Mar 25 2025 18:57:03) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3-4ubuntu2.29, Copyright (c), by Zend Technologies

PHP-FPM starten und aktivieren

Starten Sie den PHP-FPM-Dienst entsprechend Ihrer installierten Version (z. B. PHP 7.4):

Konsole
$ sudo systemctl start php7.4-fpm
Konsole
$ sudo systemctl enable php7.4-fpm

Status von PHP-FPM prüfen

Konsole
$ sudo systemctl status php7.4-fpm

Beispielausgabe:

YAML
● php7.4-fpm.service - The PHP 7.4 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2025-04-06 11:11:45 UTC; 10min ago
       Docs: man:php-fpm7.4(8)
    Process: 27868 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, status=0/SUCCESS)
   Main PID: 27851 (php-fpm7.4)
     Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 9415)
     Memory: 7.3M
     CGroup: /system.slice/php7.4-fpm.service
             ├─27851 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
             ├─27866 php-fpm: pool www
             └─27867 php-fpm: pool www

PHP-FPM konfigurieren

PHP-FPM steigert die Leistung von PHP-Anwendungen, indem es Pools von Worker-Prozessen verwaltet. Passen Sie die Standardeinstellungen an den verfügbaren Arbeitsspeicher Ihres Servers an. Befolgen Sie diese Schritte, um PHP-FPM mit Apache zu integrieren und den Pool zu optimieren.

Für PHP-FPM erforderliche Apache-Module aktivieren

Konsole
$ sudo a2enmod proxy_fcgi setenvif

Dieser Befehl aktiviert:

  • proxy_fcgi: Ermöglicht Apache den Proxy-Betrieb mit PHP-FPM
  • setenvif: Setzt notwendige Umgebungsvariablen für die Verbindung zwischen Apache und PHP-FPM

Standardkonfiguration für PHP-FPM aktivieren

Konsole
$ sudo a2enconf php7.4-fpm

Apache neu starten, um Änderungen zu übernehmen

Konsole
$ sudo systemctl restart apache2

PHP-FPM-Pool-Konfiguration bearbeiten

Konsole
$ cd /etc/php/7.4/fpm/pool.d/
Konsole
$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Überprüfen Sie den Standard-Poolnamen:

Code
[www]

Stellen Sie sicher, dass die folgenden Direktiven auf www-data gesetzt sind:

Code
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data

Passen Sie bei Bedarf folgende Parameter an:

  • pm: Auf dynamic setzen, um PHP-Prozesse je nach Last automatisch anzupassen.
  • pm.start_servers: Anzahl der beim Start zu erstellenden PHP-Prozesse (Standard: 2).
  • pm.max_children: Maximale gleichzeitige PHP-Prozesse (Standard: 5).
  • pm.min_spare_servers: Minimale Anzahl inaktiver PHP-Prozesse (Standard: 1).
  • pm.max_spare_servers: Maximale Anzahl inaktiver PHP-Prozesse (Standard: 3).
  • pm.max_requests: Anzahl der Anfragen pro PHP-Prozess, bevor dieser neu gestartet wird.

Speichern und schließen Sie die Datei.

PHP-FPM neu starten, um Änderungen zu übernehmen

Konsole
$ sudo systemctl restart php7.4-fpm

Apache mit PHP-FPM konfigurieren

Apache kommuniziert mit PHP-FPM über das Modul mod_proxy_fcgi, entweder über einen UNIX-Socket oder den Standard-TCP-Port 9000. Gehen Sie wie folgt vor, um einen neuen Apache Virtual Host zu erstellen, der PHP-FPM über den UNIX-Socket anbindet.

Standard-Virtual-Host-Konfiguration von Apache entfernen

Konsole
$ sudo rm -rf /etc/apache2/sites-enabled/000-default.conf && sudo rm -rf /etc/apache2/sites-available/000-default.conf

Neue Apache-Virtual-Host-Konfigurationsdatei erstellen

Erstellen Sie beispielsweise app.example.com.conf:

Konsole
$ sudo nano /etc/apache2/sites-available/app.example.com.conf

Fügen Sie den folgenden Inhalt ein (ersetzen Sie app.example.com durch Ihre tatsächliche Domain):

Code
ServerAdmin webmaster@app.example.com
ServerName app.example.com
DocumentRoot /var/www/html/app.example.com


    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted



   SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/"


ErrorLog ${APACHE_LOG_DIR}/app.example.com_error.log
CustomLog ${APACHE_LOG_DIR}/app.example.com_access.log combined

Diese Konfiguration:

  • Lauscht auf Port 80 für die Domain app.example.com.
  • Setzt das Web-Root auf /var/www/html/app.example.com.
  • Leitet PHP-Dateianfragen über FastCGI an den PHP-FPM-Socket weiter.
  • Definiert eigene Pfade für Error- und Access-Logs.

Neuen Apache Virtual Host aktivieren

Konsole
$ sudo a2ensite app.example.com.conf

Apache-Konfiguration testen

Konsole
$ sudo apache2ctl configtest

Beispielausgabe:

Code
Syntax OK

Webroot-Verzeichnis für den Virtual Host erstellen

Konsole
$ sudo mkdir -p /var/www/html/app.example.com

Beispiel-PHP-Datei erstellen

Konsole
$ sudo nano /var/www/html/app.example.com/info.php

Fügen Sie folgenden PHP-Code ein:

Code
<!--?php phpinfo(); ?-->

Dieses Skript zeigt in Ihrem Browser die PHP-Version und aktivierten Module an.

Apache neu starten, um Änderungen zu übernehmen

Konsole
$ sudo systemctl restart apache2

Öffnen Sie anschließend Ihre Domain (z. B. http://app.example.com/info.php), um die PHP-Informationsseite anzuzeigen.

Server absichern

Auf Ubuntu 20.04 kann standardmäßig die Uncomplicated Firewall (UFW) aktiviert sein. Apache liefert dynamische Webinhalte über HTTP-Port 80, während MySQL (3306) und PHP-FPM (9000) interne TCP-Ports verwenden. Folgen Sie diesen Schritten, um den Datenverkehr auf Port 80 zuzulassen und vertrauenswürdige SSL-Zertifikate für HTTPS auf Port 443 zu konfigurieren.

Firewall konfigurieren

Prüfen Sie, ob die Firewall aktiv ist:

Konsole
$ sudo ufw status

Beispielausgabe:

Code
Status: active
...

Verfügbare UFW-Anwendungsprofile auflisten:

Konsole
$ sudo ufw app list

Beispielausgabe:

Code
Apache
Apache Full
Apache Secure
OpenSSH

Erlauben Sie das Profil „Apache Full“, um HTTP- und HTTPS-Verbindungen zu aktivieren:

Konsole
$ sudo ufw allow "Apache Full"

Firewall-Regeln neu laden:

Konsole
$ sudo ufw reload

UFW-Status erneut prüfen, um sicherzustellen, dass die Apache-Regeln aktiv sind:

Konsole
$ sudo ufw status

Beispielausgabe:

Code
To                         Action      From
--                         ------      ----
1022/tcp                   ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
1022/tcp (v6)              ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

Vertrauenswürdige Let's Encrypt SSL-Zertifikate erstellen

Installieren Sie den Certbot-Client mit Snap:

Konsole
$ sudo snap install certbot --classic

Fordern Sie ein neues SSL-Zertifikat an (ersetzen Sie app.example.com und admin@example.com durch Ihre Domain und E-Mail):

Konsole
$ sudo certbot --apache -d app.example.com -m admin@example.com --agree-tos

Beispielausgabe:

Code
Requesting a certificate for app.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/app.example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/app.example.com/privkey.pem
This certificate expires on 2025-07-05.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for app.example.com to /etc/apache2/sites-available/000-default-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://app.example.com

Automatische SSL-Erneuerung testen:

Konsole
$ sudo certbot renew --dry-run

Apache neu starten, um die SSL-Konfiguration zu übernehmen:

Konsole
$ sudo systemctl restart apache2

LAMP-Stack-Installation testen

Legen Sie eine Beispieltabelle in der bestehenden Datenbank content_database an, um „Hello World! Greetings from centron“ über eine PHP-Anwendung auszugeben.

Als dbadmin in MySQL einloggen

Konsole
$ mysql -u dbadmin -p

Geben Sie das Passwort des Benutzers dbadmin ein, wenn Sie dazu aufgefordert werden.

Zur Beispieldatenbank wechseln

Code
mysql> USE content_database;

Tabelle messages erstellen

Code
mysql> CREATE TABLE IF NOT EXISTS messages (
       content_id INT AUTO_INCREMENT PRIMARY KEY,
       content VARCHAR(255) NOT NULL
      );

Diese Tabelle enthält:

  • content_id: Auto-inkrementierender Primärschlüssel
  • content: Textspalte für bis zu 255 Zeichen

Beispieldatensatz einfügen

Code
mysql> INSERT INTO messages (content) VALUES ('Hello World! Greetings from centron');

Tabellendaten anzeigen

Code
mysql> SELECT * from messages;

Beispielausgabe:

Code
+----+------------------------------------------+
| content_id | content                           |
+------------+-----------------------------------+
|  1         | Hello World! Greetings from centron|
+------------+-----------------------------------+
1 row in set (0.00 sec)

MySQL-Konsole verlassen

Code
mysql> EXIT;

Beispiel-PHP-Anwendung erstellen

Erstellen Sie die Datei setup.php im Webroot-Verzeichnis:

Konsole
$ sudo nano /var/www/html/app.example.com/setup.php

Fügen Sie folgenden Code ein:

Code
<!--?php $hostname = "localhost"; $username = "dbadmin"; $password = "Strong@@password123"; $dbname = "content_database"; // Verbindung herstellen $conn = new mysqli($hostname, $username, $password, $dbname); // Verbindung prüfen if ($conn->connect_error) { die("Connection Failed: " . $conn->connect_error); } $sql = "SELECT content FROM messages"; $result = $conn->query($sql); if ($result && $result->num_rows > 0) { $row = $result->fetch_assoc(); echo "</p> <h2 style='color: blue; text-align: center; margin-bottom: 15px;'>" . htmlspecialchars($row["content"]) . "</h2> <p>"; } else { echo "</p> <h1>No records found.</h1> <p>"; } $conn->close(); ?-->

Dieses Skript verbindet sich mit der Datenbank content_database und ruft Daten aus der Tabelle messages ab. Wenn keine Datensätze gefunden werden, erscheint „No records found“. Bei Verbindungsproblemen wird eine Fehlermeldung ausgegeben.

Verzeichnisrechte setzen

Konsole
$ sudo chown -R www-data:www-data /var/www/html/app.example.com/

Öffnen Sie Ihre Domain (z. B. https://app.example.com/setup.php), um zu prüfen, ob die PHP-Anwendung „Hello World! Greetings from centron“ aus der MySQL-Datenbank anzeigt.

Fazit

Sie haben erfolgreich Apache, MySQL und PHP (LAMP-Stack) auf Ubuntu 20.04 installiert und konfiguriert. Außerdem haben Sie Beispielanwendungen erstellt, um das Zusammenspiel aller Komponenten zu testen und den Server sicher zu betreiben.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Ubuntu
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren