Magento-Server-Anforderungen unter Linux richtig konfigurieren
$
/etc
Linux · Magento 2 · PHP · Server-Administration
Magento-Server-Anforderungen unter Linux richtig konfigurieren
vom Anforderungskatalog zur laufenden Produktionsumgebung

Die offizielle Magento-Systemanforderungsliste nennt nur Versionsnummern, doch dazwischen liegt viel Konfigurationsarbeit auf dem Linux-Server. Dieser Beitrag uebersetzt PHP-Extensions, memory_limit, OpenSearch, Redis und Varnish in konkrete Befehle und Konfigurationsdateien und liefert eine Pre-Flight-Checkliste, die Setup-Fehler vor dem ersten Deployment verhindert.

17 Min. Lesezeit PHP 8.3 · OpenSearch · Redis · Varnish Magento 2.4.8 · Ubuntu/Debian · Nginx

1. Warum die offizielle Anforderungsliste nur der Anfang ist

Die Magento-Systemanforderungen in der offiziellen Dokumentation lesen sich wie eine kurze Einkaufsliste: PHP 8.1 bis 8.3, MySQL 8.0 oder MariaDB 10.6, OpenSearch 2.x, Redis empfohlen, Composer 2.x. Was dort fehlt, ist die eigentliche Arbeit: Wie viele PHP-Worker braucht ein FPM-Pool bei typischer Shop-Last, welche Kernel-Limits verhindern, dass OpenSearch beim Indexieren abstuerzt, und welche Redis-Instanz uebernimmt welche Aufgabe. Wer die Anforderungsliste wortwoertlich als Installationsanleitung versteht, landet oft bei einem Server, der zwar alle Versionschecks besteht, aber unter echter Last in die Knie geht.

Der Unterschied zwischen einer bestandenen bin/magento setup:install-Ausfuehrung und einem produktionstauglichen Server liegt in Dutzenden kleinen Konfigurationsentscheidungen: PHP-Extensions mit den richtigen Kompilierungsoptionen, ein memory_limit, das zur tatsaechlichen Katalogsgroesse passt, ein OpenSearch-Cluster mit ausreichend Heap-Speicher und ein Reverse Proxy, der Magentos Full Page Cache tatsaechlich entlastet. Die folgenden Abschnitte uebersetzen jeden Punkt der offiziellen Liste in konkrete Linux-Konfiguration, mit echten Befehlen und pruefbaren Werten.

2. PHP-Version und Extensions korrekt installieren

Magento 2.4.8 verlangt PHP 8.3 (mit Support für 8.2 auf aelteren Patch-Leveln), und die Liste der Pflicht-Extensions ist laenger als viele Standardinstallationen mitbringen: bcmath, ctype, curl, dom, gd oder imagick, intl, mbstring, openssl, pdo_mysql, simplexml, soap, sodium, xsl und zip. Auf Debian/Ubuntu-Systemen mit dem Ondrej-Sury-PPA lassen sich alle Pakete in einem Rutsch installieren, doch sodium und intl werden erfahrungsgemaess am haeufigsten vergessen, weil sie in minimalen PHP-Images standardmaessig fehlen.

Nach der Installation lohnt sich immer eine Gegenprobe mit php -m gegen die Anforderungsliste, statt sich auf das Setup-Wizard-Ergebnis zu verlassen, denn der Wizard bricht teils erst mitten im Installationsprozess ab. Auch die PHP-CLI und der PHP-FPM-Pool müssen dieselben Extensions laden: Ein haeufiger Fehler ist eine php.ini für CLI, die von der FPM-Konfiguration abweicht, wodurch Cronjobs mit anderen Werten laufen als der Webserver. Composer selbst benoetigt zusaetzlich Git und Zip auf Betriebssystemebene, nicht nur als PHP-Extension.


#!/usr/bin/env bash
# Install PHP 8.3 and all required extensions for Magento 2.4.8 on Ubuntu
set -euo pipefail

sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update

