2016-05-15 2 views
1

Я использую лак 3 позади nging для прокси-сервера нескольких сайтов в один домен. Базовая установка работает нормально, но теперь у меня проблема с лаком, обслуживающим неправильные файлы, если имя файла уже существует в кеше. В принципе все, что я делать в default.vcl это:Varnish служит неправильным файлам

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/", "/"); 
    } 

Если я сейчас называем /foo1/index.html, /foo2/index.html будет служить тот же файл. После перезапуска лака и вызова /foo2/index.html/foo1/index.html будет служить index.html файла foo2.

Насколько я выяснил, что это вопрос с созданием хэша, который не уважает использованный бэкенд, но только URL (после сокращения) и домен:

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

Я решил эту проблему сейчас, изменяя мой vcl_hash также использовать бэкенд, но я уверен, что там должно быть лучше, более удобным способом:

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

Любой намек был бы оценен, большое спасибо!

ответ

1

У вас есть два разных способа сделать это. Первый - сделать то, что вы предложили, добавив дополнительные значения (например, req.backend) в vcl_hash.

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

Второй способ, чтобы не обновлять req в vcl_recv, но только bereq в 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; 
} 

Этот второй подход требует больше VCL, но он также имеет преимущества. Например, при анализе журналов с varnishlog вы можете увидеть запрос ванили (столбец c), а также обновленный запрос бэкэнда (столбец b).

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

Спасибо! Второй подход выглядит и отлично работает, просто проверен! – deveth0