SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-01

LAMP-Stack auf Ubuntu 24.04 mit PHP-FPM einrichten

Installieren Sie Apache, MariaDB mit unix_socket-Authentifizierung und PHP 8.3 über PHP-FPM, richten Sie einen vhost ein und aktivieren Sie HTTPS mit Certbot.

Was Sie aufbauen

Ein LAMP-Stack besteht auf einem Ubuntu-24.04-Server aus vier Komponenten: Linux als Grundlage, Apache für HTTP-Anfragen, MariaDB für die Datenhaltung und PHP 8.3 für die Ausführung des Codes. Am Ende verfügen Sie über einen namensbasierten virtuellen Host, der ein echtes Anwendungsverzeichnis bereitstellt, eine Datenbank mit einem eigenen Benutzer mit den geringsten erforderlichen Berechtigungen, PHP über PHP-FPM in Apache eingebunden sowie ein kostenloses Let's-Encrypt-Zertifikat.

Die Installation selbst umfasst vier apt Befehle. Fast alles in dieser Anleitung betrifft die Verbindung zwischen den Komponenten sowie die wenigen Fehler, durch die ein neu eingerichteter Stack eine leere Seite ausliefert, den Quellcode als Download an den Browser übergibt oder den Zugriff auf die gerade installierte Datenbank verweigert. Jeder dieser Fehler hat ein erkennbares Muster. Im Folgenden wird jeder Fehler mit dem genauen Text aufgeführt, den Sie sehen werden.

Voraussetzungen und wichtige Einschränkungen

Gehen Sie von einem neuen Ubuntu 24.04 KVM VPS mit einem sudo-Benutzer oder root sowie einer öffentlichen IPv4-Adresse aus. Ein minimaler Stack läuft mit 1 GB RAM. Weisen Sie ihm 2 GB zu, bevor Sie eine echte datenbankgestützte Anwendung darauf installieren, da die Standardpuffer von MariaDB zusammen mit einigen PHP-FPM-Workern das erste Gigabyte schnell aufbrauchen.

Vor dem Ausführen von Certbot am Ende müssen zwei Voraussetzungen erfüllt sein. Richten Sie diese daher jetzt ein. Sie benötigen einen Domainnamen mit einem A-Record, der auf die öffentliche IP-Adresse des VPS zeigt. Let's Encrypt führt die Validierung über HTTP für diesen Namen durch. Eine reine IP-Adresse kann niemals ein Zertifikat erhalten. Außerdem müssen die Ports 80 und 443 aus dem Internet erreichbar sein. Bei vielen Providern müssen Sie sie sowohl in einer Netzwerk-Firewall im Control Panel als auch in ufw auf dem System freigeben. DNS-Änderungen können bis zu einer Stunde für die Verteilung benötigen. Legen Sie den A-Record daher zuerst an, damit er verfügbar ist, wenn Sie ihn benötigen.

Schritt 1 - Apache installieren und die Standardseite bestätigen

sudo apt update
sudo apt install -y apache2

apt startet und aktiviert den Dienst für Sie. Prüfen Sie ihn:

systemctl status apache2

Die Ausgabe muss eine Zeile mit active (running) enthalten. Öffnen Sie nun http://YOUR_SERVER_IP/ in einem Browser. Die Apache2 Ubuntu Default Page mit dem großen Banner „It works!“ ist das korrekte Ergebnis. Sie bestätigt, dass Apache Inhalte bereitstellt, und ist kein Fehler. Die Seite befindet sich unter /var/www/html/index.html und wird vom mitgelieferten Standard-Virtual-Host 000-default.conf bereitgestellt. Sie deaktivieren beide später. Vorerst ist ihre Anwesenheit genau das gewünschte Ergebnis.

Wenn die Seite überhaupt nicht geladen wird, aber systemctl angibt, dass der Prozess läuft, blockiert eine Firewall die Verbindung. Das ist der nächste Schritt.

Schritt 2 – Firewall für HTTP und HTTPS öffnen

