Verwendung des Nginx-Kartenmoduls unter CentOS 7

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 Kartenmodul von Nginx können Sie Variablen in der Konfigurationsdatei von Nginx erstellen, deren Werte von Bedingungen abhängig sind, dh von den Werten anderer Variablen abhängen. 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]] == 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,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" > /usr/share/nginx/html/index.html'

Wenn diese Testdatei vorhanden ist, überprüfen wir als Nächstes, ob sie mitcurl korrekt bereitgestellt wird. Wir müssen für diesen Befehl nichtindex.html angeben, da diese Datei standardmäßig bereitgestellt wird, wenn kein genauer Dateiname angegeben wird.

curl http://localhost/

Als Antwort sollten Sie ein einzelnes Wort sehen, dasHome wie folgt sagt:

Nginx-Antwort

Home

Versuchen wir nun, auf eine Datei zuzugreifen, die in/usr/share/nginx/html nicht vorhanden ist, wie inold.html.

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

Die Antwort ist eine Systemfehlermeldung404 Not Found, was bedeutet, dass die Seite nicht vorhanden ist.

Nginx-Antwort




    
        The page is not found
. . .

In diesem Lernprogramm wird nur eine Dummy-Website verwendet. Wennold.html jedoch eine Seite auf einer realen Website war, die früher vorhanden war und gelöscht wurde, bedeutet die Rückgabe einer 404, dass alle Links zu dieser Seite fehlerhaft 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]] == Schritt 2 - Konfigurieren der Weiterleitungen

Für kleine Websites mit nur wenigen Seiten können einfache bedingte Anweisungen voniffür Weiterleitungen und ähnliche Dinge 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 Zuordnungs- und Umleitungskonfiguration die Nginx-Konfigurationsdatei des Standardserverblocks invi (hier istshort introduction to vi) oder in Ihrem bevorzugten Texteditor.

sudo vi /etc/nginx/nginx.conf

Suchen Sie den Konfigurationsblockserver, der folgendermaßen aussieht:

/etc/nginx/nginx.conf

. . .

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

. . .

Wir werden zwei neue Abschnitte hinzufügen: einen vor demserver-Block und einen darin.

Der Abschnitt vor demserver-Block ist ein neuermap-Block, der die Zuordnung zwischen den alten und den neuen URLs mithilfe des Zuordnungsmoduls definiert. Der Abschnitt innerhalb desserver-Blocks ist die Umleitung selbst.

Geändert /etc/nginx/nginx.conf

. . .

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

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

Die Direktivemap $uri $new_urinimmt den Inhalt der Systemvariablen$uri, die die URL-Adresse der angeforderten Seite enthält, und vergleicht sie dann mit der Liste der Bedingungen in den 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 Blocksmap bedeutet, dass$new_uri in/index.html geändert wird, wenn der Wert von$uri/old.html ist. 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.

Anschließend überprüfen wir mithilfe einer bedingtenif-Anweisung imserver-Block, ob der Wert der$new_uri-Variablen festgelegt ist. Wenn dies der Fall ist, bedeutet dies, dass die Bedingung in der Karte erfüllt wurde und wir mit dem Befehlrewrite zur neuen Website umleiten sollten. Das Schlüsselwortpermanent stellte sicher, dass die Umleitung eine HTTP-Umleitung von301 Moved Permanentlyist. 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 gibt es keinen404 Not Found Fehler in der Ausgabe. 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 - Einschränkung des Website-Zugriffs auf bestimmte Länder]] == Schritt 3 - Einschrä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 sinnvoll ist 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 vi /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 vi /etc/nginx/nginx.conf

Suchen Sie den Konfigurationsblockserver, der nach den Änderungen in Schritt 1 und 2 folgendermaßen aussieht:

/etc/nginx/sites-available/default

. . .

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

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;

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

Wir werden zwei neue Abschnitte hinzufügen: einen vor demserver-Block und einen darin.

Der Abschnitt vor dem Blockserver ist ein neuer Blockmap, der die Standardaktion (Zugriff nicht zulässig) sowie die Liste der Ländercodes definiert, die für den Zugriff auf die Website zulässig sind. Der Abschnitt innerhalb des Blocksserververweigert den Zugriff auf die Website, wenn das Ergebnis vonmapdies sagt.

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

. . .

# Allowed countries
#
map $geoip_country_code $allowed_country {
    default no;
    country_code_1 yes;
    country_code_2 yes;
}

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

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

    # Disallow access based on GeoIP
    if ($allowed_country = no) {
        return 444;
    }

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

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

Hier haben wircountry_code_1 undcountry_code_2 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önnenthe ISO’s full, searchable list of all country codes verwenden, um zu finden. Der zweistellige Code für die USA lautet beispielsweiseUS.

Im Gegensatz zum ersten Beispiel wird in diesemmap-Block die$allowed_country-Variable immer auf etwas gesetzt. Standardmäßig istno eingestellt. Wenn die Variable$geoip_country_codemit einem der Ländercodes im Block übereinstimmt, wird sie aufyes gesetzt. Wenn die Variable$allowed_countryno ist, geben wir444 Connection Closed Without Response zurück, 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, wird beim Versuch,http://your_server_ip zu besuchen, eine Fehlermeldung wieThe page isn’t working oderThe page didn’t send any data angezeigt. Wenn Sie Ihr Land zur Whitelist hinzufügen, werdenHome wie zuvor 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.

Detailliertere Informationen finden Sie unterin Nginx’s official map module documentation.