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/web1
ou http://domain/web2
vejo 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
Respostas:
Você tem isto:
Eu acho que você quer isso:
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.fonte
Coloque isso no frontend
Boa lição para aprender a remover a string: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
fonte