2015-08-03 5 views
1

У меня такое поведение vcl_deliver, он удаляет каждый http.set-cookie из бэкэнд.Varnish 4 vcl_deliver удаляет set-cookie из backend_response

Это мой кусок varnishlog:

- VCL_call  DELIVER 
- RespUnset  Set-Cookie: JSESSIONID=20E1512F59F3BA8A7BAE6AC2C10B0F66; Path=/; HttpOnly 
- RespUnset  Set-Cookie: OpenCmsOuFqn=/; Expires=Wed, 03-Feb-2016 13:18:41 GMT; Path=/ 
- RespUnset  Set-Cookie: OpenCmsUserName=Admin; Expires=Wed, 03-Feb-2016 13:18:41 GMT; Path=/ 
- RespHeader  Set-Cookie: LB=fep001; path=/; 
- RespHeader  X-Cache: MISS 
- VCL_return  deliver 

Я не могу видеть конфигурации ошибку я его тоже. Это мой default.vcl конфигурационный файл:

vcl 4.0; 

import std; 
import directors; 

backend fep001 { 
    .host = "fe1"; 
    .port = "82"; 
    .probe = { 
     .url = "/ping"; 
     .interval = 10s; 
     .timeout = 1s; 
     .window = 1; 
     .threshold = 1; 
     .expected_response = 200; 
    } 
} 
backend fep002 { 
    .host = "fe2"; 
    .port = "82"; 
    .probe = { 
     .url = "/ping"; 
     .interval = 10s; 
     .timeout = 1s; 
     .window = 1; 
     .threshold = 1; 
     .expected_response = 200; 
    } 
} 

sub vcl_init { 
    new cluster = directors.round_robin(); 
    new clusterhash = directors.hash(); 
    cluster.add_backend(fep001); 
    clusterhash.add_backend(fep001, 1.0); 
    cluster.add_backend(fep002); 
    clusterhash.add_backend(fep002, 1.0); 
} 

sub vcl_recv { 
    if (req.http.Cookie ~ "LB=fep[0-9]+") { 
     set req.backend_hint = clusterhash.backend(req.http.Cookie.LB); 
    } else { 
     set req.backend_hint = cluster.backend(); 
    } 
    if (! std.healthy(req.backend_hint)) { 
     std.log("not healthy"); 
     set req.backend_hint = cluster.backend(); 
    } 

    if (req.http.Cookie) { 
     set req.http.Cookie = regsuball(req.http.Cookie, "(^|;) *LB=[^;]+;? *", "\1"); 
    } 

    if (req.method != "GET" && req.method != "HEAD") { 
     return(pass); 
    } 
    if (req.url ~ "^/export/.*$") { 
     return(hash); 
    } 
    return(pass); 
} 

sub vcl_backend_response { 
    set beresp.http.X-node = beresp.backend.name; 
    set beresp.http.Vary = "Accept-Encoding"; 
    if (bereq.url ~ "^/export/.*$" && beresp.status < 400) { 
     set beresp.ttl = 30m; 
    } else { 
     set beresp.ttl = 0s; 
    } 
    return(deliver); 
} 

sub vcl_deliver { 
    if (obj.hits == 0 && req.http.Cookie !~ "LB=fep[0-9]+") { 
     set resp.http.Set-Cookie = "LB=" + resp.http.X-node + "; path=/;"; 
    } 

    if (obj.hits > 0) { 
     set resp.http.X-Cache = "HIT:" + obj.hits; 
    } else { 
     set resp.http.X-Cache = "MISS"; 
    } 
} 

Как я мог держать эти заголовки HTTP?

Спасибо

Davide

ответ

2

я наконец-то нашел одно решение, выведенное из статьи Proper sticky session load balancing in Varnish

Это кажется, что лак 4 не добавляет другой Set-Cookie, но заменить его и не добавляет такой лак 3 таким образом:

set resp.http.Set-Cookie = "LB=" + req.http.X-node + "; path=/;" + resp.http.Cookie; 

Это означает, что вам нужно использовать некоторые VMOD.

Я добавил печенье и заголовочный импорт:

vcl 4.0; 

import std; 
import directors; 
import cookie; 
import header; 

Я немного изменился выбор бэкэнда:

cookie.parse(req.http.cookie); 
if (cookie.get("LB")) { 
    set req.backend_hint = clusterhash.backend(cookie.get("LB")); 
} else { 
    set req.backend_hint = cluster.backend(); 
} 
if (! std.healthy(req.backend_hint)) { 
    std.log("not healthy"); 
    set req.backend_hint = cluster.backend(); 
} 

и в конце концов это основная причина, чтобы добавить эти VMODs:

if (obj.hits == 0 && req.http.Cookie !~ "LB=fep[0-9]+") { 
    header.remove(resp.http.Set-Cookie,"^LB=.*$"); 
    header.append(resp.http.Set-Cookie,"LB=" + resp.http.X-node + "; Expires=" + cookie.format_rfc1123(now, 60m) + "; path=/;"); 
} 

Я надеюсь, что этот ответ поможет кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^