Como hash baseado em host + caminho no verniz?

4

Eu quero usar o diretor de hash em verniz para redirecionar todas as solicitações para uma mesma URL sem parâmetros de consulta para o mesmo servidor:

Por exemplo,

http://example.com/foo/bar?a=1
http://example.com/foo/bar?a=2&b=3

O hash deve ser para o mesmo servidor. Quero hash apenas no host e no caminho .

Aqui está minha configuração:

sub vcl_init {
    new workers = directors.hash();

    workers.add_backend(worker_1, 1);
    workers.add_backend(worker_2, 1);
    workers.add_backend(worker_3, 1);
}

Eu entendo que preciso definir a função hash aqui:

sub vcl_recv {
    set req.backend_hint = workers.backend(...);
}

O que devo colocar lá em hash no caminho host +, sem string de consulta?

    
por Benjamin 08.02.2016 / 01:03

1 resposta

2

Não parece que o objeto req fornecido pela VCL padrão forneça uma maneira de obter a solicitação caminho , sem parâmetros de consulta, apenas a URL completa. Assim, usar alguns VMODs pode ajudar.

Você pode tentar usar o QueryString VMOD, por exemplo (a partir de seus documentos) :

import querystring;

sub vcl_hash {
    if (req.method == "GET" || req.method == "HEAD") {
        hash_data(querystring.remove(req.url));
    }
    else {
        hash_data(req.url);
    }
    hash_data(req.http.host);
    return (lookup);
}

E outro bom VMOD, VSLP pode também ser de interesse, dado o maior controle que ele fornece sobre a seleção de back-end.

Usando o Varnish 4.1, você pode usar:

sub vcl_recv {
    if (req.http.host) {
        set req.backend_hint = workers.backend(req.http.host + regsub(req.url, "\?.*$", ""));
    }
    else {
        set req.backend_hint = workers.backend(server.ip + regsub(req.url, "\?.*$", ""));
    }
}

Espero que isso ajude!

    
por 17.03.2016 / 05:41

Tags