sudo apt-get install -y \
  php8.3-fpm php8.3-cli \
  php8.3-bcmath php8.3-curl php8.3-gd php8.3-intl \
  php8.3-mbstring php8.3-mysql php8.3-soap php8.3-sodium \
  php8.3-xml php8.3-xsl php8.3-zip php8.3-opcache php8.3-igbinary \
  php8.3-redis php8.3-imagick

# Verify all Magento-required extensions are actually loaded
required=(bcmath ctype curl dom gd intl mbstring openssl pdo_mysql simplexml soap sodium xsl zip)
for ext in "${required[@]}"; do
  php -m | grep -qi "^${ext}$" || echo "[MISSING] ${ext}"
done

php -v

3. memory_limit, OPcache und PHP-FPM-Tuning

Magento empfiehlt offiziell mindestens 2 GB memory_limit, doch dieser Wert reicht bei bin/magento indexer:reindex oder Composer-Operationen auf groesseren Katalogen nicht aus. In der Praxis setzen wir memory_limit = 4G für CLI-Kontexte und lassen den Wert für den FPM-Pool bewusst niedriger, da hier viele parallele Worker gleichzeitig Speicher belegen und ein zu hoher Wert den Server bei einem Traffic-Spike in Swap treiben kann. Getrennte php.ini-Overrides pro SAPI (/etc/php/8.3/cli/conf.d/ versus /etc/php/8.3/fpm/conf.d/) sind hier das korrekte Muster, nicht eine globale Datei für beide Kontexte.

OPcache ist für Magento nicht optional, sondern Pflicht: Ohne kompilierten Bytecode-Cache dauert jeder Request durch die vielen tausend Klassen des Frameworks spuerbar laenger. opcache.memory_consumption=512 und opcache.max_accelerated_files=60000 sind realistische Startwerte für einen mittelgrossen Katalog, wobei max_accelerated_files immer über der tatsaechlichen PHP-Dateianzahl liegen muss, sonst rotiert der Cache staendig neu. Beim PHP-FPM-Pool bestimmt pm.max_children zusammen mit dem verfuegbaren RAM die maximale gleichzeitige Request-Last: Faustregel ist verfuegbarer RAM geteilt durch den durchschnittlichen Speicherverbrauch eines PHP-Prozesses unter Last, typischerweise 80 bis 150 MB pro Worker bei Magento.


; /etc/php/8.3/fpm/pool.d/magento.conf - PHP-FPM pool tuned for Magento 2
[magento]
user = magento
group = magento
listen = /run/php/php8.3-fpm-magento.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 6
pm.max_spare_servers = 12
pm.max_requests = 500

; FPM workers stay below CLI limit to avoid pushing the host into swap
php_admin_value[memory_limit] = 1G
php_admin_value[max_execution_time] = 120
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M

; opcache tuning - shared across CLI and FPM via /etc/php/8.3/conf.d/10-opcache.ini
; opcache.memory_consumption=512
; opcache.max_accelerated_files=60000
; opcache.validate_timestamps=0  ; production only, requires manual reload on deploy

4. Datenbank: MySQL/MariaDB-Konfiguration für Magento

Magento 2.4.8 unterstuetzt MySQL 8.0.x und MariaDB 10.6 LTS, wobei die InnoDB-Engine und die Zeichensatzkonfiguration utf8mb4 zwingend vorausgesetzt werden. Ein haeufig uebersehener Konfigurationswert ist innodb_buffer_pool_size, der auf einem dedizierten Datenbankserver etwa 60 bis 70 Prozent des verfuegbaren RAM betragen sollte, da Magentos EAV-Datenmodell viele kleine Joins erzeugt, die stark vom InnoDB-Bufferpool profitieren. Ohne ausreichenden Bufferpool zeigt sich das Problem meist zuerst bei der Kategorieseiten-Performance, lange bevor es im Checkout auffaellt.

max_connections muss zur Anzahl der PHP-FPM-Worker plus Cron-Prozessen plus Admin-Sessions passen, da Magento pro aktivem Request typischerweise eine eigene Datenbankverbindung haelt. Ein Wert von 40 pm.max_children plus Cron-Parallelitaet plus Reserve landet schnell bei max_connections = 200 oder mehr. Zusaetzlich sollte sql_mode keine der von Magento explizit inkompatiblen Strict-Modes wie STRICT_TRANS_TABLES zusammen mit bestimmten Legacy-Modulen aktivieren, ohne vorher die Kompatibilitaet mit allen installierten Extensions geprueft zu haben.

