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