MariaDB und PHP-FPM: Die Basis für Shopware und WordPress

nginx kann HTML-Dateien ausliefern, aber für dynamische Webanwendungen fehlen zwei entscheidende Komponenten: eine Datenbank und ein PHP-Interpreter. MariaDB und PHP-FPM bilden zusammen das Backend, auf dem Shopware, WordPress und praktisch jede andere PHP-Anwendung aufbauen. Diese Anleitung zeigt dir die Installation, Absicherung und die richtige Konfiguration beider Dienste.

Warum MariaDB statt MySQL?

MySQL gehört Oracle. Das allein wäre kein Grund zum Wechseln, aber Oracles Geschäftsstrategie hat in der Vergangenheit immer wieder für Unsicherheit gesorgt — Lizenzänderungen, eingeschränkte Community-Editionen, Enterprise-Features hinter Paywalls. MariaDB ist ein Fork von MySQL, gestartet vom ursprünglichen MySQL-Gründer Monty Widenius, und steht unter einer echten Open-Source-Lizenz.

Technisch ist MariaDB zu MySQL kompatibel — Anwendungen, die MySQL unterstützen, laufen in aller Regel auch mit MariaDB. Gleichzeitig bringt MariaDB eigene Verbesserungen mit: bessere Performance bei bestimmten Abfragen, zusätzliche Storage Engines und Features, die in MySQL der Enterprise-Edition vorbehalten sind. Für Shopware und WordPress ist MariaDB die empfohlene Wahl.

MariaDB 10.11 installieren

sudo apt install -y mariadb-server mariadb-client
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo mysql_secure_installation

Das mysql_secure_installation-Skript fragt mehrere Dinge ab: Root-Passwort setzen, anonyme Benutzer entfernen, Remote-Root-Login deaktivieren, Test-Datenbank löschen. Beantworte alles mit Ja. Die Test-Datenbank und anonyme Benutzer haben auf einem Produktionsserver nichts zu suchen, und der Root-Login sollte nur lokal möglich sein — nie über das Netzwerk.

Datenbank und Benutzer anlegen

Für jede Webanwendung legst du eine eigene Datenbank und einen eigenen Benutzer an. Nie die gleiche Datenbank oder den gleichen Benutzer für mehrere Anwendungen verwenden — wenn eine Anwendung kompromittiert wird, soll der Schaden begrenzt bleiben.

sudo mariadb
CREATE DATABASE meine_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mein_dbuser'@'localhost' IDENTIFIED BY 'SICHERES-PASSWORT-HIER';
GRANT ALL PRIVILEGES ON meine_app.* TO 'mein_dbuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

utf8mb4 statt utf8 ist wichtig — das alte MySQL-utf8 unterstützt nur drei Bytes pro Zeichen und kann keine Emojis oder bestimmte asiatische Schriftzeichen speichern. utf8mb4 ist echtes UTF-8 mit vier Bytes pro Zeichen. Der Benutzer ist auf localhost beschränkt und hat nur Zugriff auf seine eigene Datenbank — genau so, wie es sein soll.

PHP 8.3 mit FPM installieren

Warum FPM statt mod_php?

Bei Apache gibt es mod_php, das den PHP-Interpreter direkt in den Webserver-Prozess einbettet. Das ist einfach einzurichten, hat aber einen gravierenden Nachteil: Jeder Apache-Worker-Prozess lädt PHP — auch wenn er nur ein Bild oder eine CSS-Datei ausliefert. Das verschwendet RAM und vermischt die Zuständigkeiten.

PHP-FPM (FastCGI Process Manager) ist ein eigenständiger Dienst, der unabhängig vom Webserver läuft. nginx leitet PHP-Anfragen über einen Unix-Socket an FPM weiter. Fällt PHP ab, liefert nginx weiterhin statische Dateien aus. Fällt nginx aus, läuft die Datenbank weiter. Diese Isolation ist kein Luxus — sie ist der Grund, warum professionelle Setups seit Jahren auf FPM setzen.

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y \
  php8.3-fpm php8.3-cli \
  php8.3-mysql php8.3-curl \
  php8.3-gd php8.3-intl \
  php8.3-mbstring php8.3-xml \
  php8.3-zip php8.3-soap \
  php8.3-opcache php8.3-bcmath

