여러 백엔드 포트에 대한 HAProxy ACL이 작동하지 않습니다.

여러 백엔드 포트에 대한 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

하지만 이것은 분명히 그들 모두에게 효과가 없을 것입니다. 누구든지 내가 뭘 잘못했는지 말해 줄 수 있나요?

답변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

관련 정보