HTTP/2 ist der Nachfolger von HTTP/1.1 und bietet signifikante Performance-Verbesserungen. Die Aktivierung ist einfach und bringt sofortige Vorteile.

Was ist HTTP/2?

HTTP/2 wurde 2015 standardisiert und löst viele Probleme von HTTP/1.1:

Vergleich HTTP/1.1 vs. HTTP/2

| Eigenschaft | HTTP/1.1 | HTTP/2 | |-------------|----------|--------| | Verbindungen | Mehrere parallel | Eine multiplexed | | Header | Klartext, wiederholt | Komprimiert (HPACK) | | Laden | Sequentiell | Parallel | | Server Push | Nein | Ja | | Binär/Text | Text | Binär |

Hauptvorteile

Multiplexing:

HTTP/1.1:
Verbindung 1: ──[Datei A]──[Datei B]──[Datei C]──
Verbindung 2: ──[Datei D]──[Datei E]──
(Blockierung, wenn eine Datei langsam)

HTTP/2:
Verbindung: ═[A]═[B]═[D]═[C]═[E]═
(Alle Dateien parallel auf einer Verbindung)

Header-Komprimierung:

  • HTTP/1.1 sendet Header bei jeder Anfrage komplett
  • HTTP/2 komprimiert und cacht Header (HPACK)
  • Besonders effektiv bei vielen kleinen Anfragen

Server Push:

Browser: Anfrage für index.html
Server:  Sendet index.html
         + pusht style.css (ohne Anfrage)
         + pusht script.js (ohne Anfrage)

Voraussetzungen

HTTPS erforderlich

HTTP/2 funktioniert in allen Browsern nur mit HTTPS:

# SSL-Zertifikat prüfen
openssl s_client -connect example.com:443 -servername example.com

Falls noch kein SSL: Let's Encrypt einrichten.

Server-Version prüfen

# Apache
apache2 -v

# Nginx
nginx -v

Mindestversionen:

  • Apache 2.4.17+
  • Nginx 1.9.5+

HTTP/2 mit Nginx aktivieren

Schritt 1: Nginx-Version prüfen

nginx -v
# nginx version: nginx/1.24.0

# Mit HTTP/2-Support kompiliert?
nginx -V 2>&1 | grep http_v2
# --with-http_v2_module

Schritt 2: Konfiguration anpassen

# /etc/nginx/sites-available/example.com

server {
    listen 443 ssl http2;  # http2 hinzufügen
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL-Einstellungen
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    root /var/www/example.com;
    index index.html;
}

Schritt 3: Testen und neu laden

nginx -t
systemctl reload nginx

HTTP/2 mit Apache aktivieren

Schritt 1: Module aktivieren

# HTTP/2 Modul aktivieren
a2enmod http2

# SSL muss aktiviert sein
a2enmod ssl

Schritt 2: Konfiguration anpassen

# /etc/apache2/sites-available/example.com-ssl.conf

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com

    # HTTP/2 aktivieren
    Protocols h2 http/1.1

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>

Schritt 3: PHP-FPM verwenden (wichtig!)

Apache HTTP/2 funktioniert nicht mit mod_php. Wechseln Sie zu PHP-FPM:

# mod_php deaktivieren
a2dismod php8.2

# PHP-FPM aktivieren
a2enmod proxy_fcgi setenvif
a2enconf php8.2-fpm

# Apache neu starten
systemctl restart apache2

Schritt 4: Testen

apachectl configtest
systemctl reload apache2

HTTP/2 prüfen

Browser-Entwicklertools

1. DevTools öffnen (F12) 2. Network-Tab 3. Spalte "Protocol" einblenden 4. Seite neu laden 5. "h2" sollte angezeigt werden

Kommandozeile

# Mit curl
curl -I --http2 -s https://example.com | grep HTTP
# HTTP/2 200

# Detailliert
curl -I --http2 -v https://example.com 2>&1 | grep -i "http/2"

