
У меня в файле есть такая конфигурация 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
службы возможны два сценария:
Я иду на
subdomain.mydomain.com
- он обслуживаетсяnginx-frontend
- отлично. Затем я иду наsubdomain.mydomain.com/api
- 404 (nginx
был использован).Я перехожу к
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