linux-ubuntu-debian webserver apache mysql php lamp

LAMP Stack: Setup & Enterprise Tuning (Artikel 031)

Installation und Optimierung des klassischen LAMP-Stacks. Performance-Tuning für High-Traffic-Umgebungen, PHP-FPM Konfiguration und MySQL-Absicherung.

# LAMP Stack Deep Dive: Performance für Web-Workloads

TL;DR / Management Summary Der LAMP-Stack (Linux, Apache, MySQL, PHP) ist das Fundament von Millionen Webseiten. Für Enterprise-Umgebungen reicht ein Standard-Install nicht aus. Wir setzen auf PHP-FPM statt Mod_PHP für bessere Performance, nutzen OpCache zur Beschleunigung von PHP-Scripts und optimieren den MySQL Buffer Pool, um Disk-I/O zu minimieren. Das Ziel: Ein stabiler, skalierbarer und sicherer Web-Stack.


# 1. Einführung & Architektur

Wie die Komponenten zusammenarbeiten.

Früher lief PHP als Modul innerhalb von Apache (mod_php). Heute ist der Goldstandard die Trennung von Webserver und Prozess-Manager.

# Architektur-Übersicht (Mermaid)

graph LR
    A[Client: Browser] -->|HTTP/HTTPS Port 443| B[Apache Webserver]
    B -->|FastCGI Proxy| C[PHP-FPM Process Pool]
    C -->|PHP Execution| D[OPCache RAM]
    C -->|SQL Query| E[MySQL / MariaDB]
    E -->|Data| C
    C -->|HTML Output| B
    B -->|Response| A

# 2. Installation & Grundsetup

Sauber und strukturiert.

# Pakete installieren

Wir nutzen MariaDB als modernen Ersatz für MySQL.

sudo apt update
sudo apt install apache2 mariadb-server php-fpm php-mysql libapache2-mod-fcgid

# Apache auf PHP-FPM umstellen

# Module aktivieren
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm # Version anpassen!
sudo a2dismod php8.1     # Mod_PHP deaktivieren
sudo systemctl restart apache2

# 3. Deep Dive: Performance Tuning

Wo wir die Millisekunden herholen.

# PHP-FPM Optimierung

Datei: /etc/php/8.1/fpm/pool.d/www.conf Wechseln Sie von dynamic auf static, wenn der Server nur für diese App da ist.

pm = static
pm.max_children = 50
pm.max_requests = 500

# PHP OpCache (RAM Speed)

Datei: /etc/php/8.1/fpm/php.ini

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000

# MySQL / MariaDB Tuning

Wichtigster Parameter: innodb_buffer_pool_size. Er sollte ca. 70-80% des verfügbaren RAMs einnehmen (wenn kein anderer Dienst läuft). Datei: /etc/mysql/mariadb.conf.d/50-server.cnf

innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2 # Schneller, leichtes Datenverlust-Risiko bei Stromausfall

# 4. Sicherheit & Hardening

Den Stack wasserdicht machen.

# MySQL Absicherung

sudo mysql_secure_installation
# Entfernt Test-User, verbietet Remote-Root und löscht Test-Datenbanken.

# Apache Hardening

Datei: /etc/apache2/conf-enabled/security.conf

ServerTokens Prod
ServerSignature Off
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"

# 5. Troubleshooting & “War Stories”

Wenn die Seite weiß bleibt (White Screen of Death).

# Story 1: “PHP-FPM Socket Exhaustion”

Symptom: Apache meldet “503 Service Unavailable”, obwohl die CPU-Last niedrig ist. Ursache: Zu viele Anfragen für zu wenige PHP-Worker. Lösung: pm.max_children erhöhen und prüfen, ob PHP-Prozesse hängen (z.B. durch langsame API-Aufrufe). Nutzen Sie php-fpm-status, um die Auslastung live zu sehen.

# Story 2: “MySQL hakt nach Reboot”

Symptom: Die Webseite ist nach einem Server-Reboot für 10 Minuten extrem langsam. Ursache: Der Buffer Pool ist leer (kalt). MySQL muss alle Daten erst mühsam von der Disk lesen. Lösung: Aktivieren Sie innodb_buffer_pool_dump_at_shutdown und innodb_buffer_pool_load_at_startup, damit MySQL den RAM-Inhalt zwischenspeichert.


# 6. Monitoring & Metriken

  • Apache: mod_status aktivieren und via Prometheus exporter abfragen.
  • MySQL: Tool mysqltuner.pl nutzen, um Verbesserungsvorschläge zu erhalten.
  • PHP: Slow-Log aktivieren, um Scripts zu finden, die länger als 2 Sekunden brauchen. request_slowlog_timeout = 2s in der www.conf.

# 7. Fazit & Empfehlung

  • Zukunftssicherheit: Nutzen Sie immer PHP-FPM.
  • Speicher: Sparen Sie nicht am RAM für den MySQL Buffer Pool.
  • Logs: Trennen Sie Access- und Error-Logs pro VirtualHost, um bei Fehlern nicht im Heuhaufen zu suchen.

# Anhang: Cheatsheet

Dienst Befehl
Config Test Apache apache2ctl configtest
Config Test PHP php-fpm8.1 -t
MySQL Status mysqladmin priority status
PHP Module listen php -m
Apache vHosts apache2ctl -S