Назад | Перейти на главную страницу

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

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

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

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

Я понял. Чтобы 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