Nginx-Zugriffssteuerungs- und Parameteroptimierungsmethoden

Nginx-Zugriffssteuerungs- und Parameteroptimierungsmethoden

Globale Nginx-Variablen

Es gibt viele globale Variablen in Nginx, die über den Variablennamen $ verwendet werden können. Hier sind einige häufig verwendete globale Variablen:

Variable veranschaulichen
$args Parameter in der Anfrage, wie z. B. $args in www.123.com/1.php?a=1&b=2 ist a=1&b=2
$Inhaltslänge „Content-Length“ in HTTP-Anforderungsinformationen
$Inhaltstyp „Content-Type“ in HTTP-Anforderungsinformationen
$Dokumentstamm Der Wert, der dem Root-Parameter in der Konfigurationsdatei des virtuellen Nginx-Hosts entspricht
$document_uri Die aktuelle Anfrage enthält nicht die URI der Anweisung, z. B. www.123.com/1.php?a=1&b=2, wobei $document_uri 1.php ist, und enthält nicht die folgenden Parameter.
$Gastgeber Hostheader, also Domänenname
$http_user_agent Die detaillierten Informationen des Clients, d. h. die Browserkennung, können mit curl -A angegeben werden.
$http_cookie Client-Cookie-Informationen
$limit_rate Wenn der Nginx-Server mit limit_rate konfiguriert ist, um die Netzwerkrate anzuzeigen, wird diese angezeigt. Wenn sie nicht festgelegt ist, wird 0 angezeigt.
$remote_addr Die öffentliche IP des Clients
$remote_port Client-Port
$remote_user Wenn nginx mit Authentifizierung konfiguriert ist, stellt diese Variable den Benutzernamen der Client-Authentifizierung dar
$Anforderungstextdatei Der Name der lokalen Ressource, die an den Backend-Server gesendet wird, wenn er als Reverse-Proxy fungiert
$Anforderungsmethode Methoden zum Anfordern von Ressourcen, wie GET/PUT/DELETE usw.
$Anforderungsdateiname Der Pfadname der aktuell angeforderten Ressourcendatei, entspricht der Kombination aus $document_root/$document_uri
$Anforderungs-URI Der angeforderte Link, einschließlich $document_uri und $args
$Schema Das angeforderte Protokoll, z. B. ftp, http, https
$server_protocol Die Version des vom Client zum Anfordern der Ressource verwendeten Protokolls, z. B. HTTP/1.0, HTTP/1.1, HTTP/2.0 usw.
$server_adresse Server-IP-Adresse
$Servername Der Hostname des Servers
$server_port Die Portnummer des Servers
$uri Dasselbe wie $document_uri
$http_referer Der Referrer der Client-Anfrage ist im Allgemeinen der Link, über den die Anfrage gesprungen wird. Sie können ihn mit curl -e angeben.

Nginx-Standort

Standort

Die Standortdirektive wird verwendet, um basierend auf der vom Benutzer angeforderten URI verschiedene Anwendungen auszuführen. Das heißt, der Abgleich erfolgt entsprechend der vom Benutzer angeforderten Website-Adresse URL und bei erfolgreichem Abgleich werden entsprechende Vorgänge ausgeführt.

Grammatik
Die Syntax für den Standort lautet: Standort [=|~|~*|^~] /uri/ { … }
Die Variable, mit der der Standort übereinstimmt, ist $uri
Beschreibung mehrerer Charaktere

Charakter beschreiben
= Zeigt eine genaue Übereinstimmung an
~ Zeigt die Groß- und Kleinschreibung beachtende Übereinstimmung mit regulären Ausdrücken an
~* Zeigt eine reguläre Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung an.
^~ Gibt an, dass die URI mit dem angegebenen Zeichen oder der angegebenen Zeichenfolge beginnt
/ Universelles Matching, jede Anfrage wird gematcht

Regelpriorität

= höher als^~ höher als~* gleich~ höher als/

Beispiel 1

