HAProxy: 프런트엔드와 동일한 하위 도메인에 있는 API

HAProxy: 프런트엔드와 동일한 하위 도메인에 있는 API

haproxy.cfg내 파일 에 다음과 같은 구성이 있습니다 .

    acl is_api url_beg -i /api
    acl is_frontend hdr(host) -i subdomain.mydomain.com

    use_backend api if is_api
    use_backend nginx-frontend if is_frontend

내 목표:

( ) 로 시작 하지 않는 한 히트는 subdomain.mydomain.com파일을 제공합니다. 그러면 내 백엔드를 사용해야 합니다 .nginxpath/apisubdomain.mydomain.com/api/*api

이제 현재 구성을 사용하여 haproxy서비스를 다시 시작하면 두 가지 시나리오가 발생합니다.

  1. 나는 간다 subdomain.mydomain.com– 그것은 봉사하고 있다 nginx-frontend– 훌륭하다. 그런 다음 subdomain.mydomain.com/api- 404( nginx사용됨) 로 이동합니다 .

  2. subdomain.mydomain.com/api나는 그것을 서빙 하러 간다 api– 훌륭하다. 그런 다음 subdomain.mydomain.com- 404( api백엔드가 사용됨) 로 이동합니다 .

따라서 두 페이지 중 첫 번째 방문 순서에 따라 내 하위 도메인에 대한 모든 요청이 두 백엔드에 할당됩니다.

완전 초보라서 바보같은 질문이었다면 죄송합니다.

도움이 필요하세요?

답변1

좋아, 방법을 알아냈는데... 하지만 nginx구성( /etc/nginx/sites-enabled/default)에서는 다음과 같습니다.

server {
    listen 8080 default_server;
    listen [::]:8080 default_server ipv6only=on;

    server_name subdomain.mydomain.com;
    location /api {
            proxy_pass http://127.0.0.1:4001;
    }

    location / {
            try_files $uri $uri/ =404;
    }
}

그리고 haproxy.cfg파일에서:

backend nginx
    server nginx-1 127.0.0.1:8080 check

frontend all
    bind *:80
    mode http

    acl is_frontend hdr(host) -i subdomain.mydomain.com
    use_backend nginx if is_frontend

    # other frontends...

누군가가 그것이 좋은 접근 방식인지에 대해 논평할 수 있다면 감사하겠습니다!

답변2

. url_beg​이는 도메인 뒤의 부분이 아닌 전체 URL을 사용합니다. 즉, 도메인이 들어옵니다 "http...".http://subdomain.mydomain.com/api

url_beg URL이 문자열 중 하나로 시작되면 true를 반환합니다. 이는 URL이 슬래시로 시작하는지 아니면 프로토콜 체계로 시작하는지 확인하는 데 사용할 수 있습니다.

대신 사용하세요 path_beg.

frontend fe
  ...
  acl is_api path_beg -i /api
  acl is_frontend hdr(host) -i subdomain.mydomain.com

  use_backend api if is_api
  use_backend nginx-frontend if is_frontend !is_api

관련 정보