5. OpenSearch/Elasticsearch als Suchindex einrichten

Seit Magento 2.4.4 ist ein externer Suchindex über OpenSearch oder Elasticsearch Pflicht, MySQL-basierte Suche wird nicht mehr unterstuetzt. Magento 2.4.8 verlangt konkret OpenSearch 2.5 bis 2.19 oder Elasticsearch 8.11, wobei OpenSearch inzwischen die empfohlene Variante ist, da Elastic die Lizenz mehrfach geaendert hat. Der haeufigste Fehler beim Erststart: vm.max_map_count ist auf Standard-Linux-Systemen mit 65530 zu niedrig für die von OpenSearch verwendeten mmap-basierten Indizes und muss dauerhaft auf mindestens 262144 gesetzt werden, sonst crasht der Service beim Hochfahren mit einer kryptischen Fehlermeldung über virtuellen Speicher.

Der JVM-Heap von OpenSearch sollte nie mehr als 50 Prozent des verfuegbaren RAM und niemals mehr als 31 GB betragen, da die JVM oberhalb dieser Grenze die Compressed-Oops-Optimierung verliert und die effektive Heap-Nutzung ineffizienter wird. bin/magento indexer:reindex catalogsearch_fulltext ist der Befehl, mit dem sich nach der Konfiguration pruefen laesst, ob die Verbindung tatsaechlich steht, bevor der erste echte Produktimport laeuft.


# /etc/opensearch/opensearch.yml - single-node setup for a Magento store
cluster.name: magento-search
node.name: magento-search-01
network.host: 127.0.0.1
http.port: 9200
discovery.type: single-node

# Security plugin disabled for internal-only access behind firewall
plugins.security.disabled: true

# Heap size set separately in jvm.options: -Xms4g -Xmx4g (never above 50% of RAM)
bootstrap.memory_lock: true

#!/usr/bin/env bash
# Persist vm.max_map_count so OpenSearch survives a reboot
set -euo pipefail

echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-opensearch.conf
sudo sysctl -p /etc/sysctl.d/99-opensearch.conf

# Connect Magento to the local OpenSearch instance
bin/magento config:set catalog/search/engine opensearch
bin/magento config:set catalog/search/opensearch_server_hostname 127.0.0.1
bin/magento config:set catalog/search/opensearch_server_port 9200
bin/magento indexer:reindex catalogsearch_fulltext

6. Redis für Cache, Session und Full Page Cache

Magento kann Backend-Cache, Sessions und Full Page Cache alle drei über Redis abwickeln, doch die offizielle Empfehlung, dafuer separate Redis-Datenbanken oder besser separate Instanzen zu nutzen, wird in der Praxis oft ignoriert. Der Grund für die Trennung: Ein FLUSHALL oder ein Memory-Eviction-Ereignis in der Session-Datenbank darf niemals gleichzeitig den Full Page Cache leeren, sonst verlieren alle aktiven Nutzer gleichzeitig ihre Warenkoerbe und der Server bekommt einen Cache-Miss-Sturm auf einmal. Redis 7.x wird von Magento 2.4.8 offiziell unterstuetzt, wobei maxmemory-policy allkeys-lru für Cache-Instanzen sinnvoll ist, für die Session-Instanz dagegen noeviction, damit aktive Sessions nie stillschweigend geloescht werden.

Die PHP-Extension redis (nicht die reine predis-Bibliothek) sollte installiert sein, da sie deutlich performanter serialisiert, besonders in Kombination mit igbinary als Serialisierungsformat. In env.php wird jede Redis-Rolle mit eigener database-Nummer und eigenem port oder eigener Instanz konfiguriert, was Monitoring und Kapazitaetsplanung deutlich vereinfacht, weil sich Cache-Hitrate und Session-Last getrennt beobachten lassen.


#!/usr/bin/env bash
# Configure three separate Redis roles for Magento via bin/magento CLI
set -euo pipefail

