Wie richte ich Varnish für Symfony2-Sites richtig ein?

Lesezeit: 5 Minuten

Benutzer-Avatar
Ondrej Slinták

Ich habe eine Website (mit ESI), die Symfony2-Reverse-Proxy zum Caching verwendet. Die durchschnittliche Antwort beträgt etwa 100 ms. Ich habe versucht, Varnish auf dem Server zu installieren, um es auszuprobieren. ich folgte Leitfaden aus dem Symfony-Kochbuch Schritt für Schritt alles gelöscht cache Ordner, aber http_cache Ordner wurde noch erstellt, als ich es ausprobierte. Also dachte ich, ich könnte versuchen, es zu kommentieren $kernel = new AppCache($kernel); aus app.php. Das hat ziemlich gut funktioniert. http_cache wurde nicht mehr erstellt und von polishstat schien Varnish zu funktionieren:

12951         0.00         0.08 cache_hitpass - Cache hits for pass
 1153         0.00         0.01 cache_miss - Cache misses

Das war von ungefähr 14000 Anfragen, also dachte ich, alles wäre in Ordnung. Aber nach dem Echo fand ich heraus, dass die Antworten auf ~ 2 Sekunden angehoben wurden.

Apache läuft auf Port 9000 und Varnish auf 8080. Also echoe ich mit echoping -n 10 -h http://servername/ X.X.X.X:8080.

Ich habe keine Ahnung, was falsch sein könnte. Sind zusätzliche Einstellungen erforderlich, um Varnish mit Symfony2 zu verwenden? Oder mache ich einfach etwas falsch?


Auf Anfrage, hier ist meine default.vcl mit Modifikationen, die ich bisher gemacht habe.

Ich habe 2 Probleme mit der Standardkonfiguration von Varnish gefunden:

  • Anfragen werden nicht mit Cookies zwischengespeichert (und jedem in meiner App ist eine Sitzung zugewiesen).
  • es ignoriert Cache-Control: no-cache Header

Also habe ich Bedingungen für diese Fälle zu meiner Konfiguration hinzugefügt und es funktioniert jetzt ziemlich gut (~ 175 req / s von ~ 160 mit S2-Reverse-Proxy – aber ehrlich gesagt, ich habe etwas mehr erwartet). Ich habe nur keine Ahnung, wie ich überprüfen soll, ob alles in Ordnung ist, daher sind alle Eingaben willkommen.

Die meisten Seiten haben einen Cache, der je nach Cookie variiert, mit s-maxage 1200. Gemeinsame ESI-Includes werden nicht durch Cookies variiert, mit s-maxage ziemlich gering (Artikel, Artikellisten). Benutzerprofilseiten werden überhaupt nicht zwischengespeichert (no-cache) und ich bin mir nicht sicher, ob ESI-Includes auf diesen überhaupt von Varnish zwischengespeichert werden. Nur ESI, die durch Cookies variiert wird, ist ein Header mit benutzerspezifischen Informationen (das ist auf 100 % der Seiten).

Alles in diesem Beitrag ist spezifisch für Varnish 3.X (ich persönlich verwende 3.0.2).

Außerdem habe ich nach ein paar Wochen, in denen ich mich damit beschäftigt habe, wirklich keine Ahnung mehr, was ich tue. Wenn Sie also etwas Seltsames in den Konfigurationen finden, lassen Sie es mich einfach wissen.

Geben Sie hier die Bildbeschreibung ein

  • 5 Cent nach meiner Erfahrung. Es hängt alles sehr von der Vasnish-Konfiguration ab und insbesondere davon, ob Sie genügend Speicher dafür zur Verfügung haben. Könnten Sie bitte Ihre zeigen sub vcl_recv, sub vcl_fetch und backend?

    – Anton Babenko

    20. Januar 2012 um 11:32 Uhr

  • Aktualisierter ursprünglicher Beitrag mit Konfigurationen. Eine andere Sache, die mir in den Sinn kommt, sind Benutzer-Cookies (und vielleicht Tracking-Cookies). Jede Anfrage auf unserer Seite hat sie. Aber ich verstehe nicht, warum lackstat sagt, dass es dann 90% der Anfragen zwischenspeichert. Wir hatten nie Probleme mit ihnen, als wir Symfony2-Reverse-Proxy verwendeten.

    – Ondrej Slinták

    20. Januar 2012 um 17:15 Uhr


  • Ich habe ähnliches vcl_recv auf meinem Setup, obwohl ich auch diese Zeilen dort habe: set req.http.X-Forwarded-Port = "80"; set req.http.X-Forwarded-Proto = "http";

    – Anton Babenko

    20. Januar 2012 um 18:25 Uhr


