linux-rhel-centos-fedora webserver nginx rhel selinux performance

Nginx on RHEL: Enterprise Setup & Hardening (Artikel 098)

Konfiguration von Nginx unter RHEL. Erfahren Sie die Nutzung von Application Streams für verschiedene Nginx-Versionen und die perfekte Absicherung mittels SELinux.

# Nginx on RHEL: High-Performance Web-Serving im Enterprise

TL;DR / Management Summary Während Apache (httpd) der Klassiker unter RHEL ist, hat Nginx als moderner, ressourcensparender Webserver und Reverse Proxy massiv an Bedeutung gewonnen. Red Hat liefert Nginx über Application Streams aus, was es erlaubt, zwischen stabilen und aktuelleren Versionen zu wählen. Der entscheidende Teil bei Nginx auf RHEL ist – wie bei httpd – die korrekte SELinux-Konfiguration, damit Sockets und Proxy-Verbindungen nicht blockiert werden.


# 1. Einführung & Architektur

Die Nginx-Struktur in RHEL.

Nginx unter RHEL folgt weitgehend dem Standard-Layout, ist aber stark in das Service-Management integriert.

# Die Komponenten (Mermaid)

graph TD
    A[DNF AppStream: nginx] --> B[Master Config: /etc/nginx/nginx.conf]
    B --> C[Module: /usr/lib64/nginx/modules/]
    B --> D[vHosts: /etc/nginx/conf.d/*.conf]
    D --> E[Default Content: /usr/share/nginx/html]
    E --> F[SELinux Policy: httpd_t]

# 2. Installation via AppStream

Die richtige Version wählen.

RHEL bietet verschiedene Versionen von Nginx an.

# Verfügbare Versionen anzeigen
dnf module list nginx

# Bestimmten Stream aktivieren (z.B. mainline für neueste Features)
sudo dnf module enable nginx:mainline

# Installieren
sudo dnf install nginx
sudo systemctl enable --now nginx

# 3. SELinux & Nginx: Proxy & Sockets

Den Tunnel freischalten.

Nginx wird oft als Reverse Proxy genutzt. Standardmäßig verbietet SELinux dem Webserver-Kontext (httpd_t), Netzwerkverbindungen aufzubauen.

# Netzwerk-Proxy erlauben

# Unverzichtbar für Nginx als Proxy!
sudo setsebool -P httpd_can_network_connect on

# Sockets und Ports

Wenn Nginx auf einem Unix-Socket (z.B. von Gunicorn oder PHP-FPM) lauscht, muss dieser den richtigen Kontext haben:

sudo chcon -t httpd_sys_content_rw_t /run/myapp.sock

# 4. Day-2 Operations: Virtual Hosts & Hardening

Saubere Konfiguration.

Nutzen Sie in RHEL konsequent den Ordner /etc/nginx/conf.d/ für Ihre Applikationen.

# Beispiel: Gehärteter vHost

server {
    listen 80;
    server_name www.company.com;

    # Sicherheit: Keine Server-Version verraten
    server_tokens off;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }

    # Logging nach RHEL Standard
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
}

# 5. Troubleshooting & “War Stories”

Wenn der Proxy schweigt.

# Story 1: “Permission Denied auf Sockets”

Symptom: Nginx liefert “502 Bad Gateway”. Im Error-Log steht (13: Permission denied) while connecting to upstream. Ursache: Entweder fehlen die Dateiberechtigungen (chmod) oder der SELinux-Kontext des Sockets passt nicht zum Typ httpd_t. Lösung: Prüfen Sie mit ls -Z. Falls der Typ falsch ist, nutzen Sie semanage fcontext und restorecon.

# Story 2: “Das volle Log-Verzeichnis”

Symptom: Nginx startet nicht mehr, weil /var/log/nginx voll ist. Ursache: Standard-RHEL Logrotation ist für High-Traffic-Seiten oft zu träge konfiguriert. Lösung: Passen Sie /etc/logrotate.d/nginx an und nutzen Sie daily statt weekly mit einer höheren Anzahl an Vorhaltungen.


# 6. Fazit & Empfehlung

  • Versionen: Prüfen Sie regelmäßig mit dnf module list nginx, ob ein neuerer Stream verfügbar ist.
  • Performance: Nutzen Sie worker_processes auto; und stellen Sie sicher, dass sendfile on; aktiviert ist (RHEL Standard).
  • Sicherheit: Lassen Sie SELinux immer an. Die Booleans und Labels sind schnell gesetzt und schützen Ihre Infrastruktur massiv.

# Anhang: Cheatsheet

Aufgabe RHEL Befehl
Config testen nginx -t
Sanfter Reload nginx -s reload
Modul-Version wechseln dnf module switch-to nginx:<version>
Firewall Port 80/443 firewall-cmd --add-service={http,https}
Logs live tail -f /var/log/nginx/error.log