Standort = "/12.jpg" { ... }
wie:
www.syushin.com/12.jpg stimmt überein. www.syushin.com/abc/12.jpg stimmt nicht mit dem Standort überein. ^~ "/abc/" { ... }
wie:
www.syushin.com/abc/123.html stimmt mit www.syushin.com/a/abc/123.jpg überein, stimmt aber nicht mit location ~ "png" { ... } überein.
wie:
www.syushin.com/aaa/bbb/ccc/123.png entspricht www.syushin.com/aaa/png/123.html entspricht location ~* "png" { ... }
wie:
www.syushin.com/aaa/bbb/ccc/123.PNG entspricht www.syushin.com/aaa/png/123.html entspricht dem Standort /admin/ { ... }
wie:
www.syushin.com/admin/aaa/1.php stimmt überein www.syushin.com/123/admin/1.php stimmt nicht überein

Beachten:

Einige Angaben zur Standortunterstützung stimmen nicht überein!~ Beispiel: location !~ 'png'{ ... }

Das ist falsch, der Standort wird nicht unterstützt!~

Wenn eine solche Anforderung besteht, kann sie durch „if“ (Standortpriorität ist geringer als „if“) implementiert werden, beispielsweise: „if ($uri !~ 'png') { ... }“

Zugriffskontrolle

Im Zeitalter von Web 2.0 sind viele Websites benutzerzentriert und ermöglichen Benutzern, Inhalte auf dem Server zu veröffentlichen. Da die Upload-Funktion den Benutzern offen steht, bestehen große Sicherheitsrisiken, beispielsweise durch das Hochladen von Trojaner-Programmen durch Hacker usw. Daher ist es notwendig, eine Zugriffskontrolle zu konfigurieren.

verweigern und zulassen

Es lässt sich leicht wörtlich als Ablehnung und Erlaubnis verstehen.

Die Deny- und Allow-Direktiven von Nginx werden durch das Modul ngx_http_access_module bereitgestellt, das standardmäßig in die Nginx-Installation integriert ist.

Grammatik

Syntax: allow/deny address | CIDR | unix: | all

Es bedeutet, den Zugriff auf eine bestimmte IP oder ein IP-Segment zu erlauben/verweigern. Wenn unix: angegeben ist, wird der Socket-Zugriff erlaubt.

Hinweis: Diese Funktion wurde in Unix 1.5.1 neu hinzugefügt.

In nginx werden Zulassungs- und Verweigerungsregeln nacheinander ausgeführt.

Beispiel 1:

Standort /
{
  erlaube 192.168.0.0/24;
  127.0.0.1 zulassen;
  alles leugnen;
}

Hinweis: Dieser Konfigurationswert lässt Anfragen aus dem Netzwerksegment 192.168.0.0/24 und 127.0.0.1 zu und lehnt alle anderen Quell-IP-Adressen ab.

Beispiel 2:

Standort ~ "Administrator"
{
  erlauben Sie 192.168.30.7;
  leugne alles
}

Hinweis: Die aufgerufene URI enthält Administratoranforderungen und nur Anforderungen von der IP 192.168.30.7 sind zulässig.

Standortbasierte Zutrittskontrolle

Im Alltag wird die Zugangskontrolle grundsätzlich standortbezogen konfiguriert. Nehmen wir ein direktes Beispiel.

Beispiel 1:

Standort /Blog/
{
  alles leugnen;
}

Hinweis: Für das Verzeichnis /blog/ ist jeglicher Zugriff verboten. Die Option „deny all“ kann hier so geändert werden, dass sie 403; zurückgibt.

Beispiel 2

Ort ~ ".bak|\.ht"
{
  Rückgabe 403;
}

Hinweis: Wenn die aufgerufene URI .bak oder .ht enthält, wird direkt der Statuscode 403 zurückgegeben.

Beispiel für einen Testlink:

  • www.syushin.com/abc.bak
  • www.syushin.com/blog/123/.htalskdjf

Wenn die vom Benutzer eingegebene URL eine der oben genannten ist, wird 403 zurückgegeben.

Beispiel 3

Ort ~ (Daten|Cache|Temp|Bild|Anhang).*\.php$
{
  alles leugnen;
}

