Warum statische Dateien mit Varnish zwischenspeichern, warum nicht übergeben?

9

Ich habe ein System mit Nginx / PHP-Fpm / Lack / WordPress und Amazon S3.

Jetzt habe ich mir beim Einrichten des Systems viele Konfigurationsdateien angesehen und in allen etwas Ähnliches gefunden:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

Ich verstehe nicht, warum das gemacht wird. In den meisten Beispielen wird NginX auch als Webserver ausgeführt. Die Frage ist nun, warum Sie den Lackcache verwenden sollten, um diese statischen Dateien zwischenzuspeichern.

Es ist für mich viel sinnvoller, nur die dynamischen Dateien zwischenzuspeichern, damit php-fpm / mysql nicht so stark getroffen wird.

Bin ich richtig oder fehlt mir hier etwas?

AKTUALISIEREN

Ich möchte der Frage basierend auf der gegebenen Antwort einige Informationen hinzufügen.

Wenn Sie eine dynamische Website haben, auf der sich der Inhalt tatsächlich stark ändert, ist das Chaching nicht sinnvoll. Wenn Sie beispielsweise WordPress für eine statische Website verwenden, kann dies für längere Zeit zwischengespeichert werden.

Wichtiger für mich ist jedoch der statische Inhalt . Ich habe einen Link mit einigen Tests und Benchmarks für verschiedene Cache-Apps und Webserver-Apps gefunden.

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX ist tatsächlich schneller beim Abrufen Ihrer statischen Inhalte, daher ist es sinnvoller, sie einfach passieren zu lassen. NginX funktioniert hervorragend mit statischen Dateien.

- -

Abgesehen davon befindet sich der statische Inhalt meistens nicht einmal im Webserver selbst. Die meiste Zeit wird dieser Inhalt irgendwo auf einem CDN gespeichert, vielleicht AWS S3, so ähnlich. Ich denke, der Lackcache ist der letzte Ort, an dem statischer Inhalt gespeichert werden soll.

Saif Bechan
quelle

Antworten:

10

Lack hat einige Vorteile. Der erste Hinweis ist die Reduzierung der Belastung eines Backend-Servers. In der Regel durch Zwischenspeichern von Inhalten, die dynamisch generiert werden, sich jedoch selten ändern (im Vergleich zu der Häufigkeit, mit der auf sie zugegriffen wird). In Ihrem Wordpress-Beispiel ändern sich die meisten Seiten vermutlich nicht sehr oft, und es gibt einige Plugins, die einen Lackcache ungültig machen, wenn sich die Seite ändert (z. B. neuer Beitrag, Bearbeitung, Kommentar usw.). Daher werden Sie auf unbestimmte Zeit zwischengespeichert und bei Änderungen ungültig - was zu einer minimalen Belastung Ihres Backend-Servers führt.

