1. Lackübersicht 1. Einführung in Varnish Varnish ist ein leistungsstarker Open-Source-Reverse-Proxy-Server und HTTP-Beschleuniger, der eine neue Softwarearchitektur verwendet und eng mit aktuellen Hardwaresystemen zusammenarbeitet. Im Vergleich zum herkömmlichen Squid bietet Varnish die Vorteile einer hohen Leistung, hohen Geschwindigkeit und einfacheren Verwaltung. Derzeit versuchen viele große Websites, Squid durch Varnish zu ersetzen. Dies ist der grundlegendste Grund für die rasante Entwicklung von Varnish. Hauptmerkmale von Varnish: (1) Cache-Proxy-Speicherort: Es kann entweder der Speicher oder die Festplatte verwendet werden. 2. Vergleich und Ähnlichkeiten zwischen Varnish und Squid
Vorteile von Lack (1) Stabilität: Wenn Varnish und Squid dieselbe Arbeitslast bewältigen, ist die Wahrscheinlichkeit eines Serverausfalls bei Squid höher als bei Varnish, da Squid häufig neu gestartet werden muss. Nachteile von Lack (1) Sobald der Varnish-Prozess neu gestartet wird, werden die zwischengespeicherten Daten vollständig aus dem Speicher freigegeben. Zu diesem Zeitpunkt werden alle Anforderungen an den Backend-Server gesendet. Bei hoher Parallelität wird der Backend-Server stark belastet. Lösungen für die Nachteile von Lacken Zu Nachteil 1: Bei großem Datenverkehr empfiehlt es sich, den Speichercache-Modus von Varnish zu verwenden, und es müssen mehrere Squid/nginx-Server folgen. Dies dient hauptsächlich dazu, zu verhindern, dass eine große Anzahl von Anforderungen Varnish durchdringt, wenn der vorherige Varnish-Dienst oder -Server neu gestartet wird. Auf diese Weise kann Squid / nginx als Cache der zweiten Ebene fungieren und auch das Problem ausgleichen, dass der Varnish-Cache im Speicher beim Neustart freigegeben wird. 3. Wie Varnish funktioniert Wenn der Varnish-Server eine Anfrage von einem Client erhält, prüft er zunächst, ob sich Daten im Cache befinden. Ist dies der Fall, antwortet er direkt dem Client. Ist dies nicht der Fall, fordert er die entsprechende Ressource vom Backend-Server an, speichert sie lokal auf dem Varnish-Server im Cache und antwortet dann dem Client. Wählen Sie anhand der Regeln und des Typs der angeforderten Seite aus, ob die Daten zwischengespeichert werden müssen. Sie können anhand des Cache-Contorl im Anforderungsheader und anhand der Markierung des Cookies bestimmen, ob zwischengespeichert werden soll. Diese Funktionen können durch das Schreiben von Konfigurationsdateien implementiert werden. 4. Lackieren Sie einfache Architektur Varnish ist in Verwaltungsprozess und Kindprozess unterteilt
Gemeinsame Threads, die von untergeordneten Prozessen generiert werden, sind
5. Hauptkonfigurationsteil von Varnish
6. VCL verfügt über integrierte voreingestellte Variablen: Variablen (auch Objekte genannt): Wie gezeigt (1) req: Variablen, die verfügbar sind, wenn der Client den Varnish-Server anfordert; Kunde Clientet.ip: Gibt die IP-Adresse des Clients zurück Server Server.hostname: Server-Hostname Clientanforderung req (das von der Clientanforderung gesendete Objekt)
Varnish fordert den Backend-Server (bereq) an
Der Backend-Server gibt Daten an Varnish beresq zurück
Lagerung
7. Spezifische Funktionsanweisungen
8. Schritte zur Verarbeitung von Varnish-Anfragen Wie gezeigt Schritte zur Verarbeitung von Varnish-Anfragen Empfangsstatus (vcl_recv). Das heißt, der Eintrittsstatus der Anforderungsverarbeitung. Gemäß den VCL-Regeln wird bestimmt, ob die Anforderung durchgelassen (vcl_pass) oder weitergeleitet (vcl_pipe) werden oder in die Suche (lokale Abfrage) eintreten soll. Die Subroutine vcl_recv: startet die Verarbeitung der Anforderung über die Rückgabe (Aktion); 2. Varnish installieren Link zum Herunterladen des Varnish-Pakets: https://pan.baidu.com/s/1OfnyR-5xFuxMUYJTnhQesA Extraktionscode: m9q4 Zusätzlich zu einem Varnish-Server können Sie zwei weitere Webserver eröffnen, um Webseiten bereitzustellen. [root@localhost ~]# yum -y installiere autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python-docutils python-sphinx [root@localhost ~]# tar zxf varnish-4.0.3.tar.gz [root@localhost ~]# cd varnish-4.0.3/ [root@localhost varnish-4.0.3]# ./configure && make && make install [root@localhost varnish-4.0.3]# cp etc/example.vcl /usr/local/var/varnish/ //Kopieren Sie die Varnish-Hauptkonfigurationsdatei [root@localhost /]# vim /usr/local/var/varish/example.vcl //Bearbeiten Sie die Varnish-Masterkonfiguration, um die ursprüngliche Änderung vcl 4.0 anzuzeigen. Importdirektoren; std importieren; Backend-Standard { .host = "127.0.0.1"; .port = "80"; } Probe backend_healthcheck { .url="/"; .Intervall = 5s; .Zeitüberschreitung = 1s; .Fenster = 5; .Schwellenwert = 3; } Backend web1 { .host = "192.168.148.132"; .port = "80"; .probe = backend_healthcheck; } Backend Web2 { .host = "192.168.148.133"; .port = "80"; .probe = backend_healthcheck; } ACL-Plünderer { "127.0.0.1"; "lokaler Host"; "192.168.148.0/24"; !"192.168.148.133"; } unter vcl_init { neuer Webcluster = Direktoren.round_robin(); web_cluster.add_backend(web1); web_cluster.add_backend(web2); } //Lösche alle Originale und füge das folgende Sub vcl_recv { hinzu. setze req.backend_hint = web_cluster.backend(); wenn (req.method == "PURGE") { wenn (!client.ip ~ purgers) { return (synth(405, "Nicht zulässig.")); } zurückgeben (bereinigen); } wenn (req.method != "GET" && req.method != "HEAD" && Anforderungsmethode != "PUT" && Anforderungsmethode != "POST" && Anforderungsmethode != "TRACE" && req.method != "OPTIONEN" && req.method != "PATCH" && req.method != "LÖSCHEN") { Rücklauf (Rohr); } wenn (req.method != "GET" und req.method != "HEAD") { Rückpass); } wenn (req.url ~ "\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)") { Rückpass); } wenn (req.http.Accept-Encoding) { if (req.url ~ "\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$") { req.http.Accept-Encoding aufheben; } elseif (req.http.Accept-Encoding ~ "gzip") { setze req.http.Accept-Encoding = "gzip"; } elseif (req.http.Accept-Encoding ~ "deflate") { setze req.http.Accept-Encoding = "deflate"; } anders { req.http.Accept-Encoding aufheben; } } if (req.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") { req.http.cookie nicht gesetzt; Rückgabe (Hash); } wenn (req.restarts == 0) { wenn (req.http.X-Forwarded-For) { setze req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } anders { setze req.http.X-Forwarded-For = client.ip; } } Rückgabe (Hash); } sub vcl_hash { hash_data(erforderliche URL); wenn (req.http.host) { hash_data(req.http.host); } anders { hash_data(server.ip); } zurückgeben (nachschlagen); } unter vcl_hit { wenn (req.method == "PURGE") { return (synth(200, "Gelöscht.")); } zurückgeben (liefern); } unter vcl_miss { wenn (req.method == "PURGE") { return (synth(404, "Gelöscht.")); } zurückgeben (holen); } unter vcl_deliver { if (Objekttreffer > 0) { setze resp.http.CXK = "HIT-aus-Lack"; setze resp.http.X-Cache-Hits = obj.hits; } anders { setze resp.http.X-Cache = "MISS"; } nicht gesetzt bzw. http.X-Powered-By; nicht gesetzt bzw. http.Server; nicht gesetzt bzw. http.X-Drupal-Cache; nicht gesetzt bzw. http.Via; nicht gesetzt bzw. http.Link; nicht gesetzt bzw. http.X-Varnish; setze resp.http.xx_restarts_count = req.restarts; setze resp.http.xx_Age = resp.http.Age; setze resp.http.hit_count = obj.hits; nicht gesetzt bzw. http.Alter; zurückgeben (liefern); } sub vcl_purge { return (Synth (200, "Erfolg")); } sub vcl_backend_error { wenn (beresp.status == 500 || beresp.status == 501 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) { Rückkehr (Wiederholen); } } sub vcl_fini { zurück (ok); } [root@localhost /]# varnishd -f /usr/local/var/varnish/example.vcl -s malloc,200M -a 0.0.0.0:80 //Starten Sie den Dienst Die erste Webseite [root@localhost ~]# yum -y installiere httpd [root@localhost ~]# echo aaa > /var/www/html/index.html [root@localhost ~]# systemctl stoppe Firewall [root@localhost ~]# systemctl start httpd Kanal 2 [root@localhost ~]# yum -y installiere httpd [root@localhost ~]# echo bbb > /var/www/html/index.html [root@localhost ~]# systemctl stoppe Firewall [root@localhost ~]# systemctl start httpd Wenn Sie Varnishd wie folgt neu starten: [root@localhost /]# netstat -anpt | grep 80 [root@localhost /]# killall -9 varnishd [root@localhost /]# varnishd -f /usr/local/var/varnish/example.vcl -s malloc,200M -a 0.0.0.0:80 Der Clientzugriff erfolgt wie folgt: Aktualisieren [root@localhost /]# curl -X "PURGE" 192.168.148.130 // Cache leeren Erläuterung der Varnish-Konfigurationsdatei vcl 4.0; Importdirektoren; std importieren; # Standard-Backend-Definition. Legen Sie diese so fest, dass sie auf Ihren Inhaltsserver verweist. Probe backend_healthcheck { .url="/"; #Greifen Sie auf den Stammpfad des Backend-Servers zu.Interval = 5s; #Anforderungszeitintervall.Timeout = 1s; #Anforderungs-Timeout.Window = 5; #Geben Sie die Anzahl der Abfragen auf 5 Mal an.Threshold = 3; #Wenn es 3 Fehler gibt, bedeutet dies, dass der Backend-Server nicht normal ist} backend web1 { #definieren Sie den Backend-Server.host = "192.168.1.7"; #IP oder Domänenname des Hosts (also des Backend-Hosts), der umgeleitet werden soll.port = "80"; #geben Sie die Portnummer des Backend-Servers an.probe = backend_healthcheck; #Healthcheck ruft den durch backend_healthcheck definierten Inhalt auf} Backend Web2 { .host = "192.168.1.8"; .port = "80"; .probe = backend_healthcheck; } acl purgers { #Zugriffskontrollliste "127.0.0.1" definieren; "lokaler Host"; "192.168.1.0/24"; !"192.168.1.8"; } sub vcl_init { #Rufen Sie vcl_init auf, um die Subroutine zu initialisieren und die Backend-Hostgruppe, d. h. die Direktoren, zu erstellen. new web_cluster = directors.round_robin(); #Verwenden Sie das neue Schlüsselwort, um ein Director-Objekt zu erstellen und verwenden Sie den Round_Robin-Algorithmus web_cluster.add_backend(web1); #Fügen Sie einen Back-End-Serverknoten hinzu web_cluster.add_backend(web2); } unter vcl_recv { set req.backend_hint = web_cluster.backend(); #Geben Sie den Backend-Knoten der Anforderung an web_cluster definierter Backend-Knoten if (req.method == "PURGE") { #Beurteilen Sie, ob der Anforderungsheader des Clients PURGE ist if (!client.ip ~ purgers) { #Wenn ja, prüfen Sie, ob die IP-Adresse des Clients in der ACL-Zugriffskontrollliste steht. return (synth(405, "Nicht zulässig.")); #Wenn nicht, gib einen 405-Statuscode an den Client zurück und gib die definierte Seite zurück. } return (purge); #Wenn es durch ACL definiert ist, wird es durch Purge behandelt. } wenn (req.method != "GET" && req.method != "HEAD" && Anforderungsmethode != "PUT" && Anforderungsmethode != "POST" && Anforderungsmethode != "TRACE" && req.method != "OPTIONEN" && req.method != "PATCH" && req.method != "DELETE") { #Beurteilen Sie den Anforderungstyp des Clients return (Pipe); } wenn (req.method != "GET" und req.method != "HEAD") { return (pass); #Wenn es nicht GET oder HEAD ist, übergeben Sie es. } wenn (req.url ~ "\.(php|asp|aspx|jsp|do|ashx|shtml)($|\?)") { return (pass); #Wenn der Client auf eine Datei mit der Endung .php zugreift, übergeben Sie sie zur Verarbeitung an „pass“. } wenn (req.http.Accept-Encoding) { if (req.url ~ "\.(bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)$") { unset req.http.Accept-Encoding; #Stornieren Sie den vom Client empfangenen Komprimierungstyp} elseif (req.http.Accept-Encoding ~ "gzip") { set req.http.Accept-Encoding = "gzip"; #Wenn ein Gzip-Typ vorhanden ist, markieren Sie den Gzip-Typ. } elseif (req.http.Accept-Encoding ~ "deflate") { setze req.http.Accept-Encoding = "deflate"; } anders { unset req.http.Accept-Encoding; #Andere undefinierte Seiten heben auch den vom Client empfangenen Komprimierungstyp auf. } } if (req.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") { unset req.http.cookie; #Den Cookie-Wert des Clients abbrechen. return (Hash); #Leitet die Anforderung an die Hash-Subroutine weiter, d. h. überprüft den lokalen Cache. } if (req.restarts == 0) { #Beurteilen Sie, ob es sich um die erste Anfrage vom Client handelt. if (req.http.X-Forwarded-For) { #Wenn es die erste Anfrage ist, legen Sie die IP-Adresse des Clients fest. setze req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; } anders { setze req.http.X-Forwarded-For = client.ip; } } Rückgabe (Hash); } sub vcl_hash { hash_data(req.url); #Zeigen Sie die vom Client angeforderte Seite an und führen Sie ein Hashing durch wenn (req.http.host) { hash_data(req.http.host); #Host des Clients festlegen} else { hash_data(server.ip); #Server-IP festlegen } zurückgeben (nachschlagen); } unter vcl_hit { if (req.method == "PURGE") { #Wenn es HIT ist und der Client-Anforderungstyp PURGE ist, geben Sie den Statuscode 200 zurück und geben Sie die entsprechende Seite zurück. return (synth(200, "Gelöscht.")); } zurückgeben (liefern); } unter vcl_miss { wenn (req.method == "PURGE") { return (synth(404, "Gelöscht.")); #Wenn es ein Fehler ist, gib 404 zurück } zurückgeben (holen); } unter vcl_deliver { if (Objekttreffer > 0) { set resp.http.CXK = "HIT-from-varnish"; #HTTP-Header festlegen X-Cache = Hit set resp.http.X-Cache-Hits = obj.hits; #Gibt die Anzahl der Befehle zurück} else { setze resp.http.X-Cache = "MISS"; } unset resp.http.X-Powered-By; #Anzeige der Webversion abbrechenunset resp.http.Server; #Anzeige des Varnish-Dienstes abbrechenunset resp.http.X-Drupal-Cache; #Anzeige des zwischengespeicherten Frameworks abbrechenunset resp.http.Via; #Anzeige der Dateiinhaltsquelle abbrechenunset resp.http.Link; #Anzeige der HTML-Hyperlinkadresse abbrechenunset resp.http.X-Varnish; #Anzeige der Varnish-ID abbrechen set resp.http.xx_restarts_count = req.restarts; #Anzahl der Client-Anfragen festlegen set resp.http.xx_Age = resp.http.Age; #Länge der zwischengespeicherten Dateien anzeigen #set resp.http.hit_count = obj.hits; #Anzahl der Cache-Treffer anzeigen #unset resp.http.Age; zurückgeben (liefern); } unter vcl_pass { return (fetch); #Die vom Backend-Server zurückgegebenen Daten lokal zwischenspeichern} unter vcl_backend_response { setze beresp.grace = 5m; #zusätzliche Nachfrist zwischenspeichernwenn (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) { setze beresp.uncacheable = true; #Wenn der Backend-Server mit einem Statuscode von 449 usw. antwortet, nicht zwischenspeichern} wenn (bereq.url ~ "\.(php|jsp)(\?|$)") { setze beresp.uncacheable = true; #Wenn es eine PHP-Seite ist, wird sie nicht zwischengespeichert} else { wenn (bereq.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico)($|\?)") { setze beresp.ttl = 15m; #Wenn es mit dem oben genannten endet, zwischenspeichere es für 15 Minuten unset beresp.http.Set-Cookie; } elseif (bereq.url ~ "\.(gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") { setze beresp.ttl = 30m; #Cache für 30 Minuten, setze beresp.http.Set-Cookie zurück; } anders { setze beresp.ttl = 10m; #Lebensdauer 10 Minuten, nicht gesetzt beresp.http.Set-Cookie; } } zurückgeben (liefern); } sub vcl_purge { return (Synth (200, "Erfolg")); } sub vcl_backend_error { wenn (beresp.status == 500 || beresp.status == 501 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) { return (Wiederholen); #Wenn der Statuscode einer der oben genannten ist, erneut anfordern} } sub vcl_fini { zurück (ok); } 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:
|
<<: Vue realisiert Click-Flip-Effekt
>>: Vue realisiert den Card-Flip-Effekt
Nachteile von Tabellen 1. Tabellen nehmen mehr Byt...
Zusammenfassung: Im Folgenden finden Sie eine Met...
Installieren Sie Nginx Ziehen Sie zuerst das Cent...
Auf dem Win10-System ist MySQL8.0.20 lokal instal...
1. Unterabfrage MySQL 4.1 und höher unterstützen ...
Lebenslauf-Code: XML/HTML-CodeInhalt in die Zwisc...
1. CSV-Datei importieren Verwenden Sie den folgen...
Inhaltsverzeichnis 1. Schreiben Sie Webshell in d...
Das Installationstutorial der komprimierten Versi...
Inhaltsverzeichnis 1: Einführung in Galera-Cluste...
Abfrage des aktuellen Datums AKTUELLES DATUM AUSW...
Dieser Artikel beschreibt, wie MySQL 5.7 aus dem ...
HTML + CSS + JS imitieren den Helligkeitsanpassun...
Bereiten Sie die Zutaten wie oben gezeigt vor (ps...
Verwenden Sie CSS, um eine 3D-Fotowand zu erstell...