<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap: break-word;-webkit-nbsp-mode: space;-webkit-line-break: after-white-space">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">Are you load-balancing between the two varnish instances? If you are, you should check if you’re hashing the cache keys properly, e.g., not sending the same response to the
 other varnish instance that you’d send to all other clients, so that your outer varnish instance doesn’t serve cached pages with unparsed ESI tags to clients.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">You could try doing something along the lines of –<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">sub vcl_recv {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">  if(client.ip ~ other-varnish) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">    set req.http.X-Via-Varnish = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">  }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">sub vcl_hash {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">  set req.hash += req.http.X-Via-Varnish;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""><o:p> </o:p></span></p>
<p class="MsoNormal">sub vcl_fetch {<br>
  if (beresp.http.X-Meta-Has-Esi) {<br>
      unset beresp.http.X-Meta-Has-Esi;<br>
  } else {<o:p></o:p></p>
<p class="MsoNormal">      esi;<o:p></o:p></p>
<p class="MsoNormal">  }<br>
}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">(Disclaimer – I didn’t test this, and cannot be held responsible for syntax errors)<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Lex Kolychev<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#646464">Application and Systems Architect<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#646464">Internet Technology Dept.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#646464">Martha Stewart Living Omnimedia<br>
Ph:   212-827-8948<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<p class="MsoNormal"><b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">From:
</span></b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">Pax Dickinson <<a href="mailto:pax@businessinsider.com">pax@businessinsider.com</a>></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">Date:
</span></b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">August 17, 2011 2:38:16 PM EDT</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">To:
</span></b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">"<a href="mailto:varnish-misc@varnish-cache.org">varnish-misc@varnish-cache.org</a>" <<a href="mailto:varnish-misc@varnish-cache.org">varnish-misc@varnish-cache.org</a>></span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><b><span style="font-size:13.5pt;font-family:"Helvetica","sans-serif"">Subject: Using Varnish as a backend for another Varnish server, with ESIs</span></b><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi,<br>
<br>
I'm attempting to use two varnish servers as the preferred caching<br>
backend for each other, falling back to my apache backends if neither<br>
varnish server has the content in cache. I'm doing it to reduce my<br>
backend traffic and keep my caches hot more efficiently than having<br>
each varnish server totally separate, which is what I do now. Also<br>
this will scale better if the day comes that I need a third server.<br>
<br>
I match against an ACL and if a request comes from anywhere other than<br>
my other varnish server, I set the varnish backend. This is working<br>
fine, except my edge side includes need to be processed only by the<br>
server that received the original request. If the secondary server<br>
were to process and include my ESIs at that point they would be<br>
returned to the primary server and become part of its cached copy, and<br>
that defeats the purpose of having ESIs.<br>
<br>
It seems that it should be as simple as:<br>
<br>
sub vcl_recv {<br>
  if (!client.ip ~ othervarnish) {<br>
      set req.backend = varnish;<br>
  }<br>
}<br>
<br>
sub vcl_fetch {<br>
  if (beresp.http.X-Meta-Has-Esi && !client.ip ~ othervarnish) {<br>
      esi;<br>
  }<br>
}<br>
<br>
BUT.. If I call it as above, ESIs work and are processed correctly by<br>
whichever server received the request first. However, when hitting the<br>
secondary server and getting a cached result the ESIs are not<br>
processed, vcl_fetch is never called, and the esi tags remain in the<br>
result. Also, it seems that the esi function can only be called in<br>
vcl_fetch. In vcl_deliver it does nothing.<br>
<br>
So for example:<br>
<br>
The initial request works:<br>
<br>
Request ---> VarnishA MISS --> VarnishB MISS --> Backend (success with<br>
esi parsed)<br>
<br>
However subsequent requests look like this:<br>
<br>
New Request ---> VarnishA HIT (success with esi parsed)<br>
New Request ---> VarnishB HIT (fail, esi will not be parsed)<br>
<br>
Is there a way to make this work? Or is using varnish as a backend for<br>
another varnish incompatible with edge side includes? I'm using<br>
varnish 2.1.5, is this possible in 3.0?<br>
<br>
Thanks..<br>
<br>
-- <br>
Pax Dickinson<br>
Chief Architect<br>
Business Insider<br>
257 Park Avenue South, 13th floor<br>
New York, NY 10010<br>
<a href="mailto:pax@businessinsider.com">pax@businessinsider.com</a><br>
<br>
_______________________________________________<br>
varnish-misc mailing list<br>
varnish-misc@varnish-cache.org<br>
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<br>
<hr>
<font face="Arial" color="Gray" size="2">Don't miss a brand new season of the Emmy award-winning "Martha Stewart Show", followed by the all-new series "Emeril's Table"...Beginning September 26, only on Hallmark Channel.<br>
<br>
Find Martha Stewart on Facebook: http://facebook.com/MarthaStewartLiving<br>
<br>
Follow Martha Stewart on Twitter: http://twitter.com/MarthaStewart<br>
<br>
</font>
</body>
</html>