Я пытаюсь настроить 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