Ungeachtet des verlinkten Artikels würden die meisten Leute vorschlagen, dass Varnish bei korrekter Einrichtung eine bessere Leistung als Nginx erbringt - obwohl (und ich gebe es wirklich nicht gerne zu) meine eigenen Tests zu stimmen scheinen, dass Nginx eine statische Datei schneller als Lack bereitstellen kann ( Zum Glück benutze ich keinen Lack für diesen Zweck. Ich denke, das Problem ist, dass Sie Ihrem Setup eine zusätzliche Ebene hinzugefügt haben, wenn Sie am Ende Lack verwenden. Das Weiterleiten dieser zusätzlichen Ebene an den Backend-Server ist immer langsamer als das direkte Bereitstellen direkt vom Backend aus. Aus diesem Grund kann das Zwischenspeichern von Varnish möglicherweise schneller erfolgen. Sie speichern einen Schritt. Der andere Vorteil liegt auf der Disk-Io-Vorderseite. Wenn Sie den Lack so einrichten, dass er malloc verwendet, schlagen Sie überhaupt nicht auf die Festplatte, wodurch sie für andere Prozesse verfügbar bleibt (und normalerweise die Arbeit beschleunigt).

Ich denke, man würde einen besseren Benchmark brauchen, um die Leistung wirklich zu messen. Durch wiederholtes Anfordern derselben einzelnen Datei werden Dateisystem-Caches ausgelöst, die den Fokus von den Webservern selbst weg verlagern. Ein besserer Benchmark würde die Belagerung mit einigen tausend zufälligen statischen Dateien (möglicherweise sogar aus Ihren Serverprotokollen) verwenden, um realistischen Datenverkehr zu simulieren. Wie Sie bereits erwähnt haben, ist es wohl immer häufiger geworden, statische Inhalte auf ein CDN zu verlagern, was bedeutet, dass Varnish sie wahrscheinlich zunächst nicht bereitstellt (Sie erwähnen S3).

In einem realen Szenario würden Sie wahrscheinlich Ihre Speichernutzung priorisieren - dynamischer Inhalt zuerst, da die Generierung am teuersten ist; dann kleine statische Inhalte (z. B. js / css) und zuletzt Bilder - Sie würden wahrscheinlich keine anderen Medien im Speicher zwischenspeichern, es sei denn, Sie haben einen wirklich guten Grund dafür. In diesem Fall übertrifft Varnish beim Laden von Dateien aus dem Speicher durch Varnish und beim Laden von Dateien von der Festplatte durch Nginx wahrscheinlich die Leistung von Nginx (beachten Sie, dass die Caches von Nginx nur für Proxy und FastCGI vorgesehen sind und diese standardmäßig auf der Festplatte basieren - obwohl dies der Fall ist möglich, nginx mit memcached zu verwenden).

(Mein schneller - sehr rauer, um keine Glaubwürdigkeit zu erhalten - Test ergab, dass Nginx (direkt) am schnellsten war - nennen wir es 100%, Lack (mit Malloc) war etwas langsamer (ca. 150%) und Nginx hinter Lack (. mit Pass) war am langsamsten (ca. 250%). Das spricht für sich - alles oder nichts - und fügt die zusätzliche Zeit (und Verarbeitung) für die Kommunikation mit dem Backend hinzu. Dies schlägt einfach vor, wenn Sie Varnish verwenden und über genügend RAM verfügen Sie können auch einfach alles zwischenspeichern, was Sie können, und es von Varnish aus bereitstellen, anstatt es an nginx zurückzugeben.)

cyberx86
quelle
Ich mag die Punkte, die Sie gemacht haben. Ich habe gerade angefangen, mich damit zu beschäftigen, und ich finde es seltsam, dass die meisten Online-Anleitungen Sie nur den statischen Inhalt mit Lack zwischenspeichern lassen. Ich wette, einige Leute zwischenspeichern MBs mit statischem Inhalt. Es ist wahr, was Sie sagen, wenn es sich um kleine Dateien handelt und wenn Sie über genügend Speicher verfügen, ist dies in Ordnung.
Saif Bechan
Trotzdem habe ich nicht genügend Speicherplatz und einige Vorlagenlayoutdateien, die ich nicht auf CDN ablegen möchte. Ich möchte sie nur in meinem Vorlagenverzeichnis haben. Ich werde das Snippet aus meiner Lackkonfiguration entfernen, die sie zwischenspeichert, damit der Speicher, den ich habe, besser genutzt werden kann. Mir hat der Tipp zu den 3 verschiedenen Setups gefallen. Ich denke, ich öffne einfach den Port für Nginx direkt und stelle die Vorlagendateien von dort bereit. mit Lack Handle HTML, Nginx Handle Static und wenn nötig PHP / MySQL für etwas frischen Inhalt.
Saif Bechan
Sie werden feststellen, dass viele Varish-Setups viele GB Speicher verwenden - ordnungsgemäß eingerichtet, und unter realen Szenarien bezweifle ich nicht, dass es Nginx übertrifft. Ich kann jedoch vorschlagen, dass es die Flexibilität und die Optionen sind, die Varnish bietet, die es beliebt machen - es wurde speziell für das Zwischenspeichern entwickelt. Mit Wordpress ist mein bevorzugtes Setup Wordpress + W3TC (+ Cloudfront) + Lack + Nginx + PHP-FPM + APC. In einigen Fällen ist es tatsächlich nicht so schnell wie in anderen Setups, aber es bewältigt das Laden recht gut mit guter Leistung. Beachten Sie, dass Unternehmensfirewalls häufig nicht standardmäßige Ports blockieren.
Cyberx86
Warum nicht aus Neugier Ihre Vorlagen (vermutlich bedeutet CSS / JS - PHP muss natürlich auf Ihrem Server bleiben) auf Ihrem CDN behalten? Außerdem wird eine meiner ec2-Instanzen unter der gleichen Voraussetzung eingerichtet und enthält Folgendes: if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}in vcl_recv (). Im Wesentlichen möchte ich keine Medien zwischenspeichern - aber auf jeden Fall HTML (PHP) und sogar JS / CSS zwischenspeichern (Theorie besagt, dass Bilder weniger zur wahrgenommenen Ladezeit von Seiten beitragen als das Layout).
Cyberx86
Ich habe das w3tc gesehen, aber ich benutze keine Plugins. Ich erstelle nur kleine Plugins, die sich um bestimmte Optionen für jede bestimmte Site kümmern, damit ich weiß, was alles funktioniert. Von einem Programmierer POV habe ich mir einige Plugins angesehen, und einige sind schrecklich gestaltet. Ich habe mein eigenes Minify-Plugin erstellt, das direktes Smushing und Hochladen von Mediendateien auf s3 und cf, ein kleines Memcached-Plugin und einige andere. Ich bin einfach nicht auf den Punkt gekommen, um das endgültige Plugin zu erstellen, das das Hochladen der Vorlagen auf das CDN übernimmt.
Saif Bechan
2

