2012-04-10 12 views
1

Ich versuche, Varnish einzurichten, um ESI-Includes in einer lokalen Umgebung zu verarbeiten.Varnish nicht verarbeiten ESI enthält

Ich starte Lack in einer virtuellen Maschine und der Inhalt läuft auf dem Host-Rechner.

Ich habe zwei Dateien "index.html" und "test.html". Diese sind beide in einem Ordner namens "esi" in der Docroot eines Apache-Servers gespeichert.

index.html

<h1>It Works!</h1> 
<esi:include src="test.html" /> 

test.html

<p>ESI HAS BEEN INCLUDED</p> 

Lack wird auf der virtuellen Maschine läuft auf Port 8000. So greife ich es hier: http://192.168.56.101:8000/esi/

In /etc/varnish/default.vcl auf der virtuellen Maschine habe ich die folgenden c hinzugefügt onfig zum Ende der Datei:

sub vcl_fetch { 
    set beresp.do_esi = true; /* Do ESI processing    */ 
    set beresp.ttl = 24 h; /* Sets the TTL on the HTML above */ 
} 

Mit der Idee, dass es ESI auf alle Anfragen bearbeiten sollen (dont care, wenn seine schlechte Praxis nur diese Sache zu bekommen versuchen, zu arbeiten :))

Das Ergebnis wenn ich laden http://192.168.56.101:8000/esi/ ist:

<h1>It Works!</h1> 
<esi:include src="test.html" /> 

dh. Das ESI wird im Markup angezeigt, es wird nicht verarbeitet.

Ich habe das Varnish-Protokoll überprüft, es sind jedoch keine Fehler vorhanden und nichts mit ESIs.

Kann jemand sehen, was ich hier falsch mache? Lassen Sie mich wissen, wenn mehr Informationen benötigt werden .. danke

+0

Verwenden Sie Varnish> 3.0? Weil Sie die neue Syntax verwenden ... – ivy

Antwort

1

Wenn Ihr esi include src ist "test.html" dann wird Lack diese Anfrage an Ihre Standard-Backend senden, die 127.0.0.1 ist. Ich glaube, Sie müssen ein zweites Backend für Ihren Remote-Server konfigurieren. Etwas wie folgt aus:

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

backend hostmachine { 
    .host = "50.18.104.129"; # Enter your IP address here 
    .port = "80"; 
} 

Dann in Ihrem Unter vcl_recv benötigen Sie den Verkehr umzuleiten, die ihr/esi/in der URL auf dem Remote-Server.

sub vcl_recv { 
     if (req.url ~ "^/esi/") { 
      set req.backend = hostmachine; 
      set req.http.host = "www.correctdomainname.com"; 
     } else { 
      set req.backend = default; 
     } 
} 

Ich arbeite gerade an der gleichen Sache, also versuchen Sie es und lassen Sie mich wissen, ob es für Sie arbeitet.

+2

Wie ist diese oder die andere Antwort eine Antwort? OP (und ich zu) möchte etwas vom selben Server einbinden, und obwohl 'sub vcl_fetch' 'set beresp.do_esi = true enthält;' lakst es nicht störend, die include-Anfrage an das Backend zu stellen und einfach das esi-Tag zu deponieren die Antwort. Dies zeigt sich in Google hoch, aber ich sehe nicht, wie diese oder die andere Antwort tatsächlich eine Antwort ist. – HMR

1

Varnish hat nur eine kleine Teilmenge von ESI implementiert. Ab 2.1 drei Aussagen ESI:

esi:include 
    esi:remove 
    <!--esi ...--> 

Inhalt Substitution basierend auf Variablen und Cookies nicht implementiert, sondern ist auf der Roadmap. Varnish verarbeitet keine ESI-Anweisungen in HTML-Kommentaren. Für ESI arbeiten Sie ESI Verarbeitung in VCL aktivieren müssen, wie folgt aus:

sub vcl_fetch { 
if (req.url == "/index.html") { 
    set beresp.do_esi = true; /* Do ESI processing    */ 
    set beresp.ttl = 24 h; /* Sets the TTL on the HTML above */ 
} elseif (req.url == "/test.html") { 
    set beresp.ttl = 1m;  /* Sets a one minute TTL on  */ 
          /* the included object   */ 
} 

}

1

Für ESI arbeitet (Lack 3.x), das erste Zeichen muss ein "<" sein, so einfach HTML-Struktur hinzufügen

Hier ist mein Test:

index.php

<html> 
<head> 
    <title></title> 
</head> 
<body> 
<?php 

    $now = new \DateTime('now'); 
    echo "hello world from index.php ".$now->format('Y-m-d H:i:s'); 
?> 

<br/> 

<esi:include src="/date.php"/> 

<br/> 

<esi:remove> 
    ESI NOT AVAILABLE 
</esi:remove> 

<br/> 

<!--esi 
ESI AVAILABLE !! 

--> 
</body> 
</html> 

Date.php

<?php 
$now = new \DateTime('now'); 
echo "hello world from date.php ".$now->format('Y-m-d H:i:s'); 

Ausgabe:

hello world from index.php 2014-08-21 10:45:29 
hello world from date.php 2014-08-21 10:46:35