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_statusaktivieren und via Prometheus exporter abfragen. - MySQL: Tool
mysqltuner.plnutzen, um Verbesserungsvorschläge zu erhalten. - PHP: Slow-Log aktivieren, um Scripts zu finden, die länger als 2 Sekunden brauchen.
request_slowlog_timeout = 2sin derwww.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 |