linux-ubuntu-debian webserver nginx postgresql php lemp

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