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
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
$ sudo apt updateApache installieren
$ sudo apt install apache2 -yApache starten
$ sudo systemctl start apache2Apache für Autostart aktivieren
$ sudo systemctl enable apache2Status des Apache-Dienstes prüfen
$ sudo systemctl status apache2Beispielausgabe:
● 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 startHTTP-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-serverMySQL für Autostart aktivieren
$ sudo systemctl enable mysqlMySQL starten
$ sudo systemctl start mysqlStatus des MySQL-Dienstes prüfen
$ sudo systemctl status mysqlBeispielausgabe:
● 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/mysqldWenn 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_installationBeantworten 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 mysqlStarkes 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 -pBeispieldatenbank 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-fpmGängige PHP-Erweiterungen installieren
$ sudo apt install -y php-mysql php-opcache php-cli libapache2-mod-phpDieser 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 -vBeispielausgabe:
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 TechnologiesPHP-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-fpmStatus von PHP-FPM prüfen
$ sudo systemctl status php7.4-fpmBeispielausgabe:
● 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 wwwPHP-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 setenvifDieser 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-fpmApache neu starten, um Änderungen zu übernehmen
$ sudo systemctl restart apache2PHP-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-dataPassen 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-fpmApache 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.confNeue Apache-Virtual-Host-Konfigurationsdatei erstellen
Erstellen Sie beispielsweise app.example.com.conf:
$ sudo nano /etc/apache2/sites-available/app.example.com.confFü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 combinedDiese 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.confApache-Konfiguration testen
$ sudo apache2ctl configtestBeispielausgabe:
Syntax OKWebroot-Verzeichnis für den Virtual Host erstellen
$ sudo mkdir -p /var/www/html/app.example.comBeispiel-PHP-Datei erstellen
$ sudo nano /var/www/html/app.example.com/info.phpFügen Sie folgenden PHP-Code ein:
<!--?php phpinfo(); ?-->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 statusBeispielausgabe:
Status: active
...Verfügbare UFW-Anwendungsprofile auflisten:
$ sudo ufw app listBeispielausgabe:
Apache
Apache Full
Apache Secure
OpenSSHErlauben Sie das Profil „Apache Full“, um HTTP- und HTTPS-Verbindungen zu aktivieren:
$ sudo ufw allow "Apache Full"Firewall-Regeln neu laden:
$ sudo ufw reloadUFW-Status erneut prüfen, um sicherzustellen, dass die Apache-Regeln aktiv sind:
$ sudo ufw statusBeispielausgabe:
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 --classicFordern 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-tosBeispielausgabe:
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.comAutomatische SSL-Erneuerung testen:
$ sudo certbot renew --dry-runApache neu starten, um die SSL-Konfiguration zu übernehmen:
$ sudo systemctl restart apache2LAMP-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 -pGeben 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.phpFügen Sie folgenden Code ein:
<?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
$ 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.
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.