Das Paket apache2 registriert drei Anwendungsprofile für ufw. Listen Sie sie auf:

sudo ufw app list

Sie sehen Apache, Apache Full und Apache Secure. Apache gilt nur für Port 80, Apache Secure nur für Port 443 und Apache Full für beide Ports. Dieses Profil benötigen Sie, da Sie TLS am Ende hinzufügen.

sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enable

Erlauben Sie OpenSSH, bevor Sie ufw enable ausführen. ufw verweigert standardmäßig den gesamten eingehenden Netzwerkverkehr. Wenn Sie es ohne eine SSH-Regel aktivieren, wird Ihre eigene Verbindung sofort nach der Aktivierung unterbrochen. Die aktuelle Sitzung bleibt zwar bestehen, Sie können jedoch keine neue Verbindung herstellen. Überprüfen Sie dies mit sudo ufw status. OpenSSH, Apache Full und die entsprechenden IPv6-Einträge müssen alle den Status ALLOW anzeigen.

Schritt 3 - MariaDB installieren und absichern

sudo apt install -y mariadb-server
systemctl status mariadb

Ubuntu 24.04 enthält MariaDB 10.11, eine Version mit langfristigem Support. Sie benötigen daher kein externes Repository. Sichern Sie MariaDB, sobald der Dienst läuft:

sudo mysql_secure_installation

Lesen Sie die Eingabeaufforderungen aufmerksam, anstatt wiederholt die Eingabetaste zu drücken. Wenn nach dem aktuellen root-Passwort gefragt wird, drücken Sie die Eingabetaste, da noch keines festgelegt ist. Bei der Frage „Switch to unix_socket authentication?“ ändert die Antwort nichts, weil diese Authentifizierung in diesem Paket bereits aktiviert ist. Drücken Sie daher n. Antworten Sie auf „Change the root password?“ mit n. Der Grund dafür wird im nächsten Absatz erklärt. Antworten Sie auf die übrigen Fragen mit Y: anonyme Benutzer entfernen, die entfernte root-Anmeldung verbieten, die Testdatenbank löschen und die Berechtigungstabellen neu laden.

Dieser Teil führt häufig zu Verwirrung. Bei MariaDB unter Ubuntu verwendet das Datenbankkonto root die Authentifizierung über unix_socket, nicht über ein Passwort. MariaDB vertraut damit dem Betriebssystembenutzer, als der Sie sich bereits authentifiziert haben. Daher funktioniert dies aus einer root-Shell:

sudo mysql

...und Sie erhalten eine MariaDB [(none)]>-Eingabeaufforderung, ohne dass ein Passwort abgefragt wird. Derselbe Befehl wird für einen nicht privilegierten Benutzer verweigert. Genau das ist der Zweck: Der Zugriff auf den Datenbankbenutzer root ist an sudo auf dem System gebunden, und es gibt kein Passwort, das gestohlen, durch Phishing erlangt oder per Brute-Force ermittelt werden kann. Das ist sicherer als ein Passwort. Lassen Sie diese Einstellung daher unverändert. Daraus folgt eine wichtige Regel: Verweisen Sie niemals eine Anwendung auf das Konto root. Erstellen Sie pro Anwendung einen eigenen Benutzer (Schritt 7). Eine Anwendung, die sich über TCP mit Benutzername und Passwort verbindet, kann die Socket-Authentifizierung ohnehin nicht verwenden. Außerdem soll jede Anwendung nur auf ihre eigene Datenbank zugreifen können.

Schritt 4 - PHP 8.3 mit PHP-FPM installieren

Ubuntu 24.04 verwendet standardmäßig PHP 8.3. Installieren Sie den FPM-Prozessmanager und die Erweiterungen, die eine typische Anwendung benötigt:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-cli \
  php8.3-curl php8.3-xml php8.3-mbstring php8.3-zip

