NGINX-Tutorial: Die grundlegenden Befehle und Konfigurationen

In unserem Grundlagen-Artikel "NGINX – der schnelle und ressourcenschonende Webserver" haben wir bereits für Sie zusammengefasst, was NGINX ausmacht und wie Sie es auf Ihrem System installieren und einrichten. In dem folgenden Tutorial bieten wir Ihnen einen Überblick über die grundlegenden Befehle und Konfigurationsmöglichkeiten der modernen Webserver-Software.

Die zentrale Steuereinheit: nginx.conf

NGINX arbeitet anders als beispielsweise Apache eventbasiert. Einzelne Anfragen werden nicht jeweils als neuer Arbeitsprozess eingestuft, für den sämtliche Module geladen werden müssen, sondern als Event. Diese Events werden auf existierende Arbeitsprozesse aufgeteilt, die durch den übergeordneten Hauptprozess aufrechterhalten werden. Wie viele Arbeitsprozesse letztendlich existieren und auf welche Art und Weise die Serveranfragen (also die Events) aufgeteilt werden, ist in der Konfigurationsdatei nginx.conf definiert. Diese finden Sie standardmäßig in den Verzeichnissen /usr/local/nginx/conf, /etc/nginx oder /usr/local/etc/nginx.

Prozesse verwalten und neue Konfigurationen übernehmen

NGINX startet nach der Installation automatisch, was Sie alternativ aber auch mithilfe des folgenden Befehls in die Wege leiten können:

sudo service nginx start

Läuft die Webserver-Software, kontrollieren Sie diese, indem Sie die Prozesse (in erster Linie den Hauptprozess) mit dem Parameter -s und einem bestimmten Signal ansprechen. Die Syntax der entsprechenden Befehle ist relativ unspektakulär:

sudo nginx -s signal

Für „signal“ haben Sie unter anderem die folgenden vier Möglichkeiten:

  • stop: NGINX wird sofort beendet.
  • quit: NGINX wird beendet, nachdem alle aktive Anfragen beantwortet worden sind.
  • reload: Die Konfigurationsdatei wird neu geladen.
  • reopen: Die Log-Files werden neu gestartet.

Die Reload-Option, mit der die Konfigurationsdatei neu geladen wird, ist eine gute Möglichkeit, um Veränderungen an selbiger zu übernehmen, ohne die Webserver-Software beenden und neustarten zu müssen. In jedem Fall müssen Sie sich für eine Variante – Komplett-Neustart des Servers oder einen einfachen NGINX-Reload – entscheiden, damit die Änderungen übernommen werden. Wenn Sie sich für letztere, elegantere Version entschieden und den untenstehenden Befehl ausgeführt haben, erhält der Hauptprozess die Anweisung, die Änderungen in der nginx.conf-Datei zu übernehmen:

sudo nginx -s reload

Zu diesem Zweck wird zunächst die Korrektheit der Syntax überprüft. Bei positiver Rückmeldung startet der Hauptprozess neue Arbeitsprozesse mit den neuen Einstellungen und initiiert gleichzeitig den Stopp der alten Prozesse. Schlägt die Validierung der Syntax fehl, wird der alte Konfigurationsstand beibehalten. Alle aktiven Arbeitsprozesse werden beendet, sobald sämtliche aktiven Anfragen bearbeitet wurden.

Im Übrigen können Sie NGINX-Prozesse auch ganz gezielt mithilfe von Tools wie kill ansprechen. Sie benötigen lediglich die entsprechende Prozess-ID, die Sie in der nginx.pid-Datei im Verzeichnis /usr/local/nginx/logs oder alternativ im Verzeichnis /var/run finden. Hat der Hauptprozess zum Beispiel die ID 1628, kann er mit kill und dem Quit-Signal im Schongang beendet werden:

sudo kill -s quit 1628

Mit dem Dienstprogramm ps können Sie sich darüber hinaus eine Liste aller ausgeführten NGINX-Prozesse anzeigen lassen:

sudo ps -ax | grep nginx

So regeln Sie die Auslieferung statischer Inhalte