Das PPA von Ondřej Surý ist die Standard-Quelle für aktuelle PHP-Versionen unter Ubuntu. Die Module sind nicht zufällig gewählt: gd für Bildverarbeitung, intl für Internationalisierung, mbstring für Multibyte-Strings, zip für Plugin-Installationen, soap für Schnittstellen zu ERP-Systemen, opcache für Performance. Shopware und WordPress brauchen alle diese Module.

php.ini anpassen

Die Standardwerte der php.ini sind für Shared Hosting ausgelegt, nicht für einen dedizierten Server. Auf einem VPS hast du die Kontrolle und solltest die Werte an deine Anwendung anpassen.

sudo nano /etc/php/8.3/fpm/php.ini

Die wichtigsten Einstellungen:

memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_vars = 5000

opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 2

memory_limit auf 512M, weil Shopware bei komplexen Operationen wie dem Löschen des Caches oder dem Kompilieren des Dependency Injection Containers schnell 256M überschreitet. upload_max_filesize und post_max_size müssen identisch sein — sonst scheitern Uploads an der kleineren der beiden Grenzen, und die Fehlermeldung hilft nicht bei der Diagnose.

OPcache ist der wichtigste Performance-Hebel für PHP. Ohne OPcache wird jede PHP-Datei bei jedem Request neu kompiliert. Mit OPcache wird der kompilierte Bytecode im Speicher gehalten. validate_timestamps auf 1 bedeutet, dass PHP alle zwei Sekunden prüft, ob sich eine Datei geändert hat — sinnvoll für Entwicklungsserver. Auf einem Produktionsserver kannst du das auf 0 setzen und den OPcache manuell leeren, wenn du deployest.

sudo systemctl restart php8.3-fpm

nginx mit PHP-FPM verbinden

nginx weiß noch nicht, was es mit PHP-Dateien tun soll. Du musst ihm mitteilen, dass er PHP-Anfragen an den FPM-Socket weiterleiten soll. Öffne deinen Server-Block und füge den location-Block für PHP hinzu:

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_read_timeout 300;
}

Die Verbindung läuft über einen Unix-Socket statt über einen TCP-Port. Sockets sind schneller, weil sie den gesamten Netzwerk-Stack umgehen — die Kommunikation bleibt innerhalb des Betriebssystems. fastcgi_read_timeout setzt du auf 300 Sekunden, passend zum max_execution_time in der php.ini — sonst bricht nginx die Verbindung ab, bevor PHP fertig ist.

sudo nginx -t && sudo systemctl reload nginx

Teste die Verbindung mit einer temporären phpinfo()-Datei. Lösche sie sofort nach dem Test — die phpinfo-Seite zeigt sensible Informationen über deinen Server, die ein Angreifer nutzen kann.

echo "<?php phpinfo();" | sudo tee /var/www/[deine-domain.de]/public/info.php
# Aufrufen: https://[deine-domain.de]/info.php — dann sofort löschen:
sudo rm /var/www/[deine-domain.de]/public/info.php

Die Basis steht

Dein Server hat jetzt alles, was Shopware und WordPress brauchen: Webserver, Datenbank und PHP-Interpreter mit den richtigen Modulen und optimierten Einstellungen. Das ist kein zusammengeklicktes Hosting-Panel — das ist ein Setup, das du verstehst, kontrollierst und reproduzieren kannst. Im letzten Teil kümmern wir uns um Backups und Monitoring.

Die gezeigten Code-Beispiele dienen zur Veranschaulichung. Nutzung auf eigene Verantwortung. Mehr dazu