I'm trying to setup Varnish to process ESI includes on a local environment.
I am running varnish in a virtual machine and the content is running on the host machine.
I have two files "index.html" and "test.html". These are both stored in a folder called "esi" in the docroot of an apache server.
index.html
<h1>It Works!</h1>
<esi:include src="test.html" />
test.html
<p>ESI HAS BEEN INCLUDED</p>
Varnish is running on the virtual machine on port 8000. So I access it here: http://192.168.56.101:8000/esi/
in /etc/varnish/default.vcl on the virtual machine I have added the followin config to the bottom of the file:
sub vcl_fetch {
set beresp.do_esi = true; /* Do ESI processing */
set beresp.ttl = 24 h; /* Sets the TTL on the HTML above */
}
With the idea that it should process ESI on ALL requests (Dont care if its bad practice just trying to get this thing to work :))
The result when I load http://192.168.56.101:8000/esi/ is:
<h1>It Works!</h1>
<esi:include src="test.html" />
ie. the ESI is shown in the markup, it is not being processed.
I have checked the Varnish log, however there are no errors in there and nothing related to ESIs.
Can anyone see what I am doing wrong here? Let me know if more information is needed.. thanks
If your esi include src is "test.html" then varnish will be sending that request to your default backend, which is 127.0.0.1. I believe you need to configure a second backend for your remote server. Something like this:
backend default {
.host = "127.0.0.1";
.port = "8000";
}
backend hostmachine {
.host = "50.18.104.129"; # Enter your IP address here
.port = "80";
}
Then in your sub vcl_recv you need to redirect traffic that has /esi/ in the URL to the 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;
}
}
I'm working on the same thing right now so give it a try and let me know if it works for you.