Beachten Sie, was in dieser Liste nicht enthalten ist: libapache2-mod-php. Dieses ältere Paket bettet einen PHP-Interpreter in jeden Apache-Prozess ein. Das ist einfach, aber jeder Worker enthält eine eigene PHP-Kopie, unabhängig davon, ob er ein Skript oder ein statisches Bild bereitstellt. Beide teilen sich außerdem denselben Lebenszyklus. Zudem funktioniert diese Variante nur mit Apaches prefork-MPM, dem am wenigsten effizienten MPM. PHP-FPM führt PHP stattdessen als eigenen Prozesspool aus, mit dem Apache über einen Socket kommuniziert. Apache kann dann das threadbasierte event-MPM für statische Dateien verwenden und nur PHP-Anfragen weiterleiten. Der Pool lässt sich unabhängig vom Webserver konfigurieren. Dieselbe FPM-Konfiguration funktioniert später auch, wenn Sie stattdessen nginx davorschalten. Das ist aus gutem Grund die aktuelle Standardlösung.

Apache greift über das proxy_fcgi-Modul auf FPM zu. Aktivieren Sie das Modul, aktivieren Sie die vom FPM-Paket installierte Konfiguration und starten Sie Apache neu:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl restart apache2

a2enconf php8.3-fpm aktiviert /etc/apache2/conf-available/php8.3-fpm.conf. Diese Konfiguration enthält die Regel, die PHP-Dateien an den FPM-Socket weiterleitet. Der zentrale Teil erkennt jede Datei mit der Endung .php 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>

Sie müssen diese Datei nicht bearbeiten. Sie wird korrekt mitgeliefert. Der Socket-Pfad ist jedoch wichtig für die Diagnose der später auftretenden Fehler „PHP wird statt der Ausführung heruntergeladen“ und „Primary script unknown“. Beide Fehler entstehen dadurch, dass Apache und FPM bei diesem Socket oder bei der dahinterliegenden Datei unterschiedliche Angaben verwenden.

Schritt 5 - Ein namensbasierter virtueller Host für Ihre App

Mit namensbasiertem Virtual Hosting kann eine IP-Adresse mehrere Websites bereitstellen. Apache wählt die Website anhand des Host:-Headers in der Anfrage aus. Erstellen Sie ein Verzeichnis für die App, mit ausreichendem Abstand zum standardmäßigen /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/testapp

Die Besitzverhältnisse 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, beispielsweise ein Upload-Verzeichnis, sollten daher www-data gehören. Wenn Sie Dateien zusätzlich als Ihr Anmeldebenutzer bearbeiten, 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 eindeutigste Lösung.

Erstellen Sie den virtuellen 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 tatsächliche Domain. Options -Indexes verhindert, dass Apache das Verzeichnis auflistet, wenn keine Indexdatei vorhanden ist. Andernfalls können Besucher Ihr Quellverzeichnis durchsuchen. AllowOverride All ermöglicht die Verwendung einer .htaccess-Datei. Die meisten PHP-Anwendungen erwarten diese Datei für ansprechende URLs. Setzen Sie den Wert auf None, wenn Ihre App diese Funktion nicht benötigt, um eine geringfügige Geschwindigkeitssteigerung zu erzielen. Aktivieren Sie diese Website, deaktivieren Sie die Standardwebsite, prüfen Sie die Konfiguration und laden Sie Apache neu:

sudo a2ensite testapp
sudo a2dissite 000-default
sudo apache2ctl configtest
sudo systemctl reload apache2

apache2ctl configtest sollte Syntax OK ausgeben. Die Zeile a2dissite 000-default wird häufig vergessen. Deshalb scheint die Standardseite später weiterhin angezeigt zu werden. Dieser Fehler wird im Abschnitt zu den Fehlerursachen behandelt.

Schritt 6 – Nachweisen, dass PHP ausgeführt wird, und den Nachweis anschließend löschen

Legen Sie eine einzeilige PHP-Datei im Stammverzeichnis der Anwendung ab:

echo "<?php phpinfo();" | sudo tee /var/www/testapp/info.php

