01.04.2023— 23:00 Uhr | Geschätzte Lesedauer: 8-9 Minuten

Einleitung

Was ist NGINX?

NGINX ist ein freier und quelloffener Webserver, der zum Hosten von Websites und Anwendungen jeder Größe verwendet wird. Die Software ist bekannt für ihre geringen Auswirkungen auf die Speicherressourcen, ihre hohe Skalierbarkeit und ihre modulare, ereignisgesteuerte Architektur, die eine sichere und vorhersehbare Leistung bietet. NGINX ist nicht nur ein Webserver, sondern auch ein Load Balancer, ein HTTP-Cache und ein Reverse Proxy.

In dieser Anleitung installierst du NGINX auf einem Debian 11-Server, passt die Firewall-Einstellungen an und lernst, wie du einige NGINX-Prozesse verwalten kannst.

Schritt 1 Installation von NGINX

NGINX ist in den Standard-Software-Repositories von Debian verfügbar, sodass du es mit herkömmlichen Paketverwaltungsprogrammen installieren kannst.

Aktualisiere zunächst deinen lokalen Paketindex, um die neuesten Upstream-Änderungen zu berücksichtigen:

sudo apt-get update
sudo apt-get upgrade -y # Upgraden, falls nötig

Installiere dann das nginx-Paket:

sudo apt install nginx -y

Schritt 2 Anpassung der Firewall

Bevor du NGINX testest, musst du die Firewall-Einstellungen ändern, um den Zugriff von außen auf die Standard-Webports zu erlauben. Wenn du die Anweisungen in den Voraussetzungen befolgt hast, solltest du eine UFW-Firewall konfiguriert haben, um den Zugriff auf deinen Server zu beschränken.

Während der Installation registriert sich Nginx bei UFW, um einige Anwendungsprofile bereitzustellen, mit denen du den Zugriff auf NGINX durch die Firewall aktivieren oder deaktivieren kannst.

Liste die ufw-Anwendungsprofile auf, indem du eingibst:

sudo ufw app list

Du solltest eine Liste der Anwendungsprofile erhalten:

Available applications:
...
  Nginx Full
  Nginx HTTP
  Nginx HTTPs
  OpenSSH
…

Aus der Ausgabe geht hervor, dass drei Profile für Nginx verfügbar sind:

  • Nginx Full: Dieses Profil öffnet sowohl Port 80 (normaler, unverschlüsselter Webverkehr) als auch Port 443 (TLS/SSL-verschlüsselter Verkehr)
  • Nginx HTTP: Dieses Profil öffnet nur Port 80 (normaler, unverschlüsselter Webverkehr)
  • Nginx HTTPS: Dieses Profil öffnet nur Port 443 (TLS/SSL-verschlüsselter Verkehr)

Es ist nicht empfehlenswert, dass restriktivste Profil zu aktivieren, das den von dir gewünschten Datenverkehr noch zulässt. Da du in diesem Leitfaden noch kein TLS/SSL für deinen Server konfiguriert hast, musst du nur den HTTP-Verkehr auf Port 80 zulassen.

Du kannst dies aktivieren, indem du eingibst:

sudo ufw allow 'Nginx HTTP'

Du kannst die Änderung überprüfen, indem du eingibst:

sudo ufw status

Die Ausgabe zeigt an, welcher HTTP-Verkehr erlaubt ist:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Schritt 3 Überprüfung des Webservers

Der Webserver sollte bereits gestartet sein und laufen.

Du kannst mit dem systemd init System überprüfen, ob der Dienst läuft, indem du eingibst:

systemctl status nginx

Die Ausgabe sollte in etwa so aussehen:

● nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-04-01 23:03:00 CEST; 3m ago
       Docs: https://nginx.org/en/docs/
    Process: 82589 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 82590 (nginx)
      Tasks: 3 (limit: 154399)
     Memory: 4.4M
        CPU: 4ms
     CGroup: /system.slice/nginx.service
             |-82590 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             |-82591 "nginx: worker process

Diese Ausgabe zeigt, dass der Dienst erfolgreich gestartet wurde. Der beste Weg, dies zu testen, ist jedoch, tatsächlich eine Seite von NGINX anzufordern.

Du kannst die Standard-NGINX-Landingpage aufrufen, um zu überprüfen, ob die Software ordnungsgemäß läuft, indem du zur IP-Adresse deines Servers navigierst. Wenn du die IP-Adresse deines Servers nicht kennst, kannst du sie in der Eingabeaufforderung deines Servers eingeben:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Du wirst ein paar Zeilen zurückbekommen. Du kannst jede Zeile in deinem Webbrowser ausprobieren, um zu sehen, ob sie funktioniert.

Wenn du die IP-Adresse deines Servers hast, gib sie in die Adresszeile deines Browsers ein: http://deine_server_ip

Die Standard-NGINX-Landingpage sollte in deinem Webbrowser erscheinen:

