Fassen Sie zusammen, wie Sie die Nginx-Leistung bei hoher Parallelität optimieren können

Fassen Sie zusammen, wie Sie die Nginx-Leistung bei hoher Parallelität optimieren können

Wir werden uns am Ende treffen, an einem Ort, an dem es keine Dunkelheit gibt. ~George, 1984

Nginx ist wie Apache ein Webserver. Basierend auf dem REST-Architekturstil verwendet es den Uniform Resource Descriptor (URl) oder den Uniform Resource Locator (URL) als Kommunikationsbasis und stellt verschiedene Netzwerkdienste über das HTTP-Protokoll bereit.

Apache hat eine lange Geschichte und ist unbestritten der größte Server der Welt. Es bietet viele Vorteile: Stabilität, Open Source, plattformübergreifend und so weiter. Ihr Aufkommen liegt schon zu lange zurück und als sie entstand, war die Internetbranche noch weit weniger entwickelt als heute. Es ist also als Schwergewicht konzipiert. Es werden keine Server mit hoher gleichzeitiger Nutzung unterstützt. Das Ausführen von Zehntausenden gleichzeitigen Zugriffen auf Apache führt dazu, dass der Server eine große Menge an Speicher verbraucht. Das Umschalten des Betriebssystems zwischen Prozessen oder Threads verbraucht ebenfalls eine große Menge an CPU-Ressourcen, was zu einer Verringerung der durchschnittlichen Antwortgeschwindigkeit von HTTP-Anfragen führt.

All dies führte dazu, dass Apache kein Hochleistungs-Webserver werden konnte, und so entstand der leichte Server mit hoher Parallelitätsleistung Nginx.

Merkmale

Es handelt sich um einen leistungsstarken HTTP- und Reverse-Proxy-Webserver, der einfache IMAP/POP3/SMTP-Dienste bereitstellt. Er wurde am 4. Oktober 2004 veröffentlicht (die erste öffentliche Version 0.1.0). Die stabile Version 1.4.0 von Nginx wurde am 24. April 2013 veröffentlicht. Nginx ist ein plattformübergreifender Server, der in der Programmiersprache C geschrieben ist. Nginx verfügt über eine eigene Funktionsbibliothek und mit Ausnahme von zlib, PCRE und OpenSSL verwendet das Standardmodul nur Funktionen der System-C-Bibliothek.

Vorteile

Nimmt weniger Speicher ein (bei 3 W gleichzeitigen Verbindungen verbrauchen die 10 geöffneten Nginx-Prozesse etwa 150 MB Speicher). Hohe Parallelitätsfähigkeit (offizielle Tests können 5 W gleichzeitige Verbindungen unterstützen und in tatsächlichen Produktionsumgebungen können 2–3 W gleichzeitige Verbindungen erreicht werden). Einfach (Konfigurationsdateien sind leicht zu verstehen). Preis (kostenlos, Open Source). Unterstützt Rewriter-Umschreibung (kann HTTP-Anfragen nach Domänennamen und URLs in verschiedene Back-End-Servergruppen aufteilen). Integrierte Integritätsprüfung (wenn mehrere Dienste auf dem Nginx-Backend ausfallen, hat dies keine Auswirkungen auf den Frontend-Zugriff und kann den Dienststatus automatisch erkennen). Spart Bandbreite (unterstützt GZIP-Komprimierung und kann lokale Cache-Header des Browsers hinzufügen).
Hohe Stabilität, Reverse-Proxy, selten Ausfallzeiten. Zu den Benutzern von Nginx-Websites auf dem chinesischen Festland zählen: Baidu, JD.com, Sina, NetEase, Tencent, Taobao usw.

Funktion: Webserver, leichtgewichtig; Lastverteilung; Cache; hohe Parallelität

Anwendungsszenarien: Proxyserver; IP-Last, statische Last; dynamische und statische Trennung; Strombegrenzung, Gesundheitsüberwachung

Installation und Befehle

Installieren:

sudo apt-get installiere nginx

Version anzeigen

nginx -v                  
Nginx-Version: nginx/1.18.0 (Ubuntu)

Grundlegende Befehle