# Backend cache (database 0)
bin/magento setup:config:set \
  --cache-backend=redis \
  --cache-backend-redis-server=127.0.0.1 \
  --cache-backend-redis-db=0 \
  --cache-backend-redis-port=6379

# Full Page Cache (database 1) - separate from backend cache on purpose
bin/magento setup:config:set \
  --page-cache=redis \
  --page-cache-redis-server=127.0.0.1 \
  --page-cache-redis-db=1 \
  --page-cache-redis-port=6379

# Sessions (database 2) - noeviction policy required, never share with cache
bin/magento setup:config:set \
  --session-save=redis \
  --session-save-redis-host=127.0.0.1 \
  --session-save-redis-db=2 \
  --session-save-redis-port=6379

7. Varnish als HTTP-Accelerator vor Magento

Magento liefert einen eingebauten Full Page Cache, doch dieser laeuft weiterhin durch den PHP-Prozess und ist damit deutlich langsamer als ein davorgeschalteter Varnish-Reverse-Proxy, der gecachte Seiten direkt aus dem RAM ausliefert, ohne PHP ueberhaupt zu starten. Magento 2.4.8 unterstuetzt offiziell Varnish 7.5 und 7.6, und die von Magento generierte VCL-Konfiguration (bin/magento varnish:vcl:generate) deckt bereits die wichtigsten Header-Regeln für Cache-Invalidierung ab, muss aber immer an die tatsaechliche Domain- und Backend-Konfiguration angepasst werden.

Ein zentraler Stolperstein: Der X-Magento-Cache-Debug-Header muss in der Produktion deaktiviert oder zumindest nicht oeffentlich sichtbar sein, während er während der Einrichtung unverzichtbar ist, um HIT/MISS-Verhalten pro Request zu verifizieren. Ebenso wichtig ist, dass der X-Forwarded-For-Header korrekt durchgereicht wird, sonst protokolliert Magento für alle Besucher dieselbe Varnish-IP, was sowohl Analytics als auch IP-basierte Sicherheitsregeln unbrauchbar macht.


#!/usr/bin/env bash
# Generate and deploy Varnish VCL for Magento 2.4.8
set -euo pipefail

bin/magento config:set system/full_page_cache/caching_application 2
bin/magento config:set system/full_page_cache/varnish/access_list "localhost,127.0.0.1"
bin/magento config:set system/full_page_cache/varnish/backend_host 127.0.0.1
bin/magento config:set system/full_page_cache/varnish/backend_port 8080

bin/magento varnish:vcl:generate --export-version=7.5 > /etc/varnish/default.vcl

# Verify HIT/MISS behaviour before removing the debug header in production
curl -sI https://shop.example.com/ | grep -i x-magento-cache

sudo systemctl restart varnish

8. Pre-Flight-Checkliste vor dem Deployment

Bevor bin/magento setup:install oder ein Produktions-Deployment ueberhaupt startet, lohnt sich eine feste Checkliste, die jeden Anforderungspunkt systematisch abhakt, statt sich auf das Bauchgefuehl zu verlassen. Diese Liste hat sich in der Praxis bewaehrt, weil sie genau die Stellen abdeckt, an denen Setups am haeufigsten scheitern: PHP-Extensions, Speicherlimits, Datenbankverbindung, Suchindex-Erreichbarkeit und Dateisystem-Berechtigungen für var/, pub/media/ und generated/.

Ein oft unterschaetzter Punkt ist die Dateisystem-Performance: Magento schreibt während eines Deployments zehntausende kleine Dateien in generated/code/ und pub/static/, und ein langsames Netzwerk-Dateisystem wie NFS ohne passende Mount-Optionen kann ein Deployment von wenigen Minuten auf mehr als eine Stunde verlaengern. Die Checkliste sollte deshalb auch einen kurzen dd-Schreibtest auf dem Zielverzeichnis enthalten, um grobe I/O-Probleme fruehzeitig zu erkennen, bevor sie in einem laufenden Deployment sichtbar werden.