Ich denke, Sie könnten etwas vermissen.

Per Definition ändern sich dynamische Dateien. In der Regel ändern sie sich durch eine Art Datenbankabfrage, die sich auf den Inhalt der Seite auswirkt, die dem Benutzer bereitgestellt wird. Daher möchten Sie keinen dynamischen Inhalt zwischenspeichern. Wenn Sie dies tun, wird es einfach zu statischem Inhalt und höchstwahrscheinlich zu statischem Inhalt mit falschem Inhalt.

Nehmen wir als einfaches Beispiel an, Sie haben eine Seite mit dem Benutzernamen des angemeldeten Benutzers oben auf der Seite. Jedes Mal, wenn diese Seite geladen wird, wird eine Datenbankabfrage ausgeführt, um festzustellen, welcher Benutzername zu dem angemeldeten Benutzer gehört, der die Seite anfordert, um sicherzustellen, dass der richtige Name angezeigt wird. Wenn Sie diese Seite zwischenspeichern würden, würde die Datenbankabfrage nicht stattfinden und alle Benutzer würden den gleichen Benutzernamen oben auf der Seite sehen und es wird wahrscheinlich nicht ihr Benutzername sein. Diese Abfrage muss bei jedem Laden der Seite erfolgen, um sicherzustellen, dass jedem Benutzer der richtige Benutzername angezeigt wird. Es ist daher nicht zwischenspeicherbar.

Erweitern Sie diese Logik auf etwas Problematischeres wie Benutzerberechtigungen, und Sie können sehen, warum dynamischer Inhalt nicht zwischengespeichert werden sollte. Wenn die Datenbank nicht für dynamischen Inhalt getroffen wird, kann das CMS nicht feststellen, ob der Benutzer, der die Seite anfordert, über Berechtigungen zum Anzeigen dieser Seite verfügt.

Der statische Inhalt ist per Definition für alle Benutzer gleich. Daher muss keine Datenbankabfrage stattfinden, um diese Seite für jeden Benutzer anzupassen. Daher ist es sinnvoll, diese zwischenzuspeichern, um unnötige Datenbankabfragen zu vermeiden. Bilder sind ein wirklich gutes Beispiel für statischen Inhalt. Sie möchten, dass alle Benutzer dasselbe Header-Bild, dieselben Anmeldeschaltflächen usw. sehen, sodass sie sich hervorragend für das Caching eignen.