# Der genaue Speicherort der Zugriffsseite von nginx (Willkommen bei nginx) vi /usr/share/nginx/html/index.html
# Zugriffs-IP
Locken 192.168.100.111
#Beenden Sie den Nginx-Prozess nginx -s stop
# Starten Sie den Nginx-Prozess /usr/sbin/nginx # Das von yum installierte Nginx kann auch servic nginx start verwenden
# Überprüfen Sie, ob die Konfigurationsdatei korrekt ist nginx –t
# Konfigurationsdatei neu laden nginx –s reload
# Sehen Sie sich das Protokoll an tail -f Dateiname #Die Anzeigedatei umfasst standardmäßig 10 Zeilen, aktualisieren Sie die Anzeige # Beispiel: tail -f /var/log/lvs-agent.log tail -f /etc/nginx/nginx.conf
# Zeigen Sie die letzten Zeilen der Datei an tail -n Zeilennummer Dateiname Beispiel: tail -n 100 /var/log/aa.log
# Löschen Sie die Netzwerkkarten-IP
IP-Adresse del 192.168.11.5/32 dev lo (lo eth1 eth2)
# lvs löscht alle Clusterdienste ipvsadm –C
# Holen Sie sich den IP-Wert der Netzwerkkarte eth0 ip a|grep eth0|grep inet|awk '{print $2}'|cut -d "/" -f1
# Überprüfen Sie, ob die IP oder URL verfügbar ist, und geben Sie 200 zurück.
curl -I -m 10 -o /dev/null -s -w %{http_code} 10.110.26.10:8080
# Starten Sie das JAR-Paket im Hintergrund nohup java -jar /usr/sbin/Projektname.jar >>/var/log/Projektname.log 2>&1 &
# Überprüfen Sie, ob der vorherige Befehl erfolgreich ausgeführt wurde. Geben Sie 0 zurück, wenn er erfolgreich ausgeführt wurde. Andernfalls echo $?
# Überprüfen Sie, ob der Nginx-Prozess gestartet ist. Dieser Befehl wird im Code verwendet, um zu bestimmen, ob der nginx-Prozess gestartet wird. Wenn Sie nur ps aux | grep nginx verwenden, wird der Inhalt zurückgegeben, auch wenn er nicht gestartet wird, was die Beurteilung beeinflusst ps aux | grep nginx | ​​​​greo –v grep

Konfigurationsdateien

nginx.conf