Bild, welches die standard Index.html Datei von NGINX zeigt.

Diese Seite wird mit NGINX mitgeliefert, um dir zu zeigen, dass der Server richtig läuft.

Schritt 4 Verwaltung des NGINX-Prozesses

Jetzt, wo dein Webserver in Betrieb ist, kannst du dir einige grundlegende Verwaltungsbefehle ansehen.

Um deinen Webserver anzuhalten, gibst du ein:

sudo systemctl stop nginx

Um den Webserver zu starten, wenn er angehalten wurde, gibst du ein:

sudo systemctl start nginx

Um den Dienst anzuhalten und dann wieder zu starten, gibst du ein:

sudo systemctl restart nginx

Wenn du Änderungen an der Konfiguration vornimmst, kann NGINX oft neu geladen werden, ohne dass die Verbindungen abbrechen. Gib dazu Folgendes ein:

sudo systemctl reload nginx

Standardmäßig ist NGINX so konfiguriert, dass es beim Hochfahren des Servers automatisch gestartet wird. Wenn du das nicht möchtest, kannst du dieses Verhalten deaktivieren, indem du eingibst:

sudo systemctl disable nginx

Um den Dienst wieder zu aktivieren, damit er beim Booten gestartet wird, kannst du Folgendes eingeben:

sudo systemctl enable nginx

Schritt 5 Einrichten eines Server-Blocks

Bei der Verwendung des NGINX-Webservers können Serverblöcke (ähnlich wie virtuelle Hosts bei Apache) verwendet werden, um Konfigurationsdetails zu kapseln und mehr als eine Domain auf einem einzigen Server zu hosten. In den folgenden Beispielen wird deine_domain als Platzhalter verwendet, aber du solltest sie durch deinen tatsächlichen Domainnamen ersetzen.

Bei NGINX unter Debian 11 ist standardmäßig ein Serverblock aktiviert, der so konfiguriert ist, dass er Dokumente aus einem Verzeichnis unter /var/www/html bereitstellt. Das funktioniert zwar gut für eine einzelne Website, kann aber unhandlich werden, wenn du mehrere Websites hostest. Anstatt /var/www/html zu ändern, solltest du eine Verzeichnisstruktur innerhalb von /var/www für deine_domain-Website erstellen und /var/www/html als Standardverzeichnis belassen, das ausgeliefert wird, wenn eine Kundenanfrage keiner anderen Website entspricht.

Erstelle das Verzeichnis für deine_domain wie folgt und verwende die Flag -p, um alle notwendigen übergeordneten Verzeichnisse zu erstellen:

sudo mkdir -p /var/www/deine_domain/html

Als Nächstes vergibst du die Rechte an dem Verzeichnis mit der Umgebungsvariablen $USER, die auf deinen aktuellen Systembenutzer verweisen sollte:

sudo chown -R $USER:$USER /var/www/deine_domain/html

Die Berechtigungen deines Web-Root sollten korrekt sein, wenn du deinen umask-Wert nicht geändert hast, aber du kannst dich vergewissern, indem du eingibst:

sudo chmod -R 755 /var/www/deine_domain

Als Nächstes erstellst du eine Beispielseite index.html mit nano oder deinem bevorzugten Texteditor:

nano /var/www/deine_domain/html/index.html

Füge darin das folgende HTML-Beispiel ein:

<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>NGINX Installation erfolgreich</title>
    </head>
    <body>
        <h1>NGINX Installation erfolgreich</h1>
        <p>Herzlichen Glückwunsch, Du hast deinen NGINX Server erfolgreich für <em>deine_domain.de</em> installiert und konfiguriert!</p>
    </body>
</html>

Speichere und schließe die Datei, wenn du fertig bist. In nano kannst du das tun, indem du STRG + X drückst, dann Y, wenn du dazu aufgefordert wirst, und dann ENTER.

Damit NGINX diese Inhalte bereitstellen kann, musst du einen Serverblock mit den richtigen Instruktionen erstellen, der auf dein benutzerdefiniertes Webverzeichnis verweist. Anstatt die Standardkonfigurationsdatei direkt zu ändern, erstellst du eine neue Datei unter /etc/nginx/sites-available/deine_domain.conf:

sudo nano /etc/nginx/sites-available/deine_domain.conf

Füge den folgenden Konfigurationsblock hinzu, der dem Standard ähnlich ist, aber für dein neues Verzeichnis und deinen Domainnamen aktualisiert wurde:

server {
    listen 80;
    listen [::]:80;

    server_name deine_domain.de www.deine_domain.de;

    root /var/www/deine_domain/html;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ =404;
    }
}

Beachte, dass die root-Konfiguration auf dein neues Verzeichnis und der server_name auf deinen Domainnamen aktualisiert wurde. Vergiss nicht, deine_domain hier durch deinen tatsächlichen Domainnamen zu ersetzen.

