Verwendung des Nginx-Kartenmoduls unter Ubuntu 16.04

Einführung

Beim Konfigurieren eines Servers für eine Website müssen möglicherweise einige allgemeine bedingte Aktionen implementiert werden. Beispielsweise sollten einige Dateien möglicherweise länger vom Browser des Benutzers zwischengespeichert werden als andere, oder einige Teile der Website sollten nur über eine sichere Verbindung (wie alles, was das Kennwort eines Benutzers erfordert) zugelassen werden, während andere Teile der Website nicht zugelassen werden. t.

Ein weiteres einfaches, weit verbreitetes Beispiel besteht darin, sicherzustellen, dass beim Veröffentlichen einer neuen anstelle einer alten Webseite alle alten Adressen an die richtigen Stellen weitergeleitet werden. Dies ist nützlich, da alte Links und Lesezeichen nicht mehr funktionieren und das Caching von Google erhalten bleibt.

Mit dem Nginx-Kartenmodul können Sie Variablen in der Nginx-Konfigurationsdatei erstellen, deren Werte abhängig von den Werten anderer Variablen sind. In diesem Handbuch erfahren Sie, wie Sie mit dem Kartenmodul von Nginx zwei Beispiele implementieren: Wie Sie eine Liste mit Weiterleitungen von alten auf neue Website-URLs einrichten und wie Sie eine Whitelist mit Ländern erstellen, um den Verkehr auf Ihrer Website zu kontrollieren.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

Schritt 1 - Erstellen und Testen einer Beispielwebseite

Zunächst erstellen wir eine Testdatei, die eine neu veröffentlichte Website darstellt. Wir werden diese Datei verwenden, um Ihre Konfiguration zu testen.

Erstellen wir eine einfache Seite mit dem Namen "+ index.html +" im Standardverzeichnis der Nginx-Website. Diese Datei enthält nur einfachen Text, der beschreibt, was sich darin befindet: Startseite.

sudo sh -c 'echo "Home" > /var/www/html/index.html'

Wenn diese Testdatei vorhanden ist, prüfen wir als Nächstes, ob sie mit "+ curl " korrekt bereitgestellt wird. Für diesen Befehl muss nicht " index.html +" angegeben werden, da diese Datei standardmäßig bereitgestellt wird, wenn kein genauer Dateiname angegeben wird.

curl http://localhost/

Als Antwort sollten Sie ein einzelnes Wort sehen, das wie folgt * Home * sagt:

Nginx-Antwort

Home

Versuchen wir nun, auf eine Datei zuzugreifen, die in "+ / var / www / html / " nicht vorhanden ist, wie " old.html +".

curl -L http://localhost/old.html

Die Antwort ist eine Systemfehlermeldung, * 404 Not Found *, was bedeutet, dass die Seite nicht vorhanden ist.

Nginx-Antwort

<html>
<head><title></title></head>
<body bgcolor="white">
<center><h1></h1></center>
<hr><center>nginx/1.10.0 (Ubuntu)</center>
</body>
</html>

In diesem Lernprogramm wird nur eine Dummy-Website verwendet. Wenn jedoch "+ old.html +" eine Seite auf einer echten Website war, die zuvor vorhanden war und gelöscht wurde, bedeutet das Zurückgeben einer 404, dass alle Links zu dieser Seite beschädigt sind. Dies ist weniger als ideal, da diese Links möglicherweise von Google indexiert, ausgedruckt, aufgeschrieben oder auf andere Weise geteilt wurden.

Im nächsten Schritt stellen wir mithilfe des Kartenmoduls sicher, dass diese alte Adresse wieder funktioniert, indem die Zuschauer automatisch zu den neuen Ersetzungen umgeleitet werden.

Schritt 2 - Konfigurieren der Weiterleitungen

Bei kleinen Websites mit nur wenigen Seiten können einfache "+ if +" - Bedingungsanweisungen für Weiterleitungen und ähnliche Zwecke verwendet werden. Eine solche Konfiguration ist jedoch auf lange Sicht nicht einfach zu warten oder zu erweitern, da die Liste der Bedingungen länger wird.

Das Kartenmodul ist eine elegantere und übersichtlichere Lösung. Sie können Nginx-Variablenwerte mit einer Liste von Bedingungen vergleichen und der Variablen dann abhängig von der Übereinstimmung einen neuen Wert zuordnen. In diesem Beispiel vergleichen wir die angeforderte URL mit der Liste der alten Seiten, die wir an ihre neuen Gegenstücke weiterleiten möchten. Für jede alte Adresse ordnen wir die neue zu.

Das Kartenmodul ist ein zentrales Nginx-Modul, das heißt, es muss nicht separat installiert werden, um verwendet zu werden. Öffnen Sie zum Erstellen der erforderlichen Map- und Redirect-Konfiguration die Standard-Serverblock-Nginx-Konfigurationsdatei in "+ nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /etc/nginx/sites-available/default

