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サービスを再起動すると、次の 2 つのシナリオが考えられます。

  1. に行くと、subdomain.mydomain.com- うまく機能しています- 素晴らしいです。 次に、 - 404 (使用されました)nginx-frontendに移動します。subdomain.mydomain.com/apinginx

  2. subdomain.mydomain.com/apiサービングにアクセスします- 素晴らしいです。その後、 404 (バックエンドが使用されました)apiに移動します。subdomain.mydomain.comapi

したがって、どちらかのページに最初にアクセスした順序に応じて、サブドメインへのすべてのリクエストがどちらかのバックエンドに割り当てられます...

私は完全な初心者なので、愚かな質問だったらごめんなさい。

何か助けて?

答え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

404エラーが発生します。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

関連情報