
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 -i
entonces .*
no es necesaria la expresión regular. Como path_beg -i
ya implica, una URL que comience con cierta cadena, es decir, /pago coincidirá con cualquier URL que comience con /pago. Aquí -i
indica 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