# nginx.conf
# Globaler Konfigurationsbereich Benutzer www-data;
Arbeiterprozesse automatisch;
pid /run/nginx.pid;
Fügen Sie /etc/nginx/modules-enabled/*.conf ein.
# Netzwerkereigniskonfigurationsbereich Ereignisse {
	Arbeiterverbindungen 768;
	# multi_accept ein;
}
# HTTP-Modul http {
	##
	# Globale HTTP-Einstellungen ##
	sendfile an;
	tcp_nopush ein;
	tcp_nodelay ein;
	KeepAlive-Timeout 65;
	Typen_Hash_max_Größe 2048;
	# Server-Tokens aus;
	# Servernamen_Hash_Bucket_Größe 64;
	# Servername_in_Umleitung aus;
	/etc/nginx/mime.types einschließen;
	Standardtyp Anwendung/Oktett-Stream;
	##
	# SSL-Einstellungen ##
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # SSLv3 wird gelöscht, Ref.: POODLE
	ssl_prefer_server_ciphers ein;
	##
	# Protokolleinstellungen ##
	Zugriffsprotokoll /var/log/nginx/access.log;
	Fehlerprotokoll /var/log/nginx/error.log;
	##
	# Einstellungen zur Ressourcenkomprimierung ##
	gzip on; # Standardmäßig aktiviert # gzip_vary on;
	# beliebiger gzip_proxied;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types Text/Klartext/CSS-Anwendung/JSON-Anwendung/Javascript-Text/XML-Anwendung/XML-Anwendung/XML+RSS-Text/Javascript;
	##
	# Virtueller Host-Konfiguration ##
	schließen Sie /etc/nginx/conf.d/*.conf ein;
	schließen Sie /etc/nginx/sites-enabled/* ein;
}

/etc/nginx/sites-enabled/*

Server { # Konfiguration des virtuellen Hosts listen 80 default_server; # Abhörport listen [::]:80 default_server;
	# SSL-Konfiguration #
	# abhören 443 SSL-Standardserver;
	# hören [::]:443 ssl Standardserver;
	#
	# Hinweis: Sie sollten gzip für SSL-Verkehr deaktivieren.
	# Siehe: https://bugs.debian.org/773332
	#
	# Informieren Sie sich über SSL-Chiffren, um eine sichere Konfiguration sicherzustellen.
	# Siehe: https://bugs.debian.org/765782
	#
	# Selbst signierte Zertifikate, die vom SSL-Zertifikat-Paket generiert wurden
	# Verwenden Sie sie nicht auf einem Produktionsserver!
	#
	# snippets/snakeoil.conf einschließen;	
	# Datencache-Speicherort root /var/www/html;
	# Fügen Sie index.php zur Liste hinzu, wenn Sie PHP verwenden
	index index.html index.htm index.nginx-debian.html;	
	#Domänenname, es kann mehrere Servernamen _ geben;	
	# Führen Sie einen Reverse-Proxy für / location / { aus.
		# Versuchen Sie zunächst, die Anfrage als Datei zu übermitteln.
		# als Verzeichnis, dann zurück auf die Anzeige einer 404-Fehlermeldung.
		# uwsgi_pass 127.0.0.1:8000;
		#include /etc/nginx/uwsgi_params;
		versuche_dateien $uri $uri/ =404;
	}
	# PHP-Skripte an den FastCGI-Server übergeben
	#
	#Standort ~ \.php$ {
	# snippets/fastcgi-php.conf einschließen;
	#
	# # Mit php-fpm (oder anderen Unix-Sockets):
	# fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	# # Mit php-cgi (oder anderen TCP-Sockets):
	# fastcgi_pass 127.0.0.1:9000;
	#}
	# Zugriff auf .htaccess-Dateien verweigern, wenn das Apache-Dokumentenstammverzeichnis
	# stimmt mit nginx überein
	#
	#Standort ~ /\.ht {
	# alles ablehnen;
	#}
}

Proxy-Modus und Reverse-Proxy-Konfiguration

Weiterleitungsproxy:

Es handelt sich um einen Server (Proxyserver), der sich zwischen dem Client (Benutzer A) und dem Ursprungsserver (Ursprungsserver) (Zielserver) befindet. Um Inhalte vom Ursprungsserver abzurufen, sendet der Client eine Anfrage an den Proxyserver und gibt das Ziel (Ursprungsserver) an. Der Proxyserver leitet die Anfrage dann an den Ursprungsserver weiter und gibt die abgerufenen Inhalte an den Client zurück. Um einen Forward-Proxy zu verwenden, muss der Client eine spezielle Konfiguration durchführen. Wenn es keine besondere Erklärung gibt, ist mit der Proxy-Technologie im Allgemeinen standardmäßig die Forward-Proxy-Technologie gemeint.

Es entspricht einem professionellen Vermittler, und der Client und der eigentliche Server können nicht kommunizieren. Der Client weiß, dass er ein Vermittler ist.

Reverse-Proxy:

Im Gegensatz zu einem Forwardproxy erscheint er dem Client wie ein Ursprungsserver und der Client muss keine spezielle Konfiguration vornehmen. Der Client sendet eine normale Anforderung an den Inhalt im Namespace des Reverse-Proxys. Der Reverse-Proxy ermittelt dann, wohin die Anforderung weitergeleitet werden soll (zum ursprünglichen Server), und gibt den erhaltenen Inhalt an den Client zurück, als ob der Inhalt ursprünglich ihm gehört hätte.

Es ist vergleichbar mit einer Person, die ein Haus kauft und verkauft. Beim Kauf eines Hauses gibt es einen Käufer im Verhältnis zum Verkäufer, und beim Verkauf eines Hauses gibt es einen Verkäufer im Verhältnis zum Käufer.
Der Client weiß nicht, dass es sich um einen Proxyserver handelt, und auch der Server denkt, dass es sich lediglich um einen Client und nicht um einen Proxyserver handelt.

Transparenter Proxy:

Transparenter Proxy bedeutet, dass der Client die Existenz des Proxy-Servers überhaupt nicht kennen muss. Er passt Ihre Anfragefelder (Nachrichten) an und überträgt die echte IP. Beachten Sie, dass ein verschlüsselter transparenter Proxy ein anonymer Proxy ist. Dies bedeutet, dass Sie keinen Proxy einrichten müssen. Ein Beispiel für eine transparente Proxy-Praxis ist die Verhaltensmanagement-Software, die heutzutage von vielen Unternehmen verwendet wird.

Bildbeschreibung hier einfügen

# Reverse-Proxy ist standardmäßig deaktiviert. # Upstream-Localhost ist ein Drittanbietermodul, das Upstream-Localhost ausgleicht. {
	# Tatsächlicher Server: Server 192.168.136.133:8081;
	Server 192.168.136.133:8081;
	Server 192.168.136.133:8081;
} 
# Server laden {
	hören Sie 80 # Proxy-Server-Port Servername localhost;
	Standort / {
		proxy_pass http://localhost; # Senden Sie die Anfrage an einen der tatsächlichen Server }
}

Lastausgleichsmethode:

Polling-Methode (Standard)

Gewichtetes Round Robin (Gewicht)

Gerecht

URL-Hash

Quelladressen-Hashing

Least_conn

Trennung von statischer und dynamischer

Die dynamische und statische Trennung von Nginx bedeutet einfach die Trennung von dynamischen und statischen Anforderungen. Sie kann nicht einfach als physische Trennung dynamischer Seiten von statischen Seiten verstanden werden.

Genau genommen sollten dynamische Anforderungen von statischen Anforderungen getrennt werden. Dies kann so verstanden werden, dass Nginx zum Verarbeiten statischer Seiten und Tomcat zum Verarbeiten dynamischer Seiten verwendet wird.

Aus Sicht der aktuellen Implementierung können dynamische und statische Trennungen grob in zwei Typen unterteilt werden:

  • Eine Möglichkeit besteht darin, die statischen Dateien einfach in einen separaten Domänennamen auszulagern und auf einem separaten Server abzulegen. Dies ist derzeit auch die gängige Lösung.
  • Eine Möglichkeit besteht darin, dynamische und statische Dateien zusammen zu veröffentlichen und sie über nginx zu trennen

mkdir static #Statische Dateien speichern

Server { # Konfiguration des virtuellen Hosts listen 80 default_server; # Abhörport listen [::]:80 default_server;
	
	# Datencache-Speicherort root /var/www/html;

	# Fügen Sie index.php zur Liste hinzu, wenn Sie PHP verwenden
	index index.html index.htm index.nginx-debian.html;
	
	#Domänenname, es kann mehrere Servernamen _ geben;
	
	# Führen Sie einen Reverse-Proxy für / location / { aus.
		# Versuchen Sie zunächst, die Anfrage als Datei zu übermitteln.
		# als Verzeichnis, dann zurück auf die Anzeige einer 404-Fehlermeldung.
		# uwsgi_pass 127.0.0.1:8000;
		#include /etc/nginx/uwsgi_params;
		versuche_dateien $uri $uri/ =404;
	}
	# Wenn es eine dieser Dateierweiterungen ist, suchen Sie hier danach: Speicherort ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css) $ {
		Wurzel /statisch;
		läuft in 30 Tagen ab; # Cache-Gültigkeitsdauer }
}

Protokollverwaltung

Protokollformat

Das Protokoll wird in der Datei logs/access.log im Stammverzeichnis von Nginx generiert. Das Standardprotokollformat ist „main“. Sie können das Standardprotokollformat „main“ auch anpassen.

og_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr: Client-IP-Adresse (Proxyserver, zeigt die IP des Proxydienstes an)
$remote_user: Wird verwendet, um den Benutzernamen des Remote-Clients aufzuzeichnen (normalerweise "-")
$time_local: wird verwendet, um Zugriffszeit und Zeitzone aufzuzeichnen. $request: wird verwendet, um die angeforderte URL und Anforderungsmethode aufzuzeichnen. $status: Antwortstatuscode, zum Beispiel: 200 Erfolg, 404 Seite nicht gefunden usw.
$body_bytes_sent: Die Anzahl der Bytes des Dateiinhalts, die an den Client gesendet werden

Holzfällen

Nginx-Logdateien haben keine Rotationsfunktion

Schreiben Sie jeden Tag eine Protokolldatei. Wir können ein Nginx-Protokollschneideskript schreiben, um die Protokolldatei automatisch zu schneiden.

  • Der erste Schritt besteht darin, die Protokolldatei umzubenennen (keine Angst, die Protokolldatei zu verlieren, da nginx die Protokolldatei nach der Umbenennung nicht finden kann. Bevor Sie die Protokolldatei mit dem ursprünglichen Namen erneut öffnen, schreibt nginx das Protokoll dennoch in die von Ihnen umbenannte Datei. Linux findet die Datei anhand des Dateideskriptors und nicht anhand des Dateinamens).
  • Der zweite Schritt besteht darin, das USR1-Signal an den Nginx-Hauptprozess zu senden
    Nach dem Empfang des Signals liest der Nginx-Hauptprozess den Protokolldateinamen aus der Konfigurationsdatei und öffnet die Protokolldatei erneut (benannt nach der Protokolldatei in der Konfigurationsdatei) und verwendet den Benutzer des Arbeitsprozesses als Eigentümer der Protokolldatei. Nach dem erneuten Öffnen der Protokolldatei schließt der Nginx-Hauptprozess die Protokolldatei mit demselben Namen und benachrichtigt den Arbeitsprozess, die neu geöffnete Protokolldatei zu verwenden. Der Arbeitsprozess öffnet sofort die neue Protokolldatei und schließt die Protokolldatei mit demselben Namen. Anschließend können Sie die alte Protokolldatei verarbeiten. [Oder starten Sie den Nginx-Dienst neu]

Das Skript zum automatischen minütlichen Kürzen der Nginx-Protokolle lautet wie folgt:

Erstellen Sie ein neues Shell-Skript

Analyse einer Architektur mit hoher Parallelität

Was ist hohe Parallelität?

Hohe Parallelität ist einer der Faktoren, die beim Entwurf einer verteilten Systemarchitektur im Internet berücksichtigt werden müssen. Normalerweise bedeutet dies, dass das System so konzipiert ist, dass es viele Anfragen gleichzeitig parallel verarbeiten kann.

Zu den häufig verwendeten Indikatoren für hohe Parallelität zählen unter anderem Antwortzeit, Durchsatz, Abfragen pro Sekunde (QPS), Anzahl gleichzeitiger Benutzer usw.

  • Reaktionszeit: Die Zeit, die das System benötigt, um auf eine Anfrage zu antworten
  • Durchsatz: Die Anzahl der pro Zeiteinheit verarbeiteten Anfragen.
  • QPS: Anzahl der Anfragen pro Sekunde

Wie können die Parallelitätsfunktionen des Systems verbessert werden?

Zur Verbesserung der Parallelitätsfähigkeiten beim Entwurf verteilter Internetarchitekturen gibt es zwei methodische Hauptansätze: vertikale Erweiterung (ScaleUp) und horizontale Erweiterung (ScaleOut).

Vertikale Erweiterung: Verbessern Sie die Verarbeitungsleistung einer einzelnen Maschine. Es gibt zwei Möglichkeiten zur vertikalen Skalierung.

  • Verbessern Sie die Leistung eigenständiger Hardware
  • Verbesserung der Leistung der Einzelmaschinenarchitektur

In der Anfangszeit, als sich das Internetgeschäft sehr schnell entwickelte, wurde, sofern das Budget keine Rolle spielte, dringend empfohlen, die Methode „Steigerung der Leistung eigenständiger Hardware“ zu verwenden, um die Systemparallelitätsfähigkeiten zu verbessern. Denn zu dieser Phase bestand die Strategie der Unternehmen oft darin, das Geschäft zeitkritisch zu entwickeln, und die „Steigerung der Leistung eigenständiger Hardware“ war oft die schnellste Methode.

Unabhängig davon, ob die Hardwareleistung einer einzelnen Maschine oder die Leistung der Architektur einer einzelnen Maschine verbessert wird, besteht ein schwerwiegender Mangel: Die Leistung einer einzelnen Maschine hat immer ihre Grenzen. Daher ist die horizontale Erweiterung die ultimative Lösung für eine hohe Parallelität beim Entwurf verteilter Internetarchitekturen.

Horizontale Erweiterung: Durch einfaches Erhöhen der Serveranzahl lässt sich die Systemleistung linear erweitern.

Server haben Grenzen

Drei Wege zum Ziel

limit_conn_zone (Verbindungsfluss begrenzen)

limit_req_zone (Anforderungsfluss begrenzen)

ngx_http_upstream_module (Einschränkungen des Backend-Dienstes)

Hier ein kleines Tool: Begrenzen Sie den Download von Testtools

yum installiere http-tools -y
Schlüssel Bedeutung
Dokumentpfad Getestete Seite
Dokumentlänge Seitenformat
Gleichzeitigkeitsebene Gleichzeitige Anzahl, Anzahl gleichzeitiger Benutzer
Dauer der Tests Gesamte für Tests aufgewendete Zeit
Anfragen abschließen Gesamtzahl der Anfragen, gleichzeitige Verbindungen
Fehlgeschlagene Anfragen Die Anzahl der fehlgeschlagenen Anfragen
Schreibfehler Anzahl der Fehler
Anfragen pro Sekunde Anforderungsdurchsatz pro Sekunde
Zeit pro Anfrage Die Beantwortung jeder Anfrage nimmt Zeit in Anspruch

Begrenzen des Verbindungsflusses

http {
	# binary_remote_addr:IP
	# zone=one:10m; Beantragen Sie einen 10M-Speicherplatz zum Speichern der verbundenen IP
	Verbindungslimitzone $binary_remote_addr Zone=eins:10m;
	
	Server {
		# Im Zonenbereich werden jedes Mal 10 Verbindungen freigegeben und von nginx limit_conn one 10 verarbeitet;
	}
}

Begrenzung des Anforderungsflusses (Ratenbegrenzung)

http {
	# Rate bedeutet, dass jede Verbindung eine Verbindung pro Sekunde senden kann. limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
	
	Server {
		# brust: Token, füge jeweils eins hinzu, Fehler 503 wird gemeldet, nachdem 120 Token ausgegeben wurden
		limit_req Zone=req_one Brust=120;
	}
}

Einschränkungen des Hintergrunddienstes

Dieses Modul bietet die Backend-Strombegrenzungsfunktion, die wir brauchen

Dieses Modul hat einen Parameter: max_conns kann den Datenfluss des Servers begrenzen, kann jedoch nur in der kommerziellen Version von nginx verwendet werden

Nach nginx1.11.5 hat der Beamte diesen Parameter von der kommerziellen Version getrennt. Dies bedeutet, dass wir ihn verwenden können, solange wir die weit verbreiteten Versionen nginx1.9.12 und 1.10 in der Produktion aktualisieren

Server {
	# max_conns Maximale Anzahl empfangender Diensteserver 127.0.0.1:8080 max_conns=100;
}

Sicherheitskonfiguration

Versionssicherheit

http {
	Server-Tokens aus;
}

IP-Sicherheit

http {
	Standort / {
		erlauben 127.0.0.1; # Whitelist alle verweigern; # Blacklist }
}

Dateisicherheit

http {
	Standort /logs{
		Autoindex ein; # Verzeichnisstammverzeichnis /static anzeigen;
	}
	Standort ^/logs~*\.(log|txt)$ {
		add_header Inhaltstyp Text/Plain;
		Wurzel /statisch;
	}
}

Verbindungssicherheit

http {
	# SSL-Einstellungen
}

Nginx-Optimierung

Passen Sie die Hauptkonfigurationsdatei von Nginx an, um die Parallelität zu erhöhen

worker_processes 2;# Anpassen, um mit CPU-Ereignissen konsistent zu sein {
	# Maximale Anzahl gleichzeitiger Verbindungen pro Worker worker_connection 65535;
}

Nginx-Langverbindung: Nach HTTP1.1 unterstützt das HTTP-Protokoll dauerhafte Verbindungen, also Langverbindungen. Der Vorteil besteht darin, dass mehrere HTTP-Anfragen und -Antworten über eine TCP-Verbindung übertragen werden können.

Nginx-Langverbindungen und Kurzverbindungen können die Notfallwiederherstellungsfunktionen des Servers verbessern

Reduziert die Kosten und Latenz beim Herstellen und Schließen von Verbindungen. Wenn wir nginx als Reverse-Proxy oder Lastenausgleich verwenden, wird die lange Verbindungsanforderung des Clients in eine kurze Verbindung umgewandelt und an den Server gesendet. Um lange Verbindungen zu unterstützen, müssen wir einige Konfigurationen auf dem nginx-Server vornehmen.

Wenn Sie bei Verwendung von nginx lange Verbindungen erreichen möchten, müssen wir die folgenden zwei Dinge tun:

  • Vom Client zu Nginx ist es eine lange Verbindung (Ereignisse)
  • Von Nginx zum Server ist es eine lange Verbindung (http)

Für den Client übernimmt nginx tatsächlich die Rolle eines Servers. Umgekehrt ist nginx für den Server ein Client.

Ereignisse {
	# Keepalive-Timeout, der Standardwert beträgt 60 s. Denken Sie daran, dass dieser Parameter nicht zu groß eingestellt werden kann! Andernfalls belegen viele ungültige HTTP-Verbindungen die Anzahl der Nginx-Verbindungen und Nginx stürzt schließlich ab!
	KeepAlive-Timeout 60;
}
http {
	KeepAlive-Timeout 60;
}

Nginx-Komprimierung

Gzip-Komprimierungsfunktion: Die Komprimierungsfunktion kann vor dem Senden der Antwortnachricht an den Client aktiviert werden. Dadurch kann effektiv Bandbreite gespart und die Antwortgeschwindigkeit an den Client erhöht werden. Die Komprimierung beansprucht die CPU-Leistung von nginx.

Gzip-Komprimierung kann in den Modulen http, Server und Standort konfiguriert werden

http {
    #gzip-Moduleinstellungen #Komprimierung gzip aktivieren;
    # Legen Sie die Mindestanzahl an Bytes fest, die für komprimierte Seiten zulässig ist. Die Anzahl der Bytes für eine Seite ergibt sich aus der Inhaltslänge im Header.
    Der Standardwert ist 0, wodurch Seiten unabhängig von ihrer Größe komprimiert werden. Es wird empfohlen, den Wert auf mehr als 2 KB festzulegen. Wenn der Wert unter 2 KB liegt, kann sich die Komprimierung erhöhen.
    gzip_min_länge 2k;
    # Richten Sie das System so ein, dass mehrere Cache-Einheiten zum Speichern des Datenstroms mit den GZIP-Komprimierungsergebnissen abgerufen werden. Beispielsweise bedeutet 4 4k, dass der Speicher in Einheiten von 4k angefordert wird, was dem Vierfachen der ursprünglichen Datengröße in Einheiten von 4k entspricht. 4 8k bedeutet, dass die Einheit 8k ist, entsprechend der ursprünglichen Datengröße
    Fordern Sie das Vierfache des Gerätespeichers an.
    # Wenn nicht festgelegt, wird als Standardwert dieselbe Speicherplatzgröße wie für die Originaldaten angewendet, um das Ergebnis der GZIP-Komprimierung zu speichern.
    gzip_puffer 4 16k;
    #Komprimierungsstufe, 1-10, je größer die Zahl, desto besser die Komprimierung, aber auch desto mehr CPU-Zeit wird benötigt gzip_comp_level 5;
    # Standardwert: gzip_types text/html (js/css-Dateien werden standardmäßig nicht komprimiert)
    # Komprimierungstyp, entspricht dem MIME-Typ für die Komprimierung. # Platzhaltertext/* kann nicht verwendet werden.
    # (unabhängig davon, ob es angegeben ist) text/html wird standardmäßig komprimiert. # Informationen zum Festlegen des zu komprimierenden Textdateityps finden Sie in conf/mime.types.
    gzip_types Text/einfache Anwendung/xJavascript-Text/CSS-Anwendung/Xml;
    # Der Wert ist 1.0 und 1.1 und gibt an, ob das HTTP-Protokoll 1.0 komprimiert werden soll. Wenn 1.0 ausgewählt ist, können sowohl 1.0 als auch 1.1 komprimiert werden. gzip_http_version 1.0
    # Komprimierung für IE6 und darunter deaktivieren gzip_disable "MSIE [1-6]\.";
    # Standardwert: aus
    # Aktivieren Sie, wenn Nginx als Reverse-Proxy verwendet wird, und schalten Sie die vom Backend-Server zurückgegebenen Ergebnisse ein oder aus. Voraussetzung für die Übereinstimmung ist, dass der Backend-Server einen Header mit „Via“ zurückgeben muss.
    # off – deaktiviert die Komprimierung aller Proxy-Ergebnisdaten # expired – aktiviert die Komprimierung, wenn der Header „Expires“ enthalten ist # no-cache – aktiviert die Komprimierung, wenn der Header „Cache-Control: no-cache“ enthalten ist # no-store – aktiviert die Komprimierung, wenn der Header „Cache-Control: no-store“ enthalten ist # private – aktiviert die Komprimierung, wenn der Header „Cache-Control: private“ enthalten ist # no_last_modified – aktiviert die Komprimierung, wenn der Header „Last-Modified“ nicht enthalten ist # no_etag – aktiviert die Komprimierung, wenn der Header „ETag“ nicht enthalten ist # auth – aktiviert die Komprimierung, wenn der Header „Authorization“ enthalten ist # any – aktiviert die Komprimierung bedingungslos gzip_proxied expired no-cache no-store private Auth;
    # Für CDN- und Proxy-Server können für dieselbe URL komprimierte und unkomprimierte Kopien basierend auf den Header-Informationen gzip_vary zurückgegeben werden
}

Zustandsüberwachung

Server {
	Standort /NginxStatus {
		stub_status ein;
		Zugriff_Abmeldung;
	}
}

Plugin Installation

./configure --prefix=... --with-http_stub_status _module

Oben finden Sie eine detaillierte Zusammenfassung zur Optimierung der Nginx-Leistung bei hoher Parallelität. Weitere Informationen zur Leistungsoptimierung von Nginx bei hoher Parallelität finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Eine kurze Diskussion über die Kerneloptimierung mit hoher Parallelität bei Nginx10m+
  • Detaillierte Erläuterung der Nginx-Optimierung in Szenarien mit hoher Parallelität
  • Nginx+Lua+Redis erstellt hochparallele Webanwendungen
  • Ein Beispiel für die Verwendung eines Lvs+Nginx-Clusters zum Erstellen einer Architektur mit hoher Parallelität

<<:  Verwenden von CSS3 zum Implementieren eines Schriftfarbverlaufs

>>:  Sitemesh-Tutorial – Grundsätze und Anwendungen der Seitendekorationstechnologie

Artikel empfehlen

Vue verwendet el-table, um Spalten und Zeilen dynamisch zusammenzuführen

In diesem Artikelbeispiel wird der spezifische Co...

mysql charset=utf8 verstehen Sie wirklich, was es bedeutet

1. Schauen wir uns zunächst eine Anweisung zur Ta...

Detaillierte Erklärung langer Transaktionsbeispiele in MySQL

Vorwort: Die Artikelserie „Erste Schritte mit MyS...

Vue implementiert eine kleine Wettervorhersageanwendung

Dies ist eine Website, die ich nachgeahmt habe, a...

CentOS 7-Konfiguration Tomcat9+MySQL-Lösung

Tomcat konfigurieren Installieren Sie zuerst Tomc...

Beispielcode zur Implementierung der MySQL-Master-Slave-Replikation in Docker

Inhaltsverzeichnis 1. Übersicht 1. Grundsatz 2. U...

So zeigen Sie JSON-Daten in HTML an

Hintergrund: Manchmal müssen wir JSON-Daten direk...

So installieren Sie Docker auf CentOS

Hier stellen wir nur die relativ einfache Install...

So ändern Sie die Zeit in der virtuellen CentOS-Maschine

Das obere Bild zeigt die Systemzeit und das unter...