HAProxy ACL для нескольких внутренних портов не работает

HAProxy ACL для нескольких внутренних портов не работает

Я пытаюсь настроить haproxy для навигации между несколькими приложениями, запущенными на одном сервере. Если я правильно понимаю, я должен иметь возможность использовать правила ACL во внешнем интерфейсе для переключения между портами на основе переданного ему пути. Однако каждый раз, когда я пытаюсь, я получаю 503 Service Unavailable. Я использую версию 1.5.18 HAProxy и подтвердил, что нужные мне службы запущены и работают на правильных портах. Мой файл конфигурации:

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

Так, например, если я попробую:

12.12.12.12:3000/config/id

Я могу получить результаты, которые я ожидаю. Однако, когда я пытаюсь

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

Это не удается. Пока что единственный способ, которым мне удалось получить результаты по одному из путей, — это удалить для него правило acl и включить бэкэнд по умолчанию:

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

Что позволило мне использовать путь:

12.12.12.12:4000/config/id

Хотя это, очевидно, не будет работать для всех. Может кто-нибудь сказать мне, в чем я не прав?

решение1

Я разобрался. Чтобы ACL заработал, мне нужно указать полный путь к сервису:

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

Это не идеально, поэтому я изучаю, как работают регулярные выражения в этих acl.

Редактировать: Разобрался с этим. Мне просто нужно было настроить 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

решение2

Если вы используете, path_beg -iто regex .*не нужен. Как path_beg -iуже подразумевается, URL, начинающийся с определенной строки, например, /payment, будет соответствовать любому URL, начинающемуся с /payment. Здесь -iуказано, что сопоставление выполняется без учета регистра. Ниже приведены фрагменты документации, извлеченные с официального сайта HaProxy, найденныездесь: (страница устарела, поскольку HaProxy 1.5 уже довольно старый)

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

Связанный контент