Als Nächstes aktivierst du diesen Serverblock, indem du einen symbolischen Link zu deiner benutzerdefinierten Konfigurationsdatei im Verzeichnis sites-enabled erstellst, aus dem NGINX beim Start liest:

sudo ln -s /etc/nginx/sites-available/deine_domain.conf /etc/nginx/sites-enabled/

Auf deinem Server sind jetzt zwei Serverblöcke aktiviert und so konfiguriert, dass sie auf der Grundlage ihrer listen- und server_name-Direktiven auf Anfragen antworten

  • deine_domain: Reagiert auf Anfragen für deine_domain und www.deine_domain.
  • default: Reagiert auf alle Anfragen auf Port 80, die nicht zu den beiden anderen Blöcken passen.

Um ein mögliches Hash-Bucket-Speicherproblem zu vermeiden, das durch das Hinzufügen zusätzlicher Servernamen zu deiner Konfiguration entstehen kann, ist es notwendig, einen einzigen Wert in der Datei /etc/nginx/nginx.conf anzupassen. Öffne die Datei:

sudo nano /etc/nginx/nginx.conf

Finde die Zeile server_names_hash_bucket_size und entferne das #-Symbol, um die Zeile zu entkommentieren:

...
http {
    ...
    server_names_hash_bucket_size 64;
    ...
}
...

Speichere und schließe die Datei, wenn du fertig bist.

Teste als Nächstes, ob deine NGINX-Dateien keine Syntaxfehler enthalten:

sudo nginx -t

Wenn es keine Probleme gibt, ist das folgende Ergebnis zu sehen:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn dein Konfigurationstest erfolgreich war, starte NGINX neu, um deine Änderungen zu aktivieren:

sudo systemctl restart nginx

NGINX sollte jetzt deinen Domainnamen bedienen. Du kannst dies testen, indem du zu http://deine_domain navigierst. Das benutzerdefinierte HTML, das du im Ordner /var/www/deine_domain/html/index.html erstellt hast, sollte hier angezeigt werden:

Schritt 6 – Vertraut werden mit wichtigen NGINX-Dateien und -Verzeichnissen

Da du nun weißt, wie du den NGINX-Dienst selbst verwaltest, kannst du dir etwas Zeit nehmen, um dich mit einigen wichtigen Verzeichnissen und Dateien vertraut zu machen.

Content

  • /var/www/html: Der eigentliche Webinhalt, der standardmäßig nur aus der NGINX-Standardseite besteht, die du bereits gesehen hast, wird aus dem Verzeichnis /var/www/html ausgeliefert. Dies kann durch Ändern der NGINX-Konfigurationsdateien geändert werden.

Server Konfiguration

  • /etc/nginx: /etc/nginx: Das NGINX-Konfigurationsverzeichnis. Alle Nginx-Konfigurationsdateien befinden sich hier.
  • /etc/nginx/nginx.conf: Die Hauptkonfigurationsdatei von NGINX. Sie kann geändert werden, um Änderungen an der globalen NGINX-Konfiguration vorzunehmen.
  • /etc/nginx/sites-available/: Das Verzeichnis, in dem Serverblöcke pro Site gespeichert werden können. NGINX verwendet die Konfigurationsdateien in diesem Verzeichnis nur dann, wenn sie mit dem Verzeichnis sites-enabled verknüpft sind. Normalerweise wird die gesamte Konfiguration der Serverblöcke in diesem Verzeichnis vorgenommen und dann durch einen Link auf das andere Verzeichnis aktiviert.
  • /etc/nginx/sites-enabled/: Das Verzeichnis, in dem die aktivierten Serverblöcke pro Site gespeichert werden. Normalerweise werden diese durch Verknüpfung mit Konfigurationsdateien erstellt, die sich im Verzeichnis sites-available befinden.
  • /etc/nginx/snippets: Dieses Verzeichnis enthält Konfigurationsfragmente, die an anderer Stelle in die NGINX-Konfiguration eingefügt werden können. Potenziell wiederholbare Konfigurationsabschnitte sind gute Kandidaten für das Refactoring in Snippets.

Server Logs

  • /var/log/nginx/access.log: Jede Anfrage an deinen Webserver wird in dieser Logdatei aufgezeichnet, sofern NGINX nicht anders konfiguriert ist.
  • /var/log/nginx/error.log: Alle NGINX-Fehler werden in diesem Protokoll aufgezeichnet.

Fazit

Jetzt, wo du deinen Webserver installiert hast, hast du viele Optionen für die Art der Inhalte, die du anbieten kannst, und die Technologien, die du einsetzen kannst, um deinen Nutzern ein besseres Erlebnis zu bieten.

Bei Fragen, Verbesserungsvorschlägen oder anderen Anliegen, schreibe einen Kommentar oder eine E-Mail an kontakt@toaaa.de