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будут обслуживаться файлы, nginxесли только не pathначинается с /api( subdomain.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

Он выдает 404 из-за url_beg. Он использует полный URL, а не конечную часть после домена, т.е. он попадает "http..."вhttp://subdomain.mydomain.com/api

url_beg Возвращает true, если URL начинается с одной из строк. Это можно использовать для проверки того, начинается ли 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

Связанный контент