Hinweis: Auf alle angeforderten URIs, die Daten, Cache, temporäre Dateien, Bilder oder Anhänge enthalten und mit .php enden, ist der Zugriff verboten.

Beispiel für einen Testlink:

  • www.xxxxxx.com/aming/cache/1.php
  • www.xxxxxxx.com/image/123.phps
  • www.xxxxxx.com/aming/datas/1.php

$document_uri-basierte Zugriffskontrolle

Wie bereits erwähnt, bezeichnet die integrierte Variable $document_uri die URI, die in der aktuellen Anfrage keine Anweisungen enthält.

Beispielsweise lautet der $document_uri von www.123.com/1.php?a=1&b=2 1.php und enthält nicht die folgenden Parameter.

Wir können für diese Variable eine Zugriffskontrolle durchführen.

Beispiel 1

wenn ($document_uri ~ "/admin/")
{
  Rückgabe 403;
}

Hinweis: Wenn die angeforderte URI /admin/ enthält, wird direkt 403 zurückgegeben.

Hinweis: „allow“ und „deny“ werden in der „if“-Struktur nicht unterstützt.

Testlink:

1. www.xxxxx.com/123/admin/1.html Übereinstimmungen
2. www.xxxxx.com/admin123/1.html stimmt nicht überein
3. www.xxxxx.com/admin.php stimmt nicht überein

Beispiel 2

wenn ($document_uri = /admin.php)
{
  Rückgabe 403;
}

Hinweis: Wenn die angeforderte URI /admin.php ist, wird ein 403-Statuscode zurückgegeben.

Testlink:

1. www.xxxxx.com/admin.php # Übereinstimmungen
2. www.xxxxx.com/123/admin.php # stimmt nicht überein

Beispiel 3

wenn ($document_uri ~ '/data/|/cache/.*\.php$')
{
  Rückgabe 403;
}

Hinweis: Wenn die angeforderte URI das Daten- oder Cache-Verzeichnis enthält und PHP ist, wird ein 403-Statuscode zurückgegeben.

Testlink:

1. www.xxxxx.com/data/123.php # Übereinstimmungen
2. www.xxxxx.com/cache1/123.php # stimmt nicht überein

$request_uri-basierte Zugriffskontrolle

$request_uri hat mehr Anforderungsparameter als $docuemnt_uri. Es steuert hauptsächlich die Parameter in der angeforderten URI.

Beispiel

wenn ($request_uri ~ "gid=\d{9,12}")
{
  Rückgabe 403;
}

Hinweis: \d{9,12} ist ein regulärer Ausdruck, der 9 bis 12 Zahlen bedeutet. Beispielsweise erfüllt gid=1234567890 die Symbolanforderung.

Testlink:

1. www.xxxxx.com/index.php?gid=1234567890&pid=111 Übereinstimmungen
2. www.xxxxx.com/gid=123 stimmt nicht überein

Hintergrundwissen:

Es gab eine Website eines Kunden, die von CC angegriffen wurde. Die andere Partei hat zu viele Anfragen wie diese initiiert: /read-123405150-1-1.html
Tatsächlich handelt es sich bei einer solchen Anfrage nicht um eine normale Anfrage. Die Website zeigt eine Seite mit dem Hinweis an, dass der Beitrag nicht existiert.
Daher können Sie für solche Anfragen direkt einen 403-Statuscode zurückgeben.

Zugriffskontrolle basierend auf $http_user_agent (Anti-Crawler)

User_agent kann einfach als Browserkennung verstanden werden. Einige Spider-Crawler können auch durch user_agent identifiziert werden. Wenn Sie die Zugriffsprotokolle beobachten, werden Sie feststellen, dass einige Suchmaschinen-Spider Ihre Website sehr häufig besuchen, was nicht benutzerfreundlich ist. Um den Druck auf den Server zu verringern, können Sie tatsächlich alle Spider-Crawler außer den Spidern der gängigen Suchmaschinen blockieren.

Beispiel