Pruefpunkt Falsche Annahme Korrekte Vorgehensweise Effekt
PHP-Extensions Setup-Wizard startet, also passt alles php -m gegen offizielle Liste abgleichen Verhindert Abbruch mitten im Setup
memory_limit 2 GB reicht immer, laut Doku 4 GB für CLI bei groesseren Katalogen Kein Abbruch bei Reindex/Composer
OpenSearch Standard-vm.max_map_count reicht vm.max_map_count auf 262144 setzen Kein Crash beim Hochfahren
Redis-Rollen Eine DB für Cache, FPC und Session Getrennte DBs/Instanzen pro Rolle Kein gemeinsamer Cache-Flush
Dateisystem NFS ist wie lokale Disk I/O-Test vor Deployment durchfuehren Deployment-Zeit bleibt planbar

Mironsoft

Magento-Server-Setup, Linux-Administration und Deployment-Infrastruktur

Magento-Server, der von Tag eins an sauber laeuft?

Wir konfigurieren PHP, OpenSearch, Redis und Varnish für euren Magento-Shop nach den offiziellen Anforderungen und pruefen jeden Punkt der Pre-Flight-Checkliste, bevor das erste Deployment live geht.

Server-Audit

Abgleich der laufenden Konfiguration mit den offiziellen Magento-Anforderungen

Setup & Tuning

PHP-FPM, OpenSearch-Heap und Redis-Rollen produktionsreif konfigurieren

Deployment-Absicherung

Pre-Flight-Checks und Varnish-VCL in die Deploy-Pipeline integrieren

9. Haeufige Requirement-Mismatch-Fehler beim Setup

Der wohl haeufigste Fehler beim Magento-Setup ist eine falsche Zeichensatzkonfiguration der Datenbank: Wird die Datenbank mit utf8 statt utf8mb4 angelegt, schlaegt die Installation erst bei bestimmten Tabellen mit langen Indizes fehl, oft weit nach dem ersten erfolgreichen Schritt. Ein zweiter Klassiker ist eine PHP-Version, die zwar formal im unterstuetzten Bereich liegt, aber als veraltetes Patch-Release bekannte Inkompatibilitaeten mit Magentos Composer-Dependencies hat, was sich erst bei composer install mit kryptischen Versions-Constraint-Fehlern zeigt.

Ein dritter wiederkehrender Fehler betrifft Dateisystem-Berechtigungen: Wird var/, pub/media/ oder generated/ nicht dem PHP-FPM-Benutzer gehoerend angelegt, schlagen Schreibvorgaenge erst beim ersten Cache-Flush oder Media-Upload fehl, nicht beim Setup selbst. Und ein vierter, besonders tueckischer Fehler: OpenSearch laeuft zwar, ist aber über einen falschen Port oder eine falsche Firewall-Regel nicht erreichbar, sodass setup:install zwar durchlaeuft, aber die Suche im laufenden Shop leere Ergebnisse liefert, bis jemand das Firewall-Log prueft.


{
  "_comment": "app/etc/env.php excerpt - common mismatch: db table_prefix and utf8mb4 charset",
  "db": {
    "connection": {
      "default": {
        "host": "127.0.0.1",
        "dbname": "magento",
        "username": "magento",
        "password": "REPLACE_ME",
        "model": "mysql4",
        "engine": "innodb",
        "initStatements": "SET NAMES utf8mb4;",
        "active": "1",
        "driver_options": {
          "1013": "utf8mb4"
        }
      }
    }
  },
  "cache_types": {
    "config": 1,
    "layout": 1,
    "block_html": 1,
    "full_page": 1
  }
}

10. Zusammenfassung

Die Magento-Server-Anforderungen unter Linux sind kein einmaliger Versionscheck, sondern ein Zusammenspiel aus PHP-Extensions, Speicherlimits, Datenbankkonfiguration, Suchindex und Caching-Diensten, das nur als Ganzes funktioniert. PHP 8.3 mit allen Pflicht-Extensions und getrennten CLI-/FPM-Konfigurationen bildet das Fundament, memory_limit und OPcache bestimmen die Performance unter Last, und OpenSearch mit korrektem vm.max_map_count verhindert Crashes beim Indexieren. Redis in drei getrennten Rollen und Varnish als vorgeschalteter Accelerator entlasten den PHP-Prozess spuerbar.

