LAMP Stack installieren Ubuntu 24.04 PHP-FPM
Lernen Sie die Installation von Apache, MariaDB und PHP 8.3 auf Ubuntu 24.04. Inklusive PHP-FPM, vhost und Certbot für HTTPS. Vermeiden Sie leere Seiten.
Was Sie aufbauen
Ein LAMP-Stack besteht aus vier Komponenten auf einem Ubuntu 24.04-Server: Linux als Betriebssystem, Apache für HTTP, MariaDB zur Datenspeicherung und PHP 8.3 zur Code-Ausführung. Am Ende verfügen Sie über einen namensbasierten Virtual Host, der ein echtes Anwendungsverzeichnis bereitstellt, eine Datenbank mit einem dedizierten Benutzer mit minimalen Berechtigungen, PHP, das über PHP-FPM in Apache eingebunden ist, und ein kostenloses Let's Encrypt-Zertifikat.
Die Installation umfasst vier apt Befehle. Fast der gesamte Inhalt dieses Leitfadens befasst sich mit der Verbindung der Komponenten sowie mit den häufigen Fehlern, die dazu führen, dass ein neuer Stack eine leere Seite ausgibt, den Quellcode als Download an den Browser sendet oder den Zugriff auf die neu installierte Datenbank verweigert. Jeder dieser Fehler weist ein spezifisches Merkmal auf, und jeder wird unten mit dem exakten Text aufgeführt, den Sie sehen werden.
Voraussetzungen und bekannte Fallstricke
Gehen Sie von einem frischen Ubuntu 24.04 KVM VPS mit einem sudo-Benutzer oder root und einer öffentlichen IPv4-Adresse aus. Ein minimaler Stack benötigt 1 GB RAM; weisen Sie dem System 2 GB zu, bevor Sie eine echte Anwendung mit Datenbank installieren. Die Standard-Buffer von MariaDB und einige PHP-FPM-Worker verbrauchen schnell das erste Gigabyte.
Zwei Bedingungen müssen erfüllt sein, damit Certbot am Ende funktioniert. Konfigurieren Sie diese jetzt: Sie benötigen eine Domain mit einem A-Record, der auf die öffentliche IP des VPS zeigt. Let's Encrypt validiert über HTTP für diesen Namen; eine reine IP-Adresse kann kein Zertifikat erhalten. Zudem müssen die Ports 80 und 443 aus dem Internet erreichbar sein. Bei vielen Providern bedeutet dies, diese sowohl in der Netzwerk-Firewall im Control Panel als auch in ufw auf dem Server zu öffnen. DNS-Änderungen können bis zu einer Stunde für die Propagation benötigen. Setzen Sie den A-Record daher zuerst, damit er aktiv ist, wenn Sie ihn benötigen.
Schritt 1 - Apache installieren und die Standardseite bestätigen
sudo apt update
sudo apt install -y apache2apt startet und aktiviert den Dienst automatisch. Überprüfen Sie dies:
systemctl status apache2Die Ausgabe muss die Zeile active (running) enthalten. Öffnen Sie nun http://YOUR_SERVER_IP/ in einem Browser. Die Apache2 Ubuntu Default Page mit dem großen "It works!"-Banner ist das korrekte Ergebnis — dies beweist, dass Apache Anfragen beantwortet. Diese Seite befindet sich unter /var/www/html/index.html und wird vom standardmäßig installierten Virtual Host 000-default.conf bereitgestellt. Sie werden beide später deaktivieren; im aktuellen Zustand ist dies das gewünschte Ergebnis.
Falls die Seite nicht lädt, systemctl aber anzeigt, dass der Prozess läuft, blockiert eine Firewall. Dies ist der nächste Schritt.
Schritt 2 - Firewall für HTTP und HTTPS öffnen
Das Paket apache2 registriert drei ufw Anwendungsprofile. Listen Sie diese auf:
sudo ufw app listSie sehen Apache, Apache Full und Apache Secure. Apache betrifft nur Port 80, Apache Secure nur Port 443 und Apache Full betrifft beide – das ist das benötigte Profil, da Sie am Ende TLS hinzufügen.
sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enableErlauben Sie OpenSSH, bevor Sie ufw enable ausführen. ufw verweigert standardmäßig den gesamten eingehenden Datenverkehr. Wenn Sie die Firewall ohne eine SSH-Regel aktivieren, wird Ihre eigene Verbindung unterbrochen – die aktuelle Sitzung bleibt zwar bestehen, aber eine erneute Verbindung ist nicht mehr möglich. Bestätigen Sie dies mit sudo ufw status; OpenSSH, Apache Full und deren v6-Äquivalente müssen alle auf ALLOW stehen.
Schritt 3 - MariaDB installieren und absichern
sudo apt install -y mariadb-server
systemctl status mariadbUbuntu 24.04 enthält MariaDB 10.11, eine Long-Term-Support-Version. Ein externes Repository ist daher nicht erforderlich. Wenn der Dienst läuft, härten Sie ihn ab:
sudo mysql_secure_installationEs ist besser, die Aufforderungen zu lesen, anstatt nur Enter zu drücken. Wenn nach dem aktuellen root-Passwort gefragt wird, drücken Sie Enter – es ist noch keines gesetzt. Wenn die Frage "Switch to unix_socket authentication?" erscheint, ändert die Antwort nichts, da diese Funktion in diesem Paket bereits aktiviert ist. Drücken Sie n. Antworten Sie mit n auf "Change the root password?" (siehe Grund im nächsten Absatz) und beantworten Sie den Rest mit Y: anonyme Benutzer entfernen, Remote-Root-Login verbieten, die Test-Datenbank löschen und die Privilegien-Tabellen neu laden.
Dies ist der Teil, der oft zu Verwirrung führt. Bei der MariaDB auf Ubuntu nutzt das root Datenbank-Konto die unix_socket Authentifizierung anstelle eines Passworts. Das bedeutet, die Datenbank vertraut dem Benutzer des Betriebssystems, mit dem Sie sich bereits authentifiziert haben. Daher funktioniert dies aus einer root-Shell heraus:
sudo mysql...und Sie gelangen zu einer MariaDB [(none)]> Prompt, ohne dass ein Passwort abgefragt wird. Derselbe Befehl wird als nicht privilegierter Benutzer verweigert. Das ist der entscheidende Punkt: Der Zugriff auf den Datenbank-root ist an sudo auf dem System gebunden. Es gibt kein Passwort, das gestohlen, per Phishing erlangt oder per Brute-Force angegriffen werden könnte. Dies ist sicherer als ein Passwort; lassen Sie es daher unverändert. Die daraus folgende Regel lautet: Verbinden Sie niemals eine Anwendung mit dem root Konto. Erstellen Sie für jede Anwendung einen eigenen Benutzer (Schritt 7). Eine Anwendung, die über TCP mit Benutzername und Passwort eine Verbindung herstellt, kann keine Socket-Authentifizierung nutzen. Zudem sollten Sie jede Anwendung auf ihre eigene Datenbank beschränken.
Schritt 4 - PHP 8.3 mit PHP-FPM installieren
Die Standardversion von PHP unter Ubuntu 24.04 ist 8.3. Installieren Sie den FPM-Prozessmanager sowie die Erweiterungen, die für typische Anwendungen erforderlich sind:
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-cli \
php8.3-curl php8.3-xml php8.3-mbstring php8.3-zipBeachten Sie, was nicht in dieser Liste enthalten ist: libapache2-mod-php. Dieses ältere Paket bettet einen PHP-Interpreter in jeden Apache-Prozess ein. Das ist einfach, aber jeder Worker trägt eine PHP-Kopie mit sich, egal ob er ein Skript oder ein statisches Bild ausliefert. Beide teilen sich einen Lebenszyklus. Zudem funktioniert dies nur mit dem Apache prefork MPM, dem am wenigsten effizienten Modul. PHP-FPM hingegen führt PHP als eigenen Prozesspool aus, mit dem Apache über einen Socket kommuniziert. Apache kann dann das Threaded-Modul event MPM für statische Dateien nutzen und nur PHP-Anfragen weiterleiten. Der Pool ist unabhängig vom Webserver optimiert. Dieselbe FPM-Konfiguration funktioniert auch dann, wenn Sie später nginx als Reverse-Proxy davor schalten. Dies ist aus gutem Grund der aktuelle Standard.
Apache erreicht FPM über das proxy_fcgi Modul. Aktivieren Sie es, aktivieren Sie die Konfigurationsdatei, die durch das FPM-Paket erstellt wurde, und starten Sie den Dienst neu:
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2a2enconf php8.3-fpm aktiviert /etc/apache2/conf-available/php8.3-fpm.conf. Dieses enthält die Regel, die PHP-Dateien an den FPM-Socket weiterleitet. Der Kern der Regel erkennt jede .php Datei und leitet sie an den Socket unter /run/php/php8.3-fpm.sock weiter:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>Bearbeiten Sie diese Datei nicht; sie ist korrekt konfiguriert. Das Wissen um den Socket-Pfad hilft Ihnen jedoch später bei der Diagnose von Fehlern wie "PHP wird heruntergeladen, statt es auszuführen" oder "Primary script unknown". Beide Fehler entstehen, wenn Apache und FPM sich über diesen Socket oder die dahinterliegende Datei uneinig sind.
Schritt 5 - Ein namensbasierter Virtual Host für Ihre App
Namensbasiertes Virtual Hosting ermöglicht es einer IP, viele Websites zu bedienen; Apache wählt die Website anhand des Host: Headers in der Anfrage aus. Erstellen Sie ein Verzeichnis für die App, getrennt vom Standardverzeichnis /var/www/html:
sudo mkdir -p /var/www/testapp
sudo chown -R www-data:www-data /var/www/testapp
sudo chmod -R 755 /var/www/testappDie Besitzrechte sind wichtig. Apache und PHP-FPM laufen unter Ubuntu beide als Benutzer www-data. Dateien, die der Webserver lesen muss — und Verzeichnisse, in die eine App schreiben muss, wie ein Upload-Ordner — sollten dem Benutzer www-data gehören. Wenn Sie Dateien auch mit Ihrem Login-Benutzer bearbeiten möchten, ist es üblich, die Dateien selbst zu besitzen und Ihren Benutzer der Gruppe www-data hinzuzufügen; für eine einfache Bereitstellung ist www-data:www-data die sicherste Methode.
Erstellen Sie den Virtual Host unter /etc/apache2/sites-available/testapp.conf:
<VirtualHost *:80>
ServerName app.example.com
DocumentRoot /var/www/testapp
<Directory /var/www/testapp>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/testapp-error.log
CustomLog ${APACHE_LOG_DIR}/testapp-access.log combined
</VirtualHost>Setzen Sie ServerName auf Ihre echte Domain. Options -Indexes verhindert, dass Apache das Verzeichnis auflistet, wenn keine Index-Datei vorhanden ist — andernfalls können Besucher Ihren Quellcode durchsuchen. AllowOverride All ermöglicht die Nutzung einer .htaccess Datei, die die meisten PHP-Anwendungen für Pretty URLs erwarten; löschen Sie diese unter None für eine leichte Geschwindigkeitssteigerung, falls Ihre App sie nicht benötigt. Aktivieren Sie diese Seite, deaktivieren Sie die Standardseite, prüfen Sie die Konfiguration und laden Sie sie neu:
sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2apache2ctl configtest sollte Syntax OK ausgeben. Die a2dissite 000-default Zeile wird oft vergessen, was dazu führt, dass die Standardseite weiterhin angezeigt wird — dies wird im Abschnitt zu den Fehlern erläutert.
Schritt 6 - PHP-Funktion prüfen und Testdatei löschen
Erstellen Sie eine einzeilige PHP-Datei im App-Root-Verzeichnis:
echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.phpRufen Sie http://app.example.com/info.php auf. Ein korrektes Ergebnis ist die lange violett-graue PHP Version 8.3.x Tabelle, die die geladenen Module auflistet, wobei die Server API Zeile FPM/FastCGI anzeigt. Diese letzte Zeile bestätigt, dass die Anfragen über PHP-FPM und nicht über mod_php verarbeitet werden.
Löschen Sie die Datei nun sofort:
sudo rm /var/www/testapp/info.phpphpinfo() legt die exakte PHP-Version, alle geladenen Extensions, Dateipfade und Umgebungsdetails offen. Dies stellt ein Sicherheitsrisiko dar, falls jemand den Server nach einer Version mit bekannten Schwachstellen scannt. Die Datei dient nur als Test, nicht als Funktion. Löschen Sie sie, sobald Sie die Seite gesehen haben. Falls Ihr Browser anstatt der Tabelle den Download von info.php anbietet, ist PHP nicht korrekt mit Apache verbunden; gehen Sie zum Abschnitt Fehlerbehebung, bevor Sie fortfahren.
Step 7 - Create the app database and a least-privilege user
Open the database as the socket-authenticated root:
sudo mysqlThen create one database and one user scoped to exactly that database:
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;Three deliberate choices here. utf8mb4 is real four-byte UTF-8 — the old utf8 alias silently truncates emoji and some CJK characters, so always use utf8mb4. The grant is on appdb.*, not *.*: this user can touch its own database and nothing else, so a SQL-injection hole in the app cannot read every other site's tables. And 'appuser'@'localhost' restricts the account to connections originating on the box itself.
Test it as that user:
mysql -u appuser -p appdbIt asks for the password and drops you at a MariaDB [appdb]> prompt. Notice there is no -h flag — leave it off and the client connects over the local Unix socket, which is exactly what MariaDB counts as localhost. One gotcha worth knowing: to MySQL and MariaDB, localhost means the Unix socket and 127.0.0.1 means a TCP connection. On a stock Ubuntu 24.04 MariaDB the server still resolves a TCP connection from 127.0.0.1 back to localhost, so both match the account — but on servers with skip-name-resolve enabled (a common performance tweak, and the norm in many container images), the two are matched as different hosts, and an app that dials 127.0.0.1 is refused with ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) even when the password is correct.
So point your application at host localhost, user appuser, database appdb — never at root. PHP's mysqli and PDO both switch to the Unix socket when the host is the literal string localhost, matching the account you just created. If a framework insists on a numeric TCP host, create the user to match how it actually connects — 'appuser'@'127.0.0.1', or @'%' (paired with a firewall rule) only if it must reach the database from another machine.
Schritt 8 - HTTPS mit Certbot hinzufügen
Das Ausliefern eines Login-Formulars über unverschlüsseltes HTTP überträgt Passwörter im Klartext. Zudem markiert jeder moderne Browser die Seite als „Nicht sicher“. Certbot behebt dies mit einem einzigen Befehl. Installieren Sie Certbot mit dem Apache-Plugin:
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apacheCertbot verwendet hier zwei Plugins. Der apache authenticator beweist die Kontrolle über die Domain, indem er kurzzeitig eine Challenge-Datei über den laufenden Apache ausliefert. Der apache installer schreibt anschließend den Virtual Host um, um den 443 Block hinzuzufügen, auf das neue Zertifikat zu verweisen und den gesamten HTTP-Verkehr standardmäßig auf HTTPS umzuleiten. Seit Certbot 2.0 gibt es keine Frage zur Weiterleitung mehr; übergeben Sie --no-redirect, wenn der unverschlüsselte HTTP-Betrieb beibehalten werden soll. Da Sie in Schritt 5 einen echten ServerName eingerichtet haben, erkennt Certbot die Domain automatisch. Zertifikate sind 90 Tage gültig. Das Paket installiert einen systemd-Timer zur automatischen Erneuerung; überprüfen Sie den Timer mit sudo certbot renew --dry-run, der auf Congratulations, all simulated renewals succeeded enden sollte.
Die vollständige Anleitung zur Challenge, zum Erneuerungs-Timer sowie zu den DNS- und Firewall-Anforderungen finden Sie im Begleitguide Ausstellen kostenloser Let's Encrypt TLS-Zertifikate mit Certbot auf Apache.
Backups, Upgrades und Hardening
Sichern Sie die zwei Komponenten, die Ihren Zustand speichern: die Datenbanken und das Web-Root-Verzeichnis. Ein nächtlicher logischer Dump ist der einfachste zuverlässige Ansatz — sudo sh -c 'mysqldump --all-databases --single-transaction | gzip > /root/db-$(date +%F).sql.gz', gefolgt von einem Kopieren vom Server. Die Verwendung von sudo sh -c für die gesamte Pipeline ist wichtig: Ohne diese führt die Shell den > /root/...-Redirect als Ihr Benutzer aus und schlägt mit Permission denied fehl, da nur mysqldump die sudo geerbt hat. --single-transaction erstellt einen konsistenten Snapshot der InnoDB-Tabellen, ohne diese zu sperren. Kombinieren Sie dies mit einem tar von /var/www und /etc/apache2/sites-available, um den gesamten Stack auf einem neuen VPS aus diesen Dateien wiederherzustellen.
Upgrades sind ein gewöhnlicher sudo apt update && sudo apt upgrade. Problematisch ist ein PHP-Versionssprung — wenn ein zukünftiges Ubuntu die Standardversion auf PHP 8.4 umstellt, installiert apt möglicherweise php8.4-fpm neben 8.3, der Socket wird zu /run/php/php8.4-fpm.sock, aber Ihre Apache-Konfiguration zeigt weiterhin auf den 8.3-Socket. Aktivieren Sie die neue Konfiguration (sudo a2enconf php8.4-fpm) und deaktivieren Sie die alte, sonst liefert Ihre Website nach einem ansonsten routinemäßigen Upgrade Primary script unknown zurück. Da PHP-Releases schneller erscheinen als LTS-Distributionen, prüfen Sie die aktuellen PHP-Release-Notes, anstatt eine Patch-Version festzulegen.
Zwei Hardening-Schritte sind am ersten Tag sinnvoll. Erstens sollten Sie Fail2Ban für SSH aktivieren — ein öffentlicher VPS erhält innerhalb von Minuten automatisierte Login-Versuche, und ein kleiner Jail reduziert tausende Versuche auf eine Handvoll, bevor eine Sperre erfolgt. Zweitens: Wenn Sie Apache Virtual Hosts, MariaDB-Datenbanken und Benutzer lieber über einen Browser als durch manuelles Bearbeiten von Dateien verwalten möchten, bietet das Webmin Web-Control-Panel eine Oberfläche für genau diesen Stack und steuert dieselben Konfigurationsdateien, die Sie gerade erstellt haben. Keines von beiden ersetzt das Verständnis der einzelnen Komponenten, aber beide reduzieren den täglichen Aufwand.
Fehlerursachen und die angezeigten Meldungen
Die Standardseite verschwindet nicht. Sie haben Ihren Virtual Host bearbeitet, Apache neu geladen, aber der Browser zeigt weiterhin die "Apache2 Ubuntu Default Page" mit dem "It works!"-Banner an. Apache bedient den ersten passenden Virtual Host. Wenn kein ServerName mit der Anfrage übereinstimmt, gewinnt die alphabetisch erste Konfiguration — 000-default.conf wird vor testapp.conf sortiert. Entweder stimmt der Hostname der Anfrage nicht mit Ihrem ServerName überein, oder Sie haben sudo a2dissite 000-default nicht ausgeführt. Deaktivieren Sie die Standardkonfiguration, sudo systemctl reload apache2, und prüfen Sie dies mit apache2ctl -S. Dieser Befehl gibt die vhost-Map aus und zeigt, welche Konfiguration die Standardseite besitzt. Leeren Sie auch den Browser-Cache; ein gecachter 200-Status der alten Seite bleibt bestehen.
Eine .php-Datei wird heruntergeladen, statt sie auszuführen. Sie öffnen info.php und der Browser lädt eine Datei mit dem rohen <?php-Quellcode herunter oder zeigt ihn als Klartext an, anstatt ihn auszuführen. Apache bedient die Datei als statisches Asset, weil der PHP-Handler nicht zugewiesen ist — Sie haben sudo a2enmod proxy_fcgi oder sudo a2enconf php8.3-fpm übersprungen oder Apache danach nicht neu gestartet. Führen Sie alle drei Schritte (Schritt 4) aus und laden Sie die Seite neu. Bestätigen Sie, dass das Modul geladen ist, indem Sie apache2ctl -M | grep fcgi nutzen; dies sollte proxy_fcgi_module auflisten. Dies ist ein Abfluss von Quellcode und kein kosmetischer Fehler. Beheben Sie dies, bevor Sie echte Daten auf den Server laden.
ERROR 1698 (28000): Access denied for user 'root'@'localhost'. Sie haben mysql -u root oder mariadb -u root ohne sudo ausgeführt. Das Root-Konto verwendet unix_socket-Authentifizierung und akzeptiert Sie nur, wenn Ihr OS-Benutzer tatsächlich root ist. Die Lösung ist sudo mysql — keine -u root, kein Passwort. Diese Meldung ist das erwartete Verhalten einer korrekt funktionierenden Socket-Authentifizierung und kein fehlerhaftes System.
ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' durch die Anwendung mit dem korrekten Passwort. Das Konto existiert als 'appuser'@'localhost', aber Ihre Anwendung verbindet sich über TCP mit 127.0.0.1 auf einem Server, auf dem die Hostnamen-Auflösung deaktiviert ist (skip-name-resolve). MariaDB betrachtet diese als unterschiedliche Hosts — localhost ist der Unix-Socket, 127.0.0.1 ist TCP. Verweisen Sie die Anwendung auf den Host localhost, damit sie den Socket nutzt und das Konto matcht, oder erstellen Sie ein zweites Konto 'appuser'@'127.0.0.1', falls das Framework nur TCP unterstützt.
AH01071: Got error 'Primary script unknown' in /var/log/apache2/testapp-error.log, wobei der Browser File not found. anzeigt. Apache hat die Anfrage an PHP-FPM übergeben, aber FPM konnte das Skript unter dem von Apache angegebenen Pfad nicht finden. Zwei häufige Ursachen: Der FPM-Socket in Ihrer Konfiguration verweist auf eine PHP-Version, die nicht installiert ist (ein php8.4-Socket nach einem Upgrade, während nur 8.3 läuft), oder die Datei existiert nicht, weil DocumentRoot und das tatsächliche Verzeichnis nicht übereinstimmen. Prüfen Sie mit ls -l /run/php/, ob der Socket existiert, bestätigen Sie, dass DocumentRoot mit dem Speicherort der Datei übereinstimmt, und starten Sie sowohl php8.3-fpm als auch apache2 neu.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name bei jedem Neustart. Dies ist eine harmlose Warnung, kein Fehler — Apache teilt Ihnen mit, dass keine globale ServerName gesetzt ist. Unterdrücken Sie die Meldung, indem Sie ServerName your.domain in /etc/apache2/conf-available/servername.conf schreiben und sudo a2enconf servername ausführen.
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80 beim Start von Apache. Ein anderer Webserver belegt bereits Port 80 — oft ein verbliebener nginx aus einem früheren Experiment. Finden Sie diesen mit sudo ss -ltnp | grep :80, stoppen und deaktivieren Sie den anderen Dienst, bevor Sie Apache starten.
FAQ
mod_php oder PHP-FPM – was soll ich verwenden?
Verwenden Sie PHP-FPM. mod_php bettet einen Interpreter in jeden Apache-Prozess ein und erzwingt das langsame prefork MPM. Dadurch trägt Apache PHP-Overhead, selbst wenn nur ein statisches Bild ausgeliefert wird. PHP-FPM führt PHP als separaten, unabhängig optimierbaren Pool aus, auf den Apache über einen Socket zugreift. Dies ermöglicht die Nutzung des schnelleren Threaded-event MPM und lässt sich später problemlos auf nginx übertragen. Es ist der moderne Standard; mod_php ist nur für Legacy-Anwendungen sinnvoll, die auf In-Process-Verhalten angewiesen sind.
Warum lädt mein Browser die PHP-Datei herunter, anstatt sie auszuführen?
Apache behandelt die .php Datei als statischen Download, da kein PHP-Handler zugewiesen ist. Auf Ubuntu 24.04 mit FPM bedeutet dies, dass einer der Schritte sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm oder der anschließende Apache-Restart fehlt. Führen Sie alle drei Schritte aus und laden Sie den Dienst neu. Überprüfen Sie anschließend mit apache2ctl -M | grep fcgi, ob proxy_fcgi_module aufgelistet ist. Bis der Fehler behoben ist, gibt der Server Quellcode preis; behandeln Sie dies daher als dringlich.
Warum wird der Root-Zugriff in MariaDB trotz korrektem Passwort verweigert?
Weil kein Passwort verwendet wird — das MariaDB unter Ubuntu authentifiziert das root Konto via unix_socket. Dadurch ist das Konto an den Root-Benutzer des Betriebssystems gebunden. Ein Aufruf von mysql -u root aus einer normalen Shell liefert systembedingt ERROR 1698 (28000): Access denied for user 'root'@'localhost' zurück. Verbinden Sie sich stattdessen mit sudo mysql und erstellen Sie für Anwendungen einen separaten Benutzer mit Passwort-Authentifizierung, anstatt den Root-Account wiederzuverwenden.
Wie füge ich meiner LAMP-Seite HTTPS hinzu?
Installieren Sie certbot und python3-certbot-apache, setzen Sie den A-Record der Domain auf den Server und führen Sie dann sudo certbot --apache aus. Der Apache-Authenticator bestätigt die Domain-Kontrolle über Ihren laufenden Apache. Der Installer schreibt den Virtual Host für Port 443 um und richtet die automatische Erneuerung ein. Der vollständige Certbot- und Apache-Anleitung behandelt die Herausforderung, den Erneuerungs-Timer und die häufigsten Fehlerursachen.