Rufen Sie http://app.example.com/info.php auf. Das korrekte Ergebnis ist die lange violett-graue Tabelle PHP Version 8.3.x mit den geladenen Modulen. In der Zeile Server API muss FPM/FastCGI stehen. Diese letzte Zeile bestätigt, dass die Anfragen über PHP-FPM und nicht über mod_php verarbeitet werden.

Löschen Sie die Datei sofort:

sudo rm /var/www/testapp/info.php

phpinfo() gibt Ihre genaue PHP-Version, alle geladenen Erweiterungen, Dateipfade und Umgebungsdetails preis. Das erleichtert Angreifern die Suche nach einer Version mit einer bekannten Sicherheitslücke. Die Datei dient nur zum Testen und ist keine Funktion. Löschen Sie sie, sobald Sie die Seite gesehen haben. Wenn Ihr Browser statt der Tabelle info.php zum Herunterladen anbietet, ist PHP nicht an Apache angebunden. Wechseln Sie zunächst zum Abschnitt über Fehler, bevor Sie etwas anderes tun.

Schritt 7 - Anwendungsdatenbank und Benutzer mit den geringsten Berechtigungen erstellen

Öffnen Sie die Datenbank als über die Socket-Authentifizierung angemeldeter root:

sudo mysql

Erstellen Sie anschließend eine Datenbank und einen Benutzer, der ausschließlich dieser Datenbank zugeordnet ist:

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;

Hier wurden drei bewusste Entscheidungen getroffen. utf8mb4 ist echtes UTF-8 mit vier Bytes. Der alte Alias utf8 schneidet Emojis und einige CJK-Zeichen stillschweigend ab. Verwenden Sie daher immer utf8mb4. Die Berechtigung gilt für appdb.* und nicht für *.*. Dieser Benutzer kann nur auf die eigene Datenbank zugreifen. Dadurch kann eine SQL-Injection-Schwachstelle in der Anwendung nicht die Tabellen aller anderen Websites lesen. 'appuser'@'localhost' beschränkt das Konto auf Verbindungen, die direkt vom Server selbst stammen.

Testen Sie die Verbindung als dieser Benutzer:

mysql -u appuser -p appdb

Sie werden nach dem Passwort gefragt und erhalten eine MariaDB [appdb]>-Eingabeaufforderung. Beachten Sie, dass kein -h-Flag vorhanden ist. Lassen Sie es weg. Der Client verbindet sich dann über den lokalen Unix-Socket. Genau das zählt MariaDB als localhost. Ein wichtiger Sonderfall: Für MySQL und MariaDB bedeutet localhost den Unix-Socket und 127.0.0.1 eine TCP-Verbindung. Bei einer Standardinstallation von Ubuntu 24.04 mit MariaDB ordnet der Server eine TCP-Verbindung von 127.0.0.1 weiterhin localhost zu. Beide Verbindungsarten passen daher zum Konto. Wenn auf dem Server jedoch skip-name-resolve aktiviert ist, werden beide als unterschiedliche Hosts behandelt. Das ist eine häufige Optimierung und in vielen Container-Images der Standard. Eine Anwendung, die eine Verbindung zu 127.0.0.1 herstellt, wird dann mit ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' (using password: YES) abgewiesen, selbst wenn das Passwort korrekt ist.

Konfigurieren Sie Ihre Anwendung daher mit Host localhost, Benutzer appuser und Datenbank appdb. Verwenden Sie niemals root. Sowohl PHPs mysqli als auch PDO wechseln zum Unix-Socket, wenn der Host exakt als Zeichenfolge localhost angegeben wird. Damit verwenden sie das Konto, das Sie gerade erstellt haben. Wenn ein Framework auf einem numerischen TCP-Host besteht, erstellen Sie den Benutzer passend zur tatsächlich verwendeten Verbindung: 'appuser'@'127.0.0.1' oder @'%', wobei Letzteres mit einer Firewall-Regel kombiniert werden sollte und nur verwendet werden darf, wenn die Datenbank von einem anderen Rechner aus erreichbar sein muss.

Schritt 8 - HTTPS mit Certbot hinzufügen

