
동일한 서버에서 실행되는 여러 애플리케이션 사이를 탐색하기 위해 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
하지만 이것은 분명히 그들 모두에게 효과가 없을 것입니다. 누구든지 내가 뭘 잘못했는지 말해 줄 수 있나요?
답변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
정규식이 .*
필요하지 않습니다. 이미 암시 한 대로 path_beg -i
특정 문자열로 시작하는 URL, 즉 /결제는 /결제로 시작하는 모든 URL과 일치합니다. 여기서는 -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