Der größte Hebel liegt in der systematischen Pre-Flight-Checkliste vor jedem Deployment: Wer PHP-Extensions, Zeichensatz, Dateisystem-Berechtigungen und Suchindex-Erreichbarkeit vor dem ersten setup:install prueft, vermeidet die typischen Requirement-Mismatch-Fehler, die sonst erst mitten im Betrieb sichtbar werden. Eine einmal aufgesetzte Checkliste laesst sich für jedes weitere Deployment wiederverwenden und automatisieren.

Magento-Server-Anforderungen unter Linux - Das Wichtigste auf einen Blick

PHP korrekt einrichten

PHP 8.3 mit allen Pflicht-Extensions, getrennte php.ini für CLI und FPM, OPcache immer aktiv.

Speicher & Datenbank

memory_limit 4G für CLI, utf8mb4 als Zeichensatz, innodb_buffer_pool_size passend zum RAM.

OpenSearch & Redis

vm.max_map_count auf 262144, Redis in drei getrennten Rollen für Cache, FPC und Session.

Pre-Flight-Checkliste

PHP-Extensions, Berechtigungen und Suchindex vor jedem Deployment systematisch pruefen.

11. FAQ: Magento-Server-Anforderungen unter Linux

1Welche PHP-Version braucht Magento 2.4.8 unter Linux?
PHP 8.3 mit eingeschraenkter Unterstuetzung für 8.2. Pflicht-Extensions unter anderem bcmath, curl, gd/imagick, intl, mbstring, pdo_mysql, soap, sodium, xsl, zip. Abgleich mit php -m durchfuehren.
2Reicht memory_limit von 2 GB für Magento aus?
2 GB ist der Mindestwert, reicht aber bei groesseren Katalogen für Reindex oder Composer oft nicht. 4 GB für CLI empfohlen, FPM-Pool bewusst niedriger halten.
3Warum crasht OpenSearch beim ersten Start?
Zu niedriger vm.max_map_count. Standardwert 65530 reicht nicht, dauerhaft per sysctl auf mindestens 262144 setzen.
4Gemeinsame Redis-Instanz für Cache, Session und FPC?
Nein. Separate Datenbanken oder Instanzen pro Rolle, sonst reisst ein FLUSHALL oder Eviction-Ereignis alle drei Bereiche gleichzeitig mit.
5Ist Varnish notwendig oder reicht der eingebaute FPC?
Der eingebaute FPC laeuft durch PHP und ist langsamer. Varnish liefert direkt aus dem RAM und ist für produktive Shops mit Traffic der empfohlene Standard.
6Welche MySQL/MariaDB-Version unterstuetzt Magento 2.4.8?
MySQL 8.0.x und MariaDB 10.6 LTS, jeweils mit InnoDB und utf8mb4. Falscher Zeichensatz fuehrt spaeter zu Installationsfehlern bei langen Indizes.
7Wie viele PHP-FPM-Worker braucht ein Magento-Shop?
Faustregel: verfuegbarer RAM geteilt durch 80 bis 150 MB pro Worker. pm.max_children muss zusaetzlich zu max_connections in der Datenbank passen.
8Haeufigster Requirement-Mismatch-Fehler beim Setup?
Falscher Datenbank-Zeichensatz utf8 statt utf8mb4, gefolgt von falschen Dateisystem-Berechtigungen für var/, pub/media/ und generated/.
9Wie pruefe ich vor Deployment systematisch alle Anforderungen?
Feste Pre-Flight-Checkliste: PHP-Extensions per php -m, Speicherlimits, Datenbankverbindung, OpenSearch-Erreichbarkeit per curl, Dateisystem-Berechtigungen vor setup:install pruefen.
10Warum liefert die Suche keine Ergebnisse trotz erfolgreichem Setup?
Meist ein falsch konfigurierter Port oder eine Firewall-Regel, die OpenSearch für PHP unerreichbar macht. indexer:reindex catalogsearch_fulltext deckt das sofort auf.