Wenn Sie ein Anmeldeformular über unverschlüsseltes HTTP bereitstellen, werden Passwörter im Klartext übertragen. Außerdem kennzeichnet jeder moderne Browser die Seite als „Nicht sicher“. Certbot behebt das mit einem einzigen Befehl. Installieren Sie Certbot mit dem Apache-Plugin:

sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache

Certbot verwendet hier zwei Plugins. Der apache authenticator weist nach, dass Sie die Kontrolle über die Domain haben, indem er kurzzeitig eine Challenge-Datei über Ihren laufenden Apache bereitstellt. Der apache installer passt anschließend Ihren virtuellen Host an, fügt den Block 443 hinzu, verweist ihn auf das neue Zertifikat und leitet standardmäßig den gesamten HTTP-Datenverkehr auf HTTPS um. Seit Certbot 2.0 gibt es keine Frage zur Umleitung mehr. Übergeben Sie --no-redirect, wenn Sie weiterhin unverschlüsseltes HTTP bereitstellen müssen. Da Sie in Schritt 5 einen echten ServerName festgelegt haben, erkennt Certbot die Domain automatisch. Zertifikate sind 90 Tage gültig. Das Paket installiert außerdem einen systemd-Timer, der die Zertifikate erneuert. Überprüfen Sie den Timer mit sudo certbot renew --dry-run. Die Ausgabe sollte mit Congratulations, all simulated renewals succeeded enden.

Eine vollständige Anleitung zur Challenge, zum Erneuerungs-Timer sowie zu den Anforderungen an DNS und Firewall finden Sie im Begleithandbuch kostenlose Let's Encrypt-TLS-Zertifikate mit Certbot unter Apache ausstellen.

Sicherungen, Upgrades und Absicherung

Sichern Sie die beiden Komponenten, die Ihren Zustand enthalten: 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', und wird anschließend vom Server kopiert. Es ist wichtig, die gesamte Pipeline in sudo sh -c zu kapseln: Ohne diese Kapselung führt die Shell die Umleitung > /root/... als Ihr eigener Benutzer aus und schlägt mit Permission denied fehl, weil nur mysqldump die sudo geerbt hat. --single-transaction erstellt einen konsistenten Snapshot der InnoDB-Tabellen, ohne sie zu sperren. Kombinieren Sie dies mit einem tar von /var/www und /etc/apache2/sites-available, und Sie können den gesamten Stack auf einem neuen VPS aus diesen Dateien wiederherstellen.

Upgrades sind ein gewöhnlicher sudo apt update && sudo apt upgrade. Problematisch ist eine PHP-Versionsaktualisierung: Wenn eine zukünftige Ubuntu-Version den Standard auf PHP 8.4 setzt, installiert apt möglicherweise php8.4-fpm parallel zu 8.3, der Socket wird zu /run/php/php8.4-fpm.sock, und Ihre Apache-Konfiguration verweist weiterhin auf den Socket von 8.3. Aktivieren Sie die neue Konfiguration (sudo a2enconf php8.4-fpm) und deaktivieren Sie die alte. Andernfalls gibt Ihre Website nach einem ansonsten routinemäßigen Upgrade Primary script unknown zurück. Da PHP-Versionen schneller veröffentlicht werden als eine LTS-Distribution, prüfen Sie die aktuellen PHP-Versionshinweise, statt eine Patch-Version festzuschreiben.

Zwei Maßnahmen zur Absicherung sollten Sie am ersten Tag durchführen. Installieren Sie erstens Fail2Ban zur Überwachung von SSH auf dem Server. Ein öffentlicher VPS erhält innerhalb weniger Minuten automatisierte Anmeldeversuche. Eine kleine Jail reduziert Tausende Versuche auf wenige, bevor eine Sperre greift. Wenn Sie Apache-Virtual-Hosts, MariaDB-Datenbanken und Benutzer lieber über einen Browser als durch manuelles Bearbeiten von Dateien verwalten, verwenden Sie zweitens das webbasierte Webmin-Kontrollpanel. Es setzt direkt auf diesem Stack auf und bearbeitet dieselben Konfigurationsdateien, die Sie gerade erstellt haben. Keine dieser Lösungen ersetzt das Verständnis der einzelnen Komponenten. Beide verringern jedoch den Aufwand im täglichen Betrieb.