Suchen Sie den Konfigurationsblock "+ server +", der folgendermaßen aussieht:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

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

. . .

Wir werden zwei neue Abschnitte hinzufügen: einen vor dem "+ server +" - Block und einen darin.

Der Abschnitt vor dem "+ server" -Block ist ein neuer "+ map" -Block, der die Zuordnung zwischen den alten und den neuen URLs mithilfe des Map-Moduls definiert. Der Abschnitt innerhalb des "+ server +" - Blocks ist die Umleitung selbst.

Geändert / etc / nginx / sites-available / default

. . .
# Default server configuration
#







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





. . .

Die Direktive + map $ uri $ new_uri + nimmt den Inhalt der Systemvariablen + $ uri +, die die URL-Adresse der angeforderten Seite enthält, und vergleicht ihn dann mit der Liste der Bedingungen in geschweiften Klammern. Jedes Element in der Liste der Bedingungen hat zwei Abschnitte: den Wert, mit dem verglichen werden soll, und den neuen Wert, der der Variablen zugewiesen werden soll, wenn er übereinstimmt.

Die Zeile "+ / old.html / index.html " innerhalb des " map " - Blocks bedeutet, dass, wenn der Wert von " $ uri " " / old.html +" "ist," + $ new_uri + "in" geändert wird + / index.html + `. Wenn es nicht übereinstimmt, wird es nicht geändert. Hier definieren wir nur eine Bedingung, Sie können jedoch beliebig viele Bedingungen in einer Karte definieren.

Dann prüfen wir mit einer bedingten "+ if " - Anweisung innerhalb des " server " - Blocks, ob der Wert der Variablen " $ new_uri " gesetzt ist. Wenn dies der Fall ist, bedeutet dies, dass die Bedingung in der Karte erfüllt wurde, und wir sollten mit dem Befehl " rewrite " auf die neue Website umleiten. Das Schlüsselwort " permanent +" stellte sicher, dass die Weiterleitung eine * 301 dauerhaft verschobene * HTTP-Weiterleitung ist. Dies bedeutet, dass die alte Adresse nicht mehr gültig ist und nicht wieder online geschaltet wird.

Speichern und schließen Sie die Datei, um sie zu beenden.

Starten Sie Nginx neu, um die neue Konfiguration zu aktivieren.

sudo systemctl restart nginx

Führen Sie zum Testen der neuen Konfiguration dieselbe Anforderung aus wie zuvor:

curl -L http://localhost/old.html

Dieses Mal wird kein * 404 Not Found * -Fehler in der Ausgabe angezeigt. Stattdessen wird die einfache Startseite angezeigt, die wir in Schritt 1 erstellt haben.

Nginx-Antwort

Home

Dies bedeutet, dass die Karte ordnungsgemäß konfiguriert wurde und Sie sie zum Umleiten von URLs verwenden können, indem Sie der Karte weitere Einträge hinzufügen.

Das Umleiten von URLs ist eine nützliche Anwendung des Kartenmoduls. Eine weitere Möglichkeit, die wir im nächsten Schritt untersuchen werden, ist das Filtern des Datenverkehrs anhand des geografischen Standorts der Besucher.

Schritt 3 - Beschränkung des Website-Zugriffs auf bestimmte Länder

Manchmal erhält ein Server zu viele automatisierte, böswillige Anfragen. Dies kann ein DDoS-Angriff sein, ein Versuch, Kennwörter für Website-Administrationsbereiche zu erzwingen, oder ein Versuch, bekannte Sicherheitslücken in der Software auszunutzen, um die Website anzugreifen und damit Spam zu versenden oder den Inhalt der Website zu ändern.

Solche automatisierten Angriffe können von vielen verschiedenen verteilten Servern in vielen verschiedenen Ländern ausgehen, was das Blockieren erschwert. Eine Lösung, um die Auswirkungen eines solchen Angriffs abzuschwächen, besteht darin, eine Whitelist der Länder zu erstellen, die auf die Website zugreifen können.

Dies ist keine perfekte Lösung. In Situationen, in denen die Einschränkung des Zugriffs auf die Website auf der Grundlage des geografischen Standorts des Besuchers eine sinnvolle Wahl darstellt und die Zielgruppe der Website nicht einschränkt, bietet diese Lösung den Vorteil, dass sie schnell und weniger fehleranfällig ist.

Das Filtern auf Serverebene ist schneller als das Filtern auf Websiteebene und deckt auch alle Anforderungen ab (einschließlich statischer Dateien wie Bilder). Diese Art der Filterung verhindert auch, dass Anfragen die Website-Software erreichen, wodurch die Ausnutzung von Schwachstellen erschwert wird.

Um die geografische Filterung zu nutzen, erstellen wir zunächst eine neue Konfigurationsdatei.

sudo nano /etc/nginx/conf.d/geoip.conf

Fügen Sie den folgenden Inhalt in die Datei ein. Dies teilt Nginx mit, wo sich die GeoIP-Datenbank befindet, die Zuordnungen zwischen den IP-Adressen der Besucher und ihren jeweiligen Ländern enthält. Diese Datenbank ist mit Ubuntu 16.04 vorinstalliert.

/etc/nginx/conf.d/geoip.conf

. . .
# GeoIP database path
#

geoip_country /usr/share/GeoIP/GeoIP.dat;

Der nächste Schritt besteht darin, die erforderliche Karten- und Einschränkungskonfiguration zu erstellen. Öffnen Sie die Standard-Serverblock-Nginx-Konfiguration.

sudo nano /etc/nginx/sites-available/default

Suchen Sie den Konfigurationsblock "+ server +", der nach den Änderungen in Schritt 1 und 2 wie folgt aussieht:

/ etc / nginx / sites-available / default

. . .
# Default server configuration
#

# Old website redirect map
#
map $uri $new_uri {
   /old.html /index.html;
}

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

   # Old website redirect
   if ($new_uri) {
       rewrite ^ $new_uri permanent;
   }
. . .

Wir werden zwei neue Abschnitte hinzufügen: einen vor dem "+ server +" - Block und einen darin.

Der Abschnitt vor dem "+ server" -Block ist ein neuer "+ map" -Block, der die Standardaktion (Zugriff nicht zulässig) sowie die Liste der Ländercodes definiert, die auf die Website zugreifen dürfen. Der Abschnitt innerhalb des Blocks "+ server " verweigert den Zugriff auf die Website, wenn das Ergebnis " map +" dies angibt.

Geändert / etc / nginx / sites-available / default

. . .
# Default server configuration
#









# Old website redirect map
#
map $uri $new_uri {
   /old.html /index.html;
}

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






   # Old website redirect
   if ($new_uri) {
       rewrite ^ $new_uri permanent;
   }
. . .

Speichern und schließen Sie die Datei, um sie zu beenden.

Hier haben wir "" und "" als Platzhalter verwendet. Ersetzen Sie diese Variablen durch den zweistelligen Ländercode für das Land oder die Länder, für die Sie eine Whitelist erstellen möchten. Sie können die vollständige durchsuchbare Liste aller ISO-Ländercodes zum Suchen verwenden. Der zweistellige Code für die USA lautet beispielsweise "+ US".

Im Gegensatz zum ersten Beispiel wird in diesem + map + - Block die Variable + $ allowed_country + immer auf etwas gesetzt. Standardmäßig ist "+ no " eingestellt. Wenn die Variable " $ geoip_country_code " mit einem der Ländercodes im Block übereinstimmt, wird sie auf " yes " gesetzt. Wenn die Variable " $ allowed_country " " no +" ist, geben wir eine Verbindung * 444 zurück, die ohne Antwort geschlossen wurde *, anstatt die eigentliche Website zu bedienen.

Starten Sie Nginx neu, um die neue Konfiguration zu aktivieren.

sudo systemctl restart nginx

Wenn Sie Ihr Land nicht zur Whitelist hinzugefügt haben und versuchen, "+ http: // +" aufzurufen, wird eine Fehlermeldung wie "Die Seite funktioniert nicht" oder "Die Seite wurde nicht gesendet" angezeigt beliebige Daten *. Wenn Sie Ihr Land zur Whitelist hinzufügen, wird wie zuvor "Home" angezeigt.

Fazit

Es ist zwar ein sehr einfaches Beispiel für die Verwendung des Kartenmoduls, zeigt jedoch den Mechanismus, der auf viele andere Arten verwendet werden kann. Das Kartenmodul ermöglicht nicht nur einfache Vergleiche, sondern unterstützt auch reguläre Ausdrücke, die komplexere Übereinstimmungen ermöglichen. Dies ist eine hervorragende Möglichkeit, um Konfigurationsdateien übersichtlicher zu gestalten, wenn mehrere Bedingungen ausgewertet werden müssen.

Ein weiterer sehr beliebter Anwendungsfall für das Kartenmodul sind bedingte Weiterleitungen für sichere Teile der Website in einer ansonsten nicht SSL-konformen Umgebung. Das Einrichten einer erzwungenen SSL-Verbindung nur für Formulare, für die beispielsweise ein Kennwort eingegeben werden muss, ist ein gutes Beispiel für die Anwendung des Kartenmoduls im realen Szenario, und ich empfehle, mit solchen Einstellungen zu experimentieren.

Weitere Informationen finden Sie unter in Nginxs offizieller Dokumentation zum Kartenmodul.