# Verbindungsdetails
curl -w "HTTP Version: %{http_version}\n" -o /dev/null -s https://example.com

Online-Tools

  • KeyCDN HTTP/2 Test: https://tools.keycdn.com/http2-test
  • HTTP/2 Check von Cloudflare

HTTP/2 Server Push (Nginx)

Grundlegende Push-Konfiguration

location / {
    root /var/www/html;

    # CSS und JS vorausladen
    http2_push /css/style.css;
    http2_push /js/script.js;
}

Dynamisches Push

location = /index.html {
    http2_push /css/style.css;
    http2_push /js/app.js;
    http2_push /images/logo.png;
}

Push deaktivieren

# Global deaktivieren
http2_push off;

# Oder per Location
location /api/ {
    http2_push off;
}

Push-Hinweis: Vorsicht!

Server Push kann kontraproduktiv sein wenn:

  • Dateien bereits im Browser-Cache sind
  • Zu viele Ressourcen gepusht werden
  • Ressourcen nicht auf allen Seiten benötigt werden

Empfehlung: Testen Sie mit und ohne Push und messen Sie die Ladezeiten.

SSL/TLS-Optimierung für HTTP/2

Moderne Cipher-Konfiguration

# Nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

# Session-Caching
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# Apache
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionCache "shmcb:logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

OCSP Stapling

# Nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

HTTP/3 (QUIC) - Ausblick

HTTP/3 basiert auf QUIC (UDP statt TCP) und bietet weitere Verbesserungen:

# Nginx mit QUIC (ab 1.25.0)
server {
    listen 443 quic;
    listen 443 ssl;

    ssl_certificate ...;
    ssl_certificate_key ...;

    # HTTP/3 ankündigen
    add_header Alt-Svc 'h3=":443"; ma=86400';
}

HTTP/3 ist noch nicht überall unterstützt, HTTP/2 ist der aktuelle Standard.

Performance-Vergleich

Vorher messen (HTTP/1.1)

# Ladezeit messen
curl -w "Time: %{time_total}s\n" -o /dev/null -s https://example.com

# Oder mit siege
siege -c 10 -t 30s https://example.com

Nach HTTP/2-Aktivierung erneut messen

Typische Verbesserungen:

  • 10-50% schnellere Ladezeiten
  • Besonders bei Seiten mit vielen Ressourcen
  • Deutliche Verbesserung bei hoher Latenz

Troubleshooting

HTTP/2 funktioniert nicht

# Nginx-Module prüfen
nginx -V 2>&1 | grep http_v2

# Apache-Module prüfen
apache2ctl -M | grep http2

# SSL prüfen
curl -I https://example.com
# Muss HTTPS sein!

Apache: "AH02261: worker already present"

PHP-FPM statt mod_php verwenden (siehe oben).

Performance-Probleme

# Nginx: Limits anpassen
http2_max_concurrent_streams 128;
http2_max_requests 1000;

Browser zeigt immer noch HTTP/1.1

  • Browser-Cache leeren
  • HTTPS-Redirect prüfen
  • Server-Konfiguration neu laden

Checkliste

□ HTTPS aktiv
□ Webserver-Version ausreichend
□ HTTP/2-Modul aktiviert
□ Konfiguration angepasst
□ Bei Apache: PHP-FPM statt mod_php
□ SSL-Konfiguration optimiert
□ Konfiguration getestet (nginx -t / apachectl configtest)
□ Server neu geladen
□ HTTP/2 in Browser DevTools verifiziert

Fazit

HTTP/2 bietet messbare Performance-Vorteile bei minimalem Aufwand. Die Aktivierung erfordert HTTPS und eine kleine Konfigurationsänderung. Für Apache ist der Wechsel zu PHP-FPM notwendig. Server Push sollte mit Bedacht eingesetzt werden. Nach der Aktivierung messen Sie die Verbesserungen mit realen Tests.