Fehlerzustände und die angezeigten Meldungen

Die Standardseite wird nicht ausgeblendet. Sie haben Ihren virtuellen Host bearbeitet und Apache neu geladen, aber der Browser zeigt weiterhin „Apache2 Ubuntu Default Page“ und das Banner „It works!“. Apache verwendet den ersten passenden virtuellen Host. Wenn kein ServerName mit der Anfrage übereinstimmt, wird die alphabetisch erste Konfiguration verwendet. 000-default.conf wird vor testapp.conf eingeordnet. Entweder stimmt der Hostname der Anfrage nicht mit Ihrem ServerName überein, oder Sie haben sudo a2dissite 000-default nie ausgeführt. Deaktivieren Sie den Standardhost mit sudo systemctl reload apache2 und prüfen Sie das Ergebnis mit apache2ctl -S. Der Befehl gibt die Zuordnung der virtuellen Hosts aus und zeigt, welche Konfiguration den Standardhost bereitstellt. Leeren Sie außerdem den Browsercache. Eine zwischengespeicherte 200-Antwort der alten Seite bleibt sonst weiterhin sichtbar.

Eine .php-Datei wird heruntergeladen, statt ausgeführt zu werden. Sie öffnen info.php, und der Browser lädt eine Datei mit dem unverarbeiteten <?php-Quelltext herunter oder zeigt ihn als einfachen Text an, statt ihn auszuführen. Apache stellt die Datei als statisches Objekt bereit, weil der PHP-Handler nicht zugeordnet ist, Sie sudo a2enmod proxy_fcgi oder sudo a2enconf php8.3-fpm übersprungen haben oder Apache danach nicht neu gestartet wurde. Führen Sie alle drei Schritte aus (Schritt 4) und laden Sie die Seite neu. Prüfen Sie mit apache2ctl -M | grep fcgi, ob das Modul geladen ist. Die Ausgabe sollte proxy_fcgi_module enthalten. Dabei handelt es sich um ein Quelltextleck und nicht um ein rein kosmetisches Problem. Beheben Sie es, bevor Sie echte Inhalte auf dem Server bereitstellen.

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. Es akzeptiert Sie daher nur, wenn Ihr Betriebssystembenutzer tatsächlich root ist. Die korrekte Lösung lautet sudo mysql, ohne -u root und ohne Passwort. Diese Meldung ist das erwartete Verhalten einer funktionierenden Socket-Authentifizierung und kein Hinweis auf eine fehlerhafte Installation.

ERROR 1045 (28000): Access denied for user 'appuser'@'127.0.0.1' aus der Anwendung heraus, obwohl das richtige Passwort verwendet wird. Das Konto existiert als 'appuser'@'localhost'. Ihre Anwendung verbindet sich jedoch über TCP mit 127.0.0.1 auf einem Server, auf dem die Auflösung von Hostnamen deaktiviert ist (skip-name-resolve). MariaDB behandelt die beiden Angaben deshalb als unterschiedliche Hosts. localhost ist der Unix-Socket, 127.0.0.1 ist TCP. Konfigurieren Sie die Anwendung für den Host localhost, damit sie den Socket verwendet und das Konto findet. Alternativ erstellen Sie ein zweites Konto 'appuser'@'127.0.0.1', wenn das Framework ausschließlich TCP verwendet.

