HAProxy reqrep remove o URI no pedido de back-end

23

pergunta rápida real sobre o reqrep HAProxy. Eu estou tentando reescrever / substituir o pedido que é enviado para o 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

Eu quero que a web1 vá para o backend webfarm1 e web2 para ir ao webfarm2. Atualmente isso acontece. No entanto, quero remover o URI web1 ou web2 quando o pedido é enviado para o 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/(.*)     \ /
        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/(.*)     \ /
        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 para http://domain/web1 ou http://domain/web2 , vejo nos logs de erro que a solicitação em um servidor em cada backend que o requst é para o recurso / web1 ou / web2, respectivamente. Portanto, acredito que haja algo errado com minha expressão regular, mesmo que eu copiei e colei da Documentação. link

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

Obrigado!

-Jim

    
por Jim 03.11.2012 / 00:20

2 respostas

23

Você tem isso:

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

Eu acho que você quer isso:

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

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

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

Tudo antes de / web1 é "capturar" tudo o que vem antes da web1 na string de solicitação. Então normalmente isso seria GET ou POST. O (. *) "Captura" tudo depois da web1, incluindo nada se não houver nada.

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

    
por 06.11.2012 / 22:09
0

Coloque isso no frontend

reqirep  ^([^\ :]*)\ /(.*) \ /web1/

Uma boa lição é aprender a despir strings: link

    
por 28.10.2017 / 13:59