HAProxy: API no mesmo subdomínio do frontend

HAProxy: API no mesmo subdomínio do frontend

Eu tenho essa configuração em meu haproxy.cfgarquivo:

    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

Meu gol:

Bater subdomain.mydomain.comservirá arquivos usando, nginxa menos que pathcomece com /api( subdomain.mydomain.com/api/*) - então ele deve usar meu apiback-end.

Agora, usando a configuração atual, quando reinicio haproxyo serviço, existem dois cenários:

  1. Eu vou subdomain.mydomain.com- está servindo nginx-frontend- ótimo. Depois vou para subdomain.mydomain.com/api-404 ( nginxfoi usado).

  2. Eu vou subdomain.mydomain.com/apiservir api- ótimo. Então vou para subdomain.mydomain.com-404 (o apibackend foi usado).

Portanto, dependendo da ordem da minha primeira visita em qualquer página, todas as solicitações ao meu subdomínio são atribuídas a qualquer um dos backends...

Sou totalmente novato, desculpe se essa é uma pergunta estúpida.

Qualquer ajuda?

Responder1

OK, descobri um jeito... mas na nginxconfiguração ( /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;
    }
}

e no haproxy.cfgarquivo:

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...

Se alguém pudesse comentar se é uma boa abordagem, ficaria grato!

Responder2

Dá 404 por causa de url_beg. Isso usa o URL completo e não a parte final após o domínio, ou seja, ele "http..."entrahttp://subdomain.mydomain.com/api

url_beg Retorna verdadeiro quando o URL começa com uma das strings. Isto pode ser usado para verificar se um URL começa com uma barra ou com um esquema de protocolo.

Use path_begem vez disso.

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

informação relacionada