LEMP Stack: Nginx & PostgreSQL (Artikel 032)
Setup des modernen LEMP-Stacks. Nginx Performance-Konfiguration, PostgreSQL-Integration und PHP-FPM Best Practices für hochperformante Web-Applikationen.
# LEMP Stack: Das Hochleistungs-Duo Nginx & PostgreSQL
TL;DR / Management Summary Während der LAMP-Stack der Klassiker ist, ist der LEMP-Stack (Linux, Nginx, PostgreSQL/MySQL, PHP) die Antwort auf moderne Anforderungen an Skalierbarkeit und Ressourcen-Effizienz. Nginx verarbeitet tausende parallele Verbindungen mit minimalem RAM-Verbrauch (Event-Driven), während PostgreSQL die erste Wahl für komplexe Datenstrukturen und ACID-Compliance ist. Ein Senior-Setup nutzt Nginx als Reverse-Proxy und PostgreSQL für höchste Datenintegrität.
# 1. Einführung & Architektur
Warum Nginx statt Apache?
Apache erstellt für jede Verbindung einen Thread oder Prozess. Nginx hingegen nutzt einen asynchronen Event-Loop. Ein einzelner Nginx-Worker kann zehntausende Verbindungen gleichzeitig halten.
# Architektur-Übersicht (Mermaid)
graph LR
A[Client] -->|HTTPS| B[Nginx Reverse Proxy]
B -->|Static Files| C[Local Disk]
B -->|FastCGI| D[PHP-FPM Pool]
D -->|SQL| E[PostgreSQL DB]
E -->|JSON/BSON/Tables| D
D -->|Dynamic HTML| B
B -->|Response| A
# 2. Installation & Nginx-Config
Sauberer Code für schnelles Web.
# Pakete installieren
sudo apt update
sudo apt install nginx postgresql postgresql-contrib php-fpm php-pgsql
# Der perfekte Nginx vHost (/etc/nginx/sites-available/myapp)
server {
listen 80;
server_name myapp.company.com;
root /var/www/myapp/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Security: Keine versteckten Dateien (.git, .env) ausliefern
location ~ /\.(?!well-known).* {
deny all;
}
}
# 3. PostgreSQL: Die Enterprise-Datenbank
Setup und Absicherung.
Im Gegensatz zu MySQL ist PostgreSQL ein Objekt-Relationales Datenbankmanagementsystem (ORDBMS).
# Erstes Setup & User
sudo -u postgres psql
# CREATE DATABASE myapp;
# CREATE USER myuser WITH PASSWORD 'strongpass';
# GRANT ALL PRIVILEGES ON DATABASE myapp TO myuser;
# Remote Zugriff erlauben (Vorsicht!)
Standardmäßig lauscht Postgres nur auf localhost.
Datei: /etc/postgresql/14/main/postgresql.conf
listen_addresses = '*'
Datei: /etc/postgresql/14/main/pg_hba.conf
host all all 10.0.0.0/24 scram-sha-256
# 4. Day-2 Operations: Performance & Caching
Das System ausreizen.
# Nginx Worker Tuning
Setzen Sie worker_processes auto; und erhöhen Sie worker_connections in der nginx.conf, um die CPU-Kerne optimal zu nutzen.
# FastCGI Micro-Caching
Nginx kann dynamische PHP-Antworten für wenige Sekunden zwischenspeichern, was die Last auf PHP-FPM bei Traffic-Spitzen massiv reduziert.
fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=MYAPP:100m inactive=60m;
# 5. Troubleshooting & “War Stories”
Wenn die Logs schreien.
# Story 1: “Postgres Connection Limit reached”
Symptom: PHP meldet “Could not connect to database: too many clients”.
Ursache: Jedes PHP-Script öffnet eine neue Verbindung, aber Postgres hat ein hartes Limit (max_connections = 100).
Lösung: Nutzen Sie einen Connection Pooler wie PgBouncer. Er bündelt tausende PHP-Verbindungen auf wenige echte Postgres-Verbindungen.
# Story 2: “Upstream sent too big header”
Symptom: Nginx liefert sporadisch HTTP 502 Bad Gateway. Ursache: Die Applikation (z.B. Laravel/Symfony) sendet zu große Header (Cookies/Session-Daten), die den Nginx-Puffer sprengen. Lösung: Puffer-Größen im vHost erhöhen:
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
# 6. Fazit & Empfehlung
- Modernität: LEMP ist der Standard für moderne Web-Frameworks (Node.js, Go, PHP 8+).
- Performance: Nginx schlägt Apache beim Ausliefern statischer Dateien (Bilder, JS, CSS) um Welten.
- Daten: Nutzen Sie PostgreSQL, wenn Sie JSON-Felder, komplexe Abfragen oder GIS-Daten benötigen.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Nginx Config prüfen | sudo nginx -t |
| Nginx Reload (ohne Drop) | sudo systemctl reload nginx |
| Postgres Status | sudo -u postgres pg_isready |
| Postgres Logs live | tail -f /var/log/postgresql/postgresql-14-main.log |
| PHP-FPM Log | tail -f /var/log/php8.1-fpm.log |