
Estou tentando configurar o haproxy para navegar entre vários aplicativos em execução no mesmo servidor. Se meu entendimento estiver correto, devo ser capaz de usar regras ACL no frontend para alternar entre portas com base no caminho passado para elas. no entanto, sempre que tento, recebo 503 Service Unavailable
. Estou usando a versão 1.5.18 do HAProxy e confirmei que os serviços que desejo estão funcionando nas portas corretas. Meu arquivo de configuração é:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user root
group root
#/installs version
defaults
log global
mode http
retries 3
timeout client 50s
timeout connect 5s
timeout server 50s
option tcplog
balance roundrobin
# Set up application listeners here.
listen admin
bind 127.0.0.1:22002
mode http
stats enable
stats show-node
stats uri /admin
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl configuration-path path -i /configuration
use_backend servers-configuration if config-path
acl payment-path path -i /payment
use_backend servers-paymentdate if payment-path
acl employee-path path -i /employee
use_backend servers-employeename if employee-path
backend servers-configuration
server www.server1.com 12.12.12.12:3000 maxconn 100
backend servers-paymentdate
server www.server1.com 12.12.12.12:3001 maxconn 100
backend servers-employeename
server www.server1.com 12.12.12.12:3001 maxconn 100
Então, por exemplo, se eu tentar:
12.12.12.12:3000/config/id
Consigo obter os resultados que espero. Porém, quando tento
12.12.12.12:4000/configuration
#or
12.12.12.12:4000/configuration/config/to/service
Falha. Até agora, a única maneira de obter resultados de um dos caminhos é remover a regra acl e incluir um back-end padrão:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment-path path -i /payment
use_backend servers-paymentdate if payment-path
acl employee-path path -i /employee
use_backend servers-employeename if employee-path
default_backend servers-configuration
O que me permite usar o caminho:
12.12.12.12:4000/config/id
Obviamente, isso não vai funcionar para todos eles. Alguém pode me dizer o que estou errado?
Responder1
Eu descobri. Para que a ACL funcione, preciso colocar o caminho completo do serviço:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment_path path_beg -i /payment/list
use_backend servers-paymentdate if payment-path
acl employee-path path_beg -i /employee/list
use_backend servers-employeename if employee-path
Isso não é o ideal, então estou analisando como o regex funciona nessas acl.
Editar: foi capaz de descobrir isso. Eu só tive que configurar um path_reg:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment_path path_beg -i /payment.*
use_backend servers-paymentdate if payment-path
acl employee-path path_beg -i /employee.*
use_backend servers-employeename if employee-path
Responder2
Se você usar path_beg -i
, o regex .*
não será necessário. Como path_beg -i
já implica, um URL começando com determinada string, ou seja, /payment corresponderá a qualquer URL começando com /payment. Aqui -i
indica que a correspondência é realizada ignorando maiúsculas e minúsculas. Abaixo estão os trechos de documentos extraídos do site oficial do HaProxy encontradosaqui: (a página está obsoleta, porque o HaProxy 1.5 é bem antigo agora)
ACL derivatives :
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match