LAMP-Stack auf Ubuntu 20.04 installieren und konfigurieren
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
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
$ sudo apt update
Apache installieren
$ sudo apt install apache2 -y
Apache starten
$ sudo systemctl start apache2
Apache für Autostart aktivieren
$ sudo systemctl enable apache2
Status des Apache-Dienstes prüfen
$ sudo systemctl status apache2
Beispielausgabe:
● 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
$ 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
$ sudo apt install -y mysql-server
MySQL für Autostart aktivieren
$ sudo systemctl enable mysql
MySQL starten
$ sudo systemctl start mysql
Status des MySQL-Dienstes prüfen
$ sudo systemctl status mysql
Beispielausgabe:
● 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.
$ 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
$ sudo mysql
Starkes Passwort für den Root-Benutzer setzen
Ersetzen Sie Strong@@password123 durch ein eigenes sicheres Passwort.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Strong@@password123';
Berechtigungsänderungen anwenden
mysql> FLUSH PRIVILEGES;
MySQL-Konsole verlassen
mysql> EXIT;
Erneut mit neuem Passwort einloggen
$ mysql -u root -p
Beispieldatenbank anlegen
mysql> CREATE database content_database;
Datenbanken auflisten, um zu bestätigen
mysql> SHOW DATABASES;
Erwartete Ausgabe:
+--------------------+
| 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):
mysql> CREATE USER 'dbadmin'@'localhost' IDENTIFIED BY 'Strong@@password123';
Berechtigungen für die Datenbank vergeben
mysql> GRANT ALL PRIVILEGES ON content_database.* TO 'dbadmin'@'localhost';
Berechtigungsänderungen übernehmen
mysql> FLUSH PRIVILEGES;
MySQL-Shell verlassen
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
$ sudo apt install -y php php-fpm
Gängige PHP-Erweiterungen installieren
$ 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
$ php -v
Beispielausgabe:
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):
$ sudo systemctl start php7.4-fpm
$ sudo systemctl enable php7.4-fpm
Status von PHP-FPM prüfen
$ sudo systemctl status php7.4-fpm
Beispielausgabe:
● 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
$ 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
$ sudo a2enconf php7.4-fpm
Apache neu starten, um Änderungen zu übernehmen
$ sudo systemctl restart apache2
PHP-FPM-Pool-Konfiguration bearbeiten
$ cd /etc/php/7.4/fpm/pool.d/
$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf
Überprüfen Sie den Standard-Poolnamen:
[www]
Stellen Sie sicher, dass die folgenden Direktiven auf www-data gesetzt sind:
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
$ 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
$ 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:
$ 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):
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
$ sudo a2ensite app.example.com.conf
Apache-Konfiguration testen
$ sudo apache2ctl configtest
Beispielausgabe:
Syntax OK
Webroot-Verzeichnis für den Virtual Host erstellen
$ sudo mkdir -p /var/www/html/app.example.com
Beispiel-PHP-Datei erstellen
$ sudo nano /var/www/html/app.example.com/info.php
Fügen Sie folgenden PHP-Code ein:
Dieses Skript zeigt in Ihrem Browser die PHP-Version und aktivierten Module an.
Apache neu starten, um Änderungen zu übernehmen
$ 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:
$ sudo ufw status
Beispielausgabe:
Status: active
...
Verfügbare UFW-Anwendungsprofile auflisten:
$ sudo ufw app list
Beispielausgabe:
Apache
Apache Full
Apache Secure
OpenSSH
Erlauben Sie das Profil „Apache Full“, um HTTP- und HTTPS-Verbindungen zu aktivieren:
$ sudo ufw allow "Apache Full"
Firewall-Regeln neu laden:
$ sudo ufw reload
UFW-Status erneut prüfen, um sicherzustellen, dass die Apache-Regeln aktiv sind:
$ sudo ufw status
Beispielausgabe:
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:
$ 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):
$ sudo certbot --apache -d app.example.com -m admin@example.com --agree-tos
Beispielausgabe:
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:
$ sudo certbot renew --dry-run
Apache neu starten, um die SSL-Konfiguration zu übernehmen:
$ 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
$ mysql -u dbadmin -p
Geben Sie das Passwort des Benutzers dbadmin ein, wenn Sie dazu aufgefordert werden.
Zur Beispieldatenbank wechseln
mysql> USE content_database;
Tabelle messages erstellen
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
mysql> INSERT INTO messages (content) VALUES ('Hello World! Greetings from centron');
Tabellendaten anzeigen
mysql> SELECT * from messages;
Beispielausgabe:
+----+------------------------------------------+
| content_id | content |
+------------+-----------------------------------+
| 1 | Hello World! Greetings from centron|
+------------+-----------------------------------+
1 row in set (0.00 sec)
MySQL-Konsole verlassen
mysql> EXIT;
Beispiel-PHP-Anwendung erstellen
Erstellen Sie die Datei setup.php im Webroot-Verzeichnis:
$ sudo nano /var/www/html/app.example.com/setup.php
Fügen Sie folgenden Code ein:
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
$ 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.