In Ihrem obigen Code-Snippet sehen Sie ein sehr typisches Varnish VCL-Snippet, das das Zwischenspeichern von Bildern, CSS und Javascript erzwingt. Standardmäßig speichert Varnish keine Anforderungen mit einem darin enthaltenen Cookie zwischen. Die Logik ist, dass, wenn die Anforderung ein Cookie enthält, es einen Grund geben muss, warum der Server dieses Cookie benötigt, sodass es im Back-End erforderlich ist und durch den Cache geleitet werden muss. In der Realität hängen viele CMS (Drupal, Wordpress usw.) Cookies an fast alles an, unabhängig davon, ob sie benötigt werden oder nicht. Daher ist es üblich, VCL zu schreiben, um die Cookies aus Inhalten zu entfernen, von denen bekannt ist, dass sie statisch sind, was wiederum dazu führt, dass Varnish zwischengespeichert wird es.

Sinn ergeben?

jdw
quelle
Danke für die Antwort, aber ich bin mir immer noch nicht sicher. Mir ist bewusst, dass sich dynamische Inhalte auf einigen Websites ändern, auf anderen, wie meinen, jedoch nicht oft. Ich benutze nur ein CMS, um das Leben einfacher zu machen. So können meine dynamischen Seiten für eine Woche zwischengespeichert werden. Wichtig, vergessen wir die Dynamik. Ich verstehe nicht, warum statische Inhalte zwischengespeichert werden sollen, wenn Sie Nginx als Backend haben. Wenn ich richtig bin, sind Nginx und Lack im statischen Inhalt genauso schnell oder irre ich mich. Eine statische Suche kann mit Nginx genauso schnell durchgeführt werden wie mit Lack. Ich habe die Frage ein wenig aktualisiert.
Saif Bechan
2

Für dynamische Inhalte , eigentlich eine Art wie Aktienkurse oft (aktualisiert sich auf eine Sekunde ändern SaaS servervon einem backend server) , aber vielleicht noch häufiger abgefragt werden (von Zehntausenden von subscription clients):

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

In diesem Fall ermöglicht das Zwischenspeichern der SaaS serverAktualisierung pro Sekunde von backend serversdie Erfüllung der Abfragen von Zehntausenden von subscription users.

Ohne einen Cache auf dem SaaS-Server würde dieses Modell einfach nicht funktionieren.

Eli
quelle
1

Das Zwischenspeichern statischer Dateien mit Varnish würde sich positiv auf das Auslagern von Nginx auswirken. Wenn Sie viele statische Dateien zwischenspeichern müssen, wird natürlich RAM verschwendet. Varnish hat jedoch eine nette Funktion - es unterstützt mehrere Speicher-Backends für seinen Cache.

Für statische Dateien: Cache auf Festplatte Für alles andere: Cache auf RAM.

Dies sollte Ihnen mehr Einblick in die Implementierung dieses Szenarios geben: http://www.getpagespeed.com/server-setup/varnish-static-files-cache

Danila Vershinin
quelle
Nur neugierig, warum Sie statische Dateien auf einen Festplatten-Cache legen können - ist das nicht im Wesentlichen dasselbe, als sie nur von der Festplatte ohne Cache bereitzustellen?
Shane N
Im Wesentlichen ja :) Aber wenn Lack vorhanden ist, muss er das Backend (Nginx, Apache, was auch immer) kontaktieren, um diese abzurufen. Dies kann nicht direkt vom Dateisystem aus erfolgen. Um den Overhead der Backend-Kommunikation zu vermeiden, sollten sie zwischengespeichert werden, auch wenn sie sich auf der Festplatte befinden.
Danila Vershinin
Ah ok, das macht Sinn - danke @ danila-v
Shane N