HAProxy ACL para várias portas de back-end não funciona

HAProxy ACL para várias portas de back-end não funciona

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 -ijá implica, um URL começando com determinada string, ou seja, /payment corresponderá a qualquer URL começando com /payment. Aqui -iindica 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

informação relacionada