<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Geoff,<div class=""><br class=""></div><div class="">Thank you. I understand about vcl_synth being used when getting 500 & 503 better :)</div><div class="">However, I’m also interested how can we distinguish backend errors while using grace mode and failed probe.</div><div class=""><br class=""></div><div class="">Suppose that you have configured grace mode and a health check against homepage.  And homepage fails with 500.</div><div class="">The backend is marked as sick, then synthetic response (guru meditation) is delivered from vcl_backend_error with resp.status pre-filled to 503.</div><div class="">So there seems to be no way to do the same conditional error display in that case?</div><div class=""><br class=""><div class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Best Regards,</div><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Danila</div></div>
</div>
<div><br class=""><blockquote type="cite" class=""><div class="">On 31 Mar 2018, at 14:25, Geoff Simmons <<a href="mailto:geoff@uplex.de" class="">geoff@uplex.de</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">On 03/31/2018 10:21 AM, Danila Vershinin wrote:<br class=""><blockquote type="cite" class=""><br class="">If a constant PHP error occurs in the backend and there is no cache -<br class="">we see Backend fetch failed.<br class=""></blockquote>[...]<br class=""><br class=""><blockquote type="cite" class="">... it always takes time to explain to the clients that the Varnish<br class="">is not to blame ...<br class=""></blockquote>Welcome to Varnish administration! Such is the life.<br class=""><br class="">When the backend fetch fails, always look to the FetchError entry in the<br class="">backend log, which diagnoses the problem. It helps with those conversations.<br class=""><br class=""><blockquote type="cite" class="">... and ideally there would be a way to deliver different Varnish<br class="">error page for these 3 cases:><br class="">* 500 error-ed backend<br class="">* 404-ed backend<br class="">* actual problem talking to the backend (HTTP etc.)<br class=""></blockquote><br class="">Varnish can generate the response itself with vcl_synth -- when you see<br class="">the Guru Meditation and "Backend fetch failed", you're seeing the<br class="">buitlin.vcl version of vcl_synth.<br class=""><br class="">vcl_synth is called automatically for response codes 500 & 503, for 404<br class="">or anything else, your VCL has to direct to there:<br class=""><br class="">sub vcl_deliver {<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>if (resp.status == 404) {<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span>return (synth(404));<br class=""><span class="Apple-tab-span" style="white-space:pre">   </span>}<br class="">}<br class=""><br class="">So you could have something like this:<br class=""><br class="">sub vcl_synth {<br class=""><span class="Apple-tab-span" style="white-space:pre">       </span>if (resp.status == 500) {<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span>synthetic("500 error-ed backend");<br class=""><span class="Apple-tab-span" style="white-space:pre">   </span>}<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>elsif (resp.status == 404) {<br class=""><span class="Apple-tab-span" style="white-space:pre">   </span><span class="Apple-tab-span" style="white-space:pre">    </span>synthetic("404-ed backend");<br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>}<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span>elsif (resp.reason == "Backend fetch failed") {<br class=""><span class="Apple-tab-span" style="white-space:pre">      </span><span class="Apple-tab-span" style="white-space:pre">    </span>synthetic("actual problem talking to the backend");<br class=""><span class="Apple-tab-span" style="white-space:pre">  </span>}<br class="">}<br class=""><br class="">Since I believe about Varnish 5.0 or so you can use also this syntax to<br class="">generate the synthetic response (synthetic() works as well):<br class=""><br class=""><span class="Apple-tab-span" style="white-space:pre"> </span>set resp.body = "mumble";<br class=""><br class="">Of course you'll probably want to have HTML markup in the generated<br class="">response -- look to the Guru Meditation in builtin.vcl's vcl_synth for<br class="">an example.<br class=""><br class=""><br class="">HTH,<br class="">Geoff<br class="">-- <br class="">** * * UPLEX - Nils Goroll Systemoptimierung<br class=""><br class="">Scheffelstraße 32<br class="">22301 Hamburg<br class=""><br class="">Tel +49 40 2880 5731<br class="">Mob +49 176 636 90917<br class="">Fax +49 40 42949753<br class=""><br class=""><a href="http://uplex.de" class="">http://uplex.de</a><br class=""><br class="">_______________________________________________<br class="">varnish-misc mailing list<br class="">varnish-misc@varnish-cache.org<br class="">https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc</div></div></blockquote></div><br class=""></div></body></html>