2016-05-15 12 views
1

Ich benutze eine Lack 3 hinter einem Nging, um mehrere Websites in einer Domäne zu proxy. Die grundlegende Einrichtung funktioniert gut, aber ich habe jetzt ein Problem mit Lack dienen die falschen Dateien, wenn der Dateiname bereits in seinem Cache existiert. Im Grunde alles, was ich in meinem default.vcl tun, ist dies:Varnish serviert falsche Dateien

if(req.url ~ "^/foo1") { 
     set req.backend = foo1; 
     set req.url = regsub(req.url, "^/foo1/", "/"); 
    } 
    else if(req.url ~ "^/foo2") { 
     set req.backend = foo2; 
     set req.url = regsub(req.url, "^/foo2/", "/"); 
    } 

Wenn ich jetzt /foo1/index.html nennen, /foo2/index.html die gleiche Datei dienen. Nach einem Neustart von Lack und einem Aufruf von /foo2/index.html wird /foo1/index.html foo2's index.html bedienen.

Soweit ich dies ist ein Problem mit der Schaffung des Hash herausgefunden, die nicht die verwendeten Backend nicht respektieren, sondern nur die URL (nach dem Kürzen) und die Domain:

11 VCL_call  c hash 
    11 Hash   c /index.html 
    11 Hash   c mydomain 

ich dieses Problem gelöst jetzt meine vcl_hash durch Änderung auch das Backend zu verwenden, aber ich bin es sicher besser, bequemer Weg sein muss:

würde geschätzt
sub vcl_hash { 
     hash_data(req.url); 
     hash_data(req.backend); 
    } 

Jeder Hinweis, vielen Dank!

Antwort

1

Sie haben zwei verschiedene Möglichkeiten, dies zu tun. Erstens, tun Sie, was Sie vorgeschlagen haben, indem Sie zusätzliche Werte hinzufügen (z. B. req.backend) in vcl_hash.

sub vcl_hash { 
    hash_data(req.url); 
    hash_data(req.backend); 
} 

Zweite Weise ist nicht req in vcl_recv zu aktualisieren, aber nur bereq in vcl_miss/pass.

sub vcl_urlrewrite { 
    if(req.url ~ "^/foo1") { 
     set bereq.url = regsub(req.url, "^/foo1/", "/"); 
    } 
    else if(req.url ~ "^/foo2") { 
     set bereq.url = regsub(req.url, "^/foo2/", "/"); 
    } 
} 
sub vcl_miss { 
    call vcl_urlrewrite; 
} 
sub vcl_pass { 
    call vcl_urlrewrite; 
} 
sub vcl_pipe { 
    call vcl_urlrewrite; 
} 

Dieser zweite Ansatz erfordert mehr VCL, aber es kommt auch mit Vorteilen. Wenn Sie beispielsweise Protokolle mit varnishlog analysieren, können Sie die Vanilla-Anforderung (Spalte c) sowie die aktualisierte Back-End-Anforderung (Spalte b) sehen.

$ varnishlog /any-options-here/ 
(..) 
    xx RxURL  c /foo1/index.html 
(..) 
    xx TxURL  c /index.html 
(..) 
$ 
+0

Vielen Dank! Der zweite Ansatz sieht aus und funktioniert gut, nur getestet! – deveth0