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:

php
<?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 "<h2 style='color: blue; text-align: center; margin-bottom: 15px;'>"
        . htmlspecialchars($row["content"]) . "</h2>";
} else {
    echo "<h2>No records found.</h2>";
}

$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?

Unser Team hilft Ihnen bei Ihrem konkreten Setup weiter – von Menschen, die die Plattform selbst betreiben.

War dieses Tutorial hilfreich?

Ihre Antwort wird anonym gespeichert und hilft uns, die Tutorials zu verbessern.

Kommentare

Noch keine Kommentare – stellen Sie die erste Frage zu diesem Tutorial.

Zum Kommentieren anmelden

Kommentare stehen centron-Kunden offen. Melden Sie sich in Ihrem Konto an, um eine Frage zu diesem Tutorial zu stellen.

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