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:
-
Ein mitthis initial server setup tutorial eingerichteter CentOS 7-Server, einschließlich eines Sudo-Nicht-Root-Benutzers.
-
Nginx wurde auf Ihrem Server installiert, indem Sie denHow To Install Nginx on CentOS 7 tutorial folgen.
[[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 vonif
fü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_uri
nimmt 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 Blocksserver
verweigert den Zugriff auf die Website, wenn das Ergebnis vonmap
dies 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_code
mit einem der Ländercodes im Block übereinstimmt, wird sie aufyes
gesetzt. Wenn die Variable$allowed_country
no
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.