AH01071: Got error 'Primary script unknown' in /var/log/apache2/testapp-error.log, während der Browser File not found. anzeigt. Apache hat die Anfrage an PHP-FPM weitergeleitet. FPM konnte das Skript jedoch nicht unter dem von Apache übergebenen Pfad finden. Es gibt zwei häufige Ursachen: Der FPM-Socket in Ihrer Konfiguration verweist auf eine nicht installierte PHP-Version, beispielsweise auf einen php8.4-Socket nach einem Upgrade, während nur 8.3 ausgeführt wird. Oder die Datei ist tatsächlich nicht vorhanden, weil DocumentRoot und das tatsächliche Verzeichnis nicht übereinstimmen. Prüfen Sie mit ls -l /run/php/, ob der Socket vorhanden ist. Stellen Sie sicher, dass DocumentRoot mit dem Speicherort der Datei übereinstimmt. Starten Sie anschließend php8.3-fpm und apache2 neu.

AH00558: apache2: Could not reliably determine the server's fully qualified domain name bei jedem Neustart. Dies ist eine harmlose Warnung und kein Fehler. Apache weist darauf hin, dass kein globales ServerName gesetzt ist. Unterdrücken Sie die Warnung, indem Sie ServerName your.domain in /etc/apache2/conf-available/servername.conf schreiben und anschließend 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 verwendet bereits Port 80. Häufig handelt es sich um einen übrig gebliebenen nginx-Prozess aus einem früheren Test. Ermitteln Sie den Prozess mit sudo ss -ltnp | grep :80. Beenden und deaktivieren Sie anschließend den anderen Dienst, bevor Sie Apache starten.

FAQ

mod_php oder PHP-FPM – was sollte ich verwenden?

Verwenden Sie PHP-FPM. mod_php bindet einen Interpreter in jeden Apache-Prozess ein und erzwingt das langsame prefork-MPM. Dadurch fällt der PHP-Overhead in Apache auch beim Ausliefern eines statischen Bildes an. PHP-FPM führt PHP in einem separaten, unabhängig abgestimmten Pool aus, den Apache über einen Socket erreicht. Es funktioniert mit dem schnelleren, threadbasierten event-MPM und lässt sich später unverändert auf nginx übertragen. Es ist heute die Standardlösung. mod_php ist nur für eine Legacy-Anwendung sinnvoll, die von einem bestimmten Verhalten innerhalb des Prozesses abhängt.

Warum lädt mein Browser die PHP-Datei herunter, statt sie auszuführen?

Apache behandelt die .php-Datei als statischen Download, weil kein PHP-Handler dafür eingerichtet ist. Unter Ubuntu 24.04 mit FPM bedeutet das, dass Sie sudo a2enmod proxy_fcgi, sudo a2enconf php8.3-fpm oder den anschließenden Apache-Neustart übergangen haben. Führen Sie alle drei Schritte aus und laden Sie Apache anschließend neu. Prüfen Sie dann mit apache2ctl -M | grep fcgi, ob proxy_fcgi_module aufgeführt ist. Bis zur Behebung gibt der Server Quellcode preis. Behandeln Sie das Problem daher als dringend.

Warum wird der Root-Zugriff in MariaDB trotz des richtigen Passworts verweigert?

Da kein Passwort vorhanden ist, authentifiziert MariaDB unter Ubuntu das Konto root über unix_socket. Dadurch wird der Zugriff an den Root-Benutzer des Betriebssystems gebunden. mysql -u root aus einer normalen Shell gibt absichtlich ERROR 1698 (28000): Access denied for user 'root'@'localhost' zurück. Stellen Sie stattdessen mit sudo mysql eine Verbindung her. Erstellen Sie für jede Anwendung einen separaten Benutzer mit Passwortauthentifizierung, anstatt root wiederzuverwenden.

Wie füge ich meiner LAMP-Site HTTPS hinzu?

Installieren Sie certbot und python3-certbot-apache, richten Sie den A-Eintrag einer Domain auf den Server, und führen Sie anschließend sudo certbot --apache aus. Der Apache-Authenticator weist die Kontrolle über die Domain anhand Ihres laufenden Apache nach. Das Installationsprogramm schreibt den virtuellen Host für Port 443 um und richtet die automatische Erneuerung ein. Der vollständige Leitfaden zu Certbot und Apache behandelt die Challenge, den Erneuerungs-Timer und die häufigsten Fehlerursachen.

#lamp#apache#mariadb#php-fpm#ubuntu