Varnish-Cache, VCL: Port Nummer in Host Header

In vielen Installationen wird ein einziger Varnish-Cache (natürlich redundant ausgelegt, aber beide – oder alle – Server mit gleicher Konfiguration) vor eine größere Menge von Webserver Backends geschaltet. Um nun innerhalb einer einzigen VCL zwischen den unterschiedlichen Webservern im Backend zu unterscheiden, wird meist der Host Header eines jeden HTTP/1.1 Requests verwendet und aufgrund seines Inhalts das jeweilige Backend abgefragt. So weit das allgemein übliche Verfahren.

Nun gibt es allerdings noch immer viele Clients, die HTTP-Requests mit einer im Host Header enthaltenen Portnummer senden, z.B. "Host: www.dmsp.de:80". Die für die Backend-Auswahl in der VCL üblicherweise verwendete ‚Regular Expression‘ wird vereinfacht, wenn gleich zu Anfang in der vcl_rec Funktion folgendes VCL-Snippet verwendet wird:

  ## Remove port 80 specifications from the Host header,
  ## which some clients send.
  if (req.http.host) {
     set req.http.host = regsub(req.http.host, ":80$", "");
  }

Natürlich kann die Portnummer im Host-Header auch in der ‚Regular Expression‘ zur Backend-Auswahl direkt berücksichtigt werden (z.B. mittels ‚(:80)?‘), aber es ist zu beachten, dass in diesem Fall ein zusätzliches Objekt im Cache gespeichert wird und außerdem der Apache-Webserver sowieso nur ein Redirect auf einen Request ohne Portnummer im Header macht.

Tipp:
Einige Nagios Plugins senden HTTP-Requests mit dem Default-Port 80 im HTTP Host-Header. In diesem Fall erhält Nagios zwar ebenfalls eine Antwort, aber diese Antwort kommt möglicherweise von einem ganz anderen Backend, da der Domainname im Host-Header durch die angehängte Portnummer falsch erkannt wird. In diesem Fall wird leider nicht der eigentlich gewünschte Webserver überwacht, sondern möglicherweise unerkannt ein ganz anderer…