Benutzer-Avatar
Bsp

Ich bin überrascht, dass dies seit 10 Monaten keine wirklich vollständige Antwort erhalten hat. Dies könnte eine wirklich nützliche Seite sein.

Du hast selbst darauf hingewiesen:

  • Varnish speichert keine Anfragen mit Cookies
  • Varnish ignoriert Cache-Control: No-Cache-Header

Die erste Frage ist: Braucht jeder in Ihrer App eine Sitzung? Wenn nicht, starten Sie die Sitzung nicht oder verschieben Sie den Start zumindest, bis es wirklich notwendig ist (dh sie melden sich an oder was auch immer).

Wenn Sie immer noch Seiten zwischenspeichern können, wenn Benutzer angemeldet sind, müssen Sie wirklich aufpassen, dass Sie einem Benutzer keine Seite anbieten, die für jemand anderen bestimmt war. Aber wenn Sie es tun wollen, bearbeiten Sie vcl_recv(), um das Sitzungscookie für die Seiten zu entfernen, die Sie zwischenspeichern möchten.

Sie können Varnish leicht dazu bringen, die No-Cache-Anweisung in vcl_fetch() zu verarbeiten, und tatsächlich haben Sie das bereits getan.

Ein weiteres Problem, das ich gefunden habe, ist, dass Symfony standardmäßig max-age auf 0 setzt, was bedeutet, dass sie niemals von der Standardlogik in vcl_fetch zwischengespeichert werden

Mir ist auch aufgefallen, dass Sie den Port in Varnish auf Folgendes eingestellt hatten:

backend default {
    .host = "127.0.0.1";
    .port = "80";
}

Sie selbst sagten, dass Apache auf Port 9000 läuft, also scheint das nicht zu stimmen. Normalerweise würden Sie Varnish so einstellen, dass es auf dem Standardport (80) lauscht, und Varnish so einstellen, dass es das Backend auf Port 9000 oder was auch immer sucht.

Benutzer-Avatar
Rafael Sanchen

Wenn das Ihre gesamte Konfiguration ist, wird vcl_recv zweimal konfiguriert.

Können Sie auf den Seiten, die Sie zwischenspeichern möchten, die Caching-Header senden? Dies wäre am sinnvollsten, da Bilder wahrscheinlich bereits Ihre Apache-Caching-Header haben und die App-Logik entscheidet, welche Seiten tatsächlich zwischengespeichert werden können, aber Sie können dies auch im Lack erzwingen.

Sie könnten ein vcl_recv wie folgt verwenden:

# Called after a document has been successfully retrieved from the backend.
sub vcl_fetch {

    # set minimum timeouts to auto-discard stored objects
    # set beresp.prefetch = -30s;
    set beresp.grace = 120s;

    if (beresp.ttl < 48h) {
      set beresp.ttl = 48h;}

    if (!beresp.cacheable) 
        {pass;}

    if (beresp.http.Set-Cookie) 
        {pass;}

    # if (beresp.http.Cache-Control ~ "(private|no-cache|no-store)") 
    # {pass;}

    if (req.http.Authorization && !beresp.http.Cache-Control ~ "public") 
        {pass;}

}

Dieser cachet, im Klartext, nur die Anfragen, die cachebar eingestellt sind. Beachten Sie außerdem, dass Ihre Konfiguration keine Anfragen mit Cookies zwischenspeichert.

  • Ja, ich denke, das ganze Problem war mit Cookies. Ich werde die Frage später heute mit einigen weiteren Informationen und Entwicklungen aktualisieren.

    – Ondrej Slinták

    3. Februar 2012 um 11:45 Uhr

  • Ah Mist, habe nicht bemerkt, dass ich 2 mal recv anstelle von recv und fetch >< gepostet habe

    – Ondrej Slinták

    3. Februar 2012 um 13:49 Uhr

  • Bearbeitetes OP mit etwas mehr Informationen unter der Zeile.

    – Ondrej Slinták

    3. Februar 2012 um 16:32 Uhr

  • Wenn Sie Anfragen zwischenspeichern möchten, die Cookies enthalten, können Sie versuchen, so etwas wie das Folgende in Ihren vcl_recv einzufügen: unset req.http.cookie;

    – Rafael Sanches

    3. Februar 2012 um 18:35 Uhr

1157850cookie-checkWie richte ich Varnish für Symfony2-Sites richtig ein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy