HAProxy ACL para múltiples puertos backend no funciona

HAProxy ACL para múltiples puertos backend no funciona

Estoy intentando configurar haproxy para navegar entre las múltiples aplicaciones que se ejecutan en el mismo servidor. Si mi comprensión es correcta, debería poder usar reglas ACL en la interfaz para cambiar entre puertos según la ruta que se le pasa. sin embargo, cada vez que lo intento, lo consigo 503 Service Unavailable. Estoy usando la versión 1.5.18 de HAProxy y he confirmado que los servicios que deseo están funcionando en los puertos correctos. Mi archivo de configuración es:

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

Entonces, por ejemplo, si intento:

12.12.12.12:3000/config/id

Puedo obtener los resultados que espero. Sin embargo, cuando intento

12.12.12.12:4000/configuration
#or
12.12.12.12:4000/configuration/config/to/service

Falla. Hasta ahora, la única forma en que he podido obtener resultados de una de las rutas es eliminar la regla acl e incluir un backend predeterminado:

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

Lo que me permite usar la ruta:

12.12.12.12:4000/config/id

Sin embargo, obviamente esto no funcionará para todos ellos. ¿Alguien puede decirme en qué me equivoco?

Respuesta1

Me lo imaginé. Para que la ACL funcione, necesito ingresar la ruta completa del servicio:

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

Esto no es ideal, así que estoy analizando cómo funcionan las expresiones regulares en estas ACL.

Editar: Pude resolver esto. Sólo tuve que configurar un 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

Respuesta2

Si lo usa, path_beg -ientonces .*no es necesaria la expresión regular. Como path_beg -iya implica, una URL que comience con cierta cadena, es decir, /pago coincidirá con cualquier URL que comience con /pago. Aquí -iindica que la coincidencia se realiza ignorando mayúsculas y minúsculas. A continuación se encuentran los fragmentos de documentos extraídos del sitio oficial de HaProxy.aquí: (Sin embargo, la página está obsoleta porque HaProxy 1.5 es bastante antiguo ahora)

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

información relacionada