<div>
                    <font face="'Courier New'">Hello,
                </font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">I am using Varnish as an ESI backend, and therefore I've stumbled upon one constraint.</font></div><div><font face="'Courier New'">Varnish backends must be known at configuration time. I have not found a possibility to create a backend "on the fly" or let a DNS server decide about backends.</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">The problem is the following:</font></div><div><font face="'Courier New'">I use Varnish for caching and resolving ESI fragments with absolute URLs.</font></div><div><font face="'Courier New'">This works well for all defined backends. But the problem in my project is, that new services are being added or removed all the time.</font></div><div><font face="'Courier New'">Now it would be amazing if I could find a way, how to resolve ESI fragments dynamically through a DNS server.</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">I know that there is a good reason why ESI fragments are bound to the available backends. It would be a security issue to allow ESI fragments point everywhere.</font></div><div><font face="'Courier New'">But imagine a setup with a DNS server who manages the reachable services and rejects to resolve requests for unknown hosts.</font></div>
                <div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">At the moment I am running the following workaround:</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">1) The ESI fragment defines a relative path i.e.:</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">  <esi:include src="/fragments/service.host.com/path/uri" /></font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">2) Varnish forwards requests with urls matching /fragments/ to Nginx (the `proxy` backend in the vcl). Here is the key part of this configuration:</font></div><div><font face="'Courier New'"><br></font></div><div><div><font face="'Courier New'">  sub vcl_recv {</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">  if (req.url ~ "^/fragments/([a-z0-9.-]+)/?(.*)$") {</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">    set req.http.Host = regsub(req.url, "^/fragments/([a-z0-9.-]+)/?(.*)$", "\1");</font></div><div><font face="'Courier New'">    set req.url = regsub(req.url, "^/fragments/([a-z0-9.-]+)/?(.*)$", "/\2");</font></div><div><font face="'Courier New'">    set req.backend = proxy;</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">  } else {</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">  <span class="Apple-tab-span" style="white-space:pre">              </span>set req.backend = default;</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">  <span class="Apple-tab-span" style="white-space:pre">   </span>}</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font face="'Courier New'">    </font></span></div><div><font face="'Courier New'">  }</font></div><div><font face="'Courier New'"><br></font></div></div><div><font face="'Courier New'">3) Nginx resolves the request through our own DNS server. The DNS server only resolves known hosts and does not forward DNS requests.</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">This approach works for now as a proof of concept, but there is a lot of overhead.</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">Thank you for reading. Please tell me your thoughts.</font></div><div><font face="'Courier New'">Or maybe you know how to write a VMOD that can control backend selection. I have never written a VMOD so far, and unfortunately I do not know much about the backend selection internals.</font></div><div><font face="'Courier New'">But with some help, I'd be willing to implement a VMOD (and release it as open source for sure).</font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'"><br></font></div><div><font face="'Courier New'">Lukas Rieder</font></div></div>