我的文件中有这样的配置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 当 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