O HAProxy reqrep remove o URI na solicitação de back-end

27

pergunta rápida real sobre HAProxy reqrep. Estou tentando reescrever / substituir a solicitação que é enviada ao back-end.

Eu tenho o seguinte exemplo de domínio e URIs, ambos compartilhando o mesmo nome de domínio, mas diferentes pools de servidores web de back-end.

http://domain/web1
http://domain/web2

Quero que o web1 vá para o back-end webfarm1 e o web2 vá para o webfarm2. Atualmente isso acontece. No entanto, quero remover o URI web1 ou web2 quando a solicitação é enviada ao back-end.

Aqui está o meu haproxy.cfg

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

Se eu for http://domain/web1ou http://domain/web2vejo nos logs de erro que a solicitação em um servidor em cada back-end em que o requisito é referente ao recurso / web1 ou / web2, respectivamente. Portanto, acredito que haja algo errado com minha expressão regular, mesmo que eu a tenha copiado e colado na Documentação. http://code.google.com/p/haproxy-docs/wiki/reqrep

Resumo: Estou tentando rotear o tráfego com base no URI, no entanto, quero que o HAProxy retire o URI quando ele envia a solicitação ao pool de back-end.

Obrigado!

-Jim

Jim
fonte
Agora existem botões de edição e comentário.
Chris S
11
Jim, você está tendo problemas para comentar porque está logado com uma conta diferente da usada para criar esta pergunta. Tente manter sua conta de login consistente para que isso não aconteça no futuro. Eu sinalizei um moderador para corrigir isso.
MDMarra 07/11

Respostas:

28

Você tem isto:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

Eu acho que você quer isso:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

A diferença é que o segundo funcionará se o / após webN for omitido.

Em resposta ao seu comentário abaixo, entrar em detalhes sobre como as expressões acima funcionam é mais esforço do que posso dar. No entanto, talvez isso ajude.

Tudo antes de / web1 está "capturando" tudo o que vem antes de web1 na sequência de solicitação. Geralmente, isso seria GET ou POST. O (. *) "Captura" tudo após a web1, incluindo nada se não houver nada.

A próxima parte ( \1\2) diz o que fazer com essas partes capturadas. Ele diz para formar uma string composta de \1(a primeira parte capturada) e \2(seguida pela segunda parte capturada). Como a web1 nunca é capturada, ela não é montada na saída final.

pescoço longo
fonte
O que significa \ 1 \ \ 2 \ 3? Em relação à documentação do reqrep, o que o ^ ([^ \] *) \ faz? Aqui está o exemplo dado na página de documentação. # substitua "/ static /" por "/" no início de qualquer caminho de solicitação. Reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2 #
Jim
Depois de ler seu comentário, percebi que minha solução proposta era um pouco complicada demais. Eu simplifiquei.
longneck
Então, qual é a sintaxe reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Estou confuso quanto ao \ 1 \ \ 2 \ 3?
Jim
Existe uma maneira de incorporar esse reqrep para funcionar se o usuário colocar / web1 ou / web1 /?
Jim
Você tentou?
longneck