Mit großer Wahrscheinlichkeit nutzen Sie Ihren Webserver, um Dateien wie Bilder, Videos oder statische HTML-Inhalte auszuliefern. Aus Gründen der Effizienz bietet es sich an, verschiedene lokale Verzeichnisse für die unterschiedlichen Inhaltstypen zu wählen. Beginnen Sie damit, das exemplarische Verzeichnis /data/html anzulegen und dort ein beispielhaftes HTML-Dokument index.html zu platzieren sowie einen Ordner /data/bilder mitsamt einigen Beispielbildern zu erzeugen.

Im nächsten Schritt müssen die beiden Verzeichnisse in der Konfigurationsdatei eingetragen werden, indem man beide in der Server-Block-Direktive festhält, die ihrerseits Sub-Direktive der Http-Block-Direktive ist. Standardmäßig sind hier bereits verschiedene Anweisungen festgehalten, die Sie zunächst ausschalten können (off). Legen Sie anschließend einfach eine separate Server-Block-Anweisung an:

http {
  server {
  }
}

In diesem Server-Block sollen nun die beiden Verzeichnisse angegeben werden, in denen Bilder und HTML-Dokumente liegen. Das entsprechende Resultat sieht folgendermaßen aus:

server {
  location / {
    root /data/html;
  }

  location /bilder/ {
    root /data;
  }
}

Bei dieser Konfiguration handelt es sich um eine Standardeinstellung eines Servers, der auf Port 80 lauscht und über den Localhost zugänglich ist. Alle Anfragen, deren URIs mit /bilder/ beginnen, werden nun Dateien aus dem /data/bilder-Verzeichnis anfordern. Existiert entsprechende Datei dort nicht, erscheint eine Fehlermeldung. Alle NGINX-Events, deren URIs hingegen nicht mit /bilder/ beginnen, werden in das /data/html-Verzeichnis weitergeleitet.

Denken Sie daran, NGINX im Anschluss neu zu laden oder neu zu starten, um die Änderungen zu übernehmen.

Einrichtung eines einfachen NGINX-Proxy-Servers

Sehr häufig wird NGINX zum Betreiben eines Proxy-Servers eingesetzt, um anstelle des eigentlichen Servers eingehende Anfragen entgegenzunehmen, diese nach verschiedensten Kriterien zu filtern und weiterzuleiten sowie die jeweilige Antwort an die Clients auszuliefern. Besonders beliebt sind Cache-Proxys, die lokal gespeicherte, statische Inhalte direkt ausliefern und nur alle weiteren Anfragen an den Server weiterleiten. Ebenfalls sehr verbreitet sind Firewall-Proxys, die unsichere bzw. unerwünschte Verbindungen herausfiltern. Im folgenden Beispiel geht es um den erstgenannten Cache-Proxy, der angeforderte Bilder aus dem lokalen Verzeichnis ausspielen und alle weiteren Anfragen an den Webserver weiterleiten soll.

Im ersten Schritt definieren Sie in der nginx.conf den Hauptserver:

server {
  listen 8080;
  root /data/up1;

  location / {
  }
}

Im Gegensatz zum vorherigen Beispiel nutzen Sie hierbei die Listen-Direktive, da nicht der Standard-Port, sondern Port 8080 für eingehende Anfragen genutzt werden soll. Legen Sie außerdem das angepeilte Verzeichnis /data/up1 an und dort die index.html-Seite ab.

Als zweites werden der Proxy-Server und seine Funktion, Bildinhalte auszuliefern, definiert, indem die Proxy-pass-Direktive inklusive der Angaben über den Hauptserver – Protokoll (http), Name (localhost) und Port (8080) – zum Einsatz kommt:

server {
  location / {
    proxy_pass http://localhost:8080;
  }

  location ~ \.(gif|jpg|png) $ {
    root /data/bilder;
  }
}

Der zweite Location-Block weist den Proxy-Server an, alle Anfragen selbst zu beantworten, deren URIs auf den bildertypischen Endungen .gif, .jpg und .png enden, indem der entsprechende Inhalt aus dem lokalen Verzeichnis /data/bilder abgerufen wird. Alle anderen Anfragen werden zum Hauptserver weitergeleitet. Wie auch bei den Einstellungen zuvor, speichern Sie Ihren Bilder-Proxy per Reload-Signal an den Hauptprozess bzw. mit einem Restart von NGINX. Weitere mögliche Direktiven für komplexere Proxy-Einstellungen finden Sie im offiziellen NGINX-Onlinehandbuch.