wenn ($user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato')
{
  Rückgabe 403;
}

Hinweis: Alle Anfragen mit den oben genannten Schlüsselwörtern im User_Agent geben einen Statuscode 403 zurück.

prüfen:

1. curl -A "123YisouSpider1.0"
2. curl -A "MJ12bot/v1.4.1"

$http_referer-basierte Zugriffskontrolle

Zusätzlich zur Anti-Hotlink-Funktion kann $http_referer auch einige spezielle Anforderungen erfüllen.

Zum Beispiel:

Die Website wurde gehackt und die von der Suchmaschine indexierten Webseiten waren problematisch. Beim Anklicken der Website über die Suchmaschine wurde eine Glücksspiel-Website angezeigt.
Da das Auffinden von Trojanern einige Zeit in Anspruch nimmt und das Problem nicht sofort behoben werden kann, kann für derartige Anfragen ein spezieller Vorgang ausgeführt werden, um die Benutzererfahrung nicht zu beeinträchtigen.
Sie können beispielsweise direkt einen 404-Statuscode an den von Baidu aus aufgerufenen Link zurückgeben oder einen HTML-Codeausschnitt zurückgeben.

Beispiel

wenn ($http_referer ~ 'baidu.com')
{
  Rückgabe 404;
}

oder

wenn ($http_referer ~ 'baidu.com')
{
  gibt 200 zurück "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

Nginx-Parameteroptimierung

Als Hochleistungs-Webserver kann Nginx auch ohne Anpassung der Konfigurationsparameter eine große Anzahl gleichzeitiger Anfragen verarbeiten. Natürlich wird durch die Konfigurationsoptimierung die Leistung von Nginx verbessert, und die Konfigurationsparameter müssen mit der Leistung der Serverhardware als Referenz kombiniert werden.

Optimierung der Arbeitsverfahren

Arbeiterprozesse Nummer;

Dieser Parameter gibt an, wie viele Arbeitsprozesse gestartet werden. Es wird empfohlen, ihn mit der Anzahl der CPU-Kerne auf dem lokalen Computer konsistent zu halten. Jeder CPU-Kern verarbeitet einen Prozess. Num steht für eine Zahl.

worker_rlimit_nofile

Gibt die maximale Anzahl der für Nginx verfügbaren Dateideskriptoren an. Sie muss mit der maximalen Anzahl von Deskriptoren des Systems übereinstimmen. Es wird empfohlen, den Wert auf 102400 festzulegen.
Sie müssen außerdem ulimit -n 102400 im System ausführen.
Sie können die Konfigurationsdatei /etc/security/limits.conf auch direkt ändern, um Folgendes zu ändern und zu erhöhen:
#* soft nofile 655350 (entfernen Sie das führende #)
#* hard nofile 655350 (entfernen Sie das führende #)

Arbeiterverbindungen

Dieser Parameter wird verwendet, um die maximale Anzahl von Verbindungen zu konfigurieren, die jeder Nginx-Arbeitsprozess verarbeiten kann.
Dieser Parameter bestimmt auch, wie viele Client-Anfragen der Nginx-Server maximal verarbeiten kann (Worker-Prozesse * Worker-Verbindungen).
Es wird empfohlen, diesen Parameter auf 10240 zu setzen, aber nicht zu groß.

Optimieren Sie die Anzahl der HTTP/TCP-Verbindungen

Verwenden Sie epoll

Verwenden Sie das ereignisgesteuerte Epoll-Modell, das optimale Modell für Linux-Systeme.

multi_accept ein

Ermöglicht jedem Arbeitsprozess, mehrere Clientanforderungen gleichzeitig zu verarbeiten.

sendfile auf

Die Verwendung der FD-Dateiübertragungsfunktion des Kernels kann das Umschalten zwischen Benutzermodus und Kernelmodus reduzieren und so die Serverleistung verbessern.

tcp_nopush ein

Wenn tcp_nopush auf „on“ gesetzt ist, wird die Methode tcp_cork zur Datenübertragung aufgerufen.
Die Verwendung dieser Methode hat folgende Auswirkungen: Wenn die Anwendung Daten generiert,
Der Kernel kapselt das Paket nicht sofort, sondern kapselt und überträgt es erst, wenn die Datenmenge eine bestimmte Menge erreicht hat.

tcp_nodelay ein

Zwischenspeichern Sie keine Datensendungen (deaktivieren Sie den Nagle-Algorithmus). Dadurch kann die Echtzeitleistung beim hochfrequenten Senden kleiner Datenpakete verbessert werden.

(Über Nagles Algorithmus)

Wenn Sie häufig kleine Datenpakete senden müssen, z. B. 1 Byte, muss jedes Paket von einem 40 Byte langen Header begleitet werden (am Beispiel von IPv4).
Das heißt, von den insgesamt 41 Datenbytes ist nur 1 Byte das, was wir benötigen.
Um dieses Problem zu lösen, wurde der Nagle-Algorithmus entwickelt.
Es legt fest, dass das Paket sofort gesendet werden kann, wenn seine Größe dem MSS entspricht. Andernfalls werden die Daten in den Puffer gestellt und können erst gesendet werden, nachdem das bereits gesendete Paket bestätigt wurde.
Durch derartige Regelungen kann die Anzahl kleiner Pakete im Netzwerk reduziert und so die Netzwerkleistung verbessert werden.

Keepalive_Timeout

Definieren Sie die Timeout-Periode für lange Verbindungen. 30 Sekunden werden empfohlen. Zu kurz oder zu lang ist möglicherweise nicht angemessen. Natürlich ist es am besten, diesen Parameter dynamisch basierend auf der Geschäftssituation anzupassen.

Keepalive-Anfragen

Definiert die maximale Anzahl von Anfragen, die jeder Client stellen kann, wenn zwischen Client und Server eine lange Verbindung besteht. Der Wert kann hoch sein, z. B. 50000.

reset_timeout_connection ein

Wenn diese Option aktiviert ist, darf der Server die Verbindung schließen, wenn der Client keine weiteren Anfragen an den Server sendet.

Client_Body_Timeout

Wenn der Client die Body-Daten nicht innerhalb der angegebenen Zeit laden kann, wird die Verbindung getrennt. Die Einheit ist Sekunden. Der Standardwert ist 60 und kann auf 10 gesetzt werden.

Sendezeitüberschreitung

Dieses Timeout ist das Timeout für das Senden einer Antwort, d. h. der Nginx-Server hat ein Datenpaket an den Client gesendet, aber der Client hat das Datenpaket nicht empfangen.
Wenn eine Verbindung das durch send_timeout definierte Timeout überschreitet, schließt Nginx die Verbindung. Die Einheit ist Sekunden und kann auf 3 eingestellt werden.

Kompression

Für reinen Textinhalt kann Nginx die GZIP-Komprimierung verwenden. Durch den Einsatz von Komprimierungstechnologie kann der Bandbreitenverbrauch reduziert werden.

Unterstützt durch das Modul ngx_http_gzip_module

Die Konfiguration ist wie folgt:

gzip on; //Gzip-Funktion aktivierengzip_min_length 1024; //Angeforderte Ressource so einstellen, dass sie nur komprimiert wird, wenn sie diesen Wert überschreitet (in Bytes)gzip_buffers 16 8k; //Puffergröße für die Komprimierung festlegen, die erste Zahl ist die Nummer, die zweite die Größe jedes Puffersgzip_comp_level 6; //Komprimierungsstufe festlegen, von 1-9, 9 ist die höchste Komprimierungsstufe und verbraucht die meisten CPU-Ressourcengzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //Geben Sie an, welche Dateitypen komprimiert werden müssengzip_disable "MSIE 6\."; //IE6-Browser aktiviert keine Komprimierung

prüfen:

curl -I -H "Kodierung akzeptieren: gzip, deflate" http://www.xxxxx.com/1.css

Protokoll

  • Erhöhen Sie die Fehlerprotokollebene, beispielsweise die Crit-Ebene, und zeichnen Sie so wenig unbedeutende Protokolle wie möglich auf.
  • Wenn Sie die Aufzeichnung von Zugriffsprotokollen nicht benötigen, können Sie diese deaktivieren.
  • Das Zugriffsprotokoll für statische Ressourcen ist deaktiviert

Ablaufdatum statischer Dateien

Für statische Dateien müssen Sie eine Ablaufzeit festlegen, damit diese Ressourcen im Client-Browser zwischengespeichert werden können.
Bevor der Cache abläuft, fordert der Client nicht mehr dieselbe Ressource vom Server an und spart so Bandbreite und Ressourcenverbrauch.

Das Konfigurationsbeispiel sieht wie folgt aus:

Standort ~* ^.+\.(gif|jpg|png|css|js)$                   
{
  läuft in 1 Tag ab; //1 Tag bedeutet 1 Tag, Sie können auch 24 Stunden verwenden, um einen Tag darzustellen.
}

Zugriffskontrolle und Parameterabstimmung zeichnen nur einige Teile auf, von denen einige bei der Arbeit verwendet werden können. Ich werde mir später Notizen zur SSL-Konfiguration machen. Der schriftliche Einstellungstest im Frühjahr ist sehr schwierig, also lernen Sie fleißig ...

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Nginx-Reverseproxy und Lastausgleichspraxis
  • Lösung für den Konflikt zwischen Nginx und Backend-Port
  • Tiefgreifendes Verständnis der Matching-Logik von Server und Standort in Nginx
  • Detaillierte Erklärung der Best Practices für Django + uwsgi + Nginx online
  • So steigern Sie Ihre Web-Performance um das Dreifache, indem Sie einen Parameter in Nginx aktivieren
  • So verwenden Sie PHP zum Zählen der User-Agent-Daten von Nginx-Protokollen
  • So fügen Sie Nginx zu den Systemdiensten in CentOS7 hinzu
  • So stellen Sie mit Nginx mehrere Vue-Projekte unter demselben Domänennamen bereit und verwenden einen Reverse-Proxy
  • Python-Implementierungsbeispiel zum Überwachen von Unterschieden in Nginx-Konfigurationsdateien und Senden von E-Mail-Benachrichtigungen
  • So blockieren und verbieten Sie Webcrawler im Nginx-Server

<<:  Detaillierte Erklärung zur Verwendung mehrerer Timer in CocosCreator

>>:  Eine vorläufige Studie zu zusammengesetzten Primärschlüsseln und gemeinsamen Primärschlüsseln in SQL-Anweisungen

Artikel empfehlen

Detaillierte Erklärung zu Drag-Time und Drag-Case in JavaScript

Inhaltsverzeichnis DragEvent-Schnittstelle Übersi...

Vue implementiert Modal-Komponente basierend auf Teleport

Inhaltsverzeichnis 1. Lernen Sie Teleport kennen ...

Zusammenfassung der verschiedenen Haltungen der MySQL-Berechtigungseskalation

Inhaltsverzeichnis 1. Schreiben Sie Webshell in d...

Über Generika der C++ TpeScript-Reihe

Inhaltsverzeichnis 1. Vorlage 2. Generika 3. Gene...

Top 10 Js Bildverarbeitungsbibliotheken

Inhaltsverzeichnis einführen 1. Pica 2. Lena.js 3...

So installieren Sie Babel mit NPM in VSCode

Vorwort Im vorherigen Artikel wurde die Installat...

So verwenden Sie das Schreiben von Dateien zum Debuggen einer Linux-Anwendung

Unter Linux ist alles eine Datei, daher besteht d...

Teilen des JS-nativen Quellcodes des Spiels 2048 (das Neueste im Internet)

Ich habe mich kürzlich mit Algorithmen beschäftig...

CSS3 realisiert verschiedene grafische Effekte kleiner Pfeile

Es ist großartig, CSS zu verwenden, um verschiede...

Eine kurze Erläuterung der Rolle und Funktionsweise von Schlüsseln in Vue3

Welche Funktion hat dieses Schlüsselattribut? Sch...

So löschen Sie den gesamten Inhalt eines Verzeichnisses mit Ansible

Studierende, die Ansible verwenden, wissen, dass ...

Die Fallstricke bei der Beurteilung von NULL-Werten in MySQL

Inhaltsverzeichnis Vorwort MySQL-Fall mit Syntax:...