HAProxy:在与前端相同的子域上的API

我在haproxy.cfg文件中有这样的configuration:

  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/apisubdomain.mydomain.com/api/* )开头 – 那么它应该使用我的api后端。

现在,使用当前的configuration,当我重新启动haproxy服务时,有两种情况:

  1. 我去subdomain.mydomain.com – 它服务于nginx-frontend – 很好。 然后我去subdomain.mydomain.com/api – 404(使用nginx )。

  2. 我去subdomain.mydomain.com/api它服务的api – 伟大的。 然后我去subdomain.mydomain.com 404(使用api后端)。

因此,根据我在任一页面上的第一次访问的顺序,所有对我的子域的请求都被分配到后端…

我是一个总新手,我很抱歉,如果这是一个愚蠢的问题。

任何帮助?

好的,我想出了一个办法…但是在nginxconfiguration( /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... 

如果有人可以评论这是否是一个好方法,我将不胜感激!

它由于url_beg给出了404。 这使用完整的url,而不是后面的部分,即它得到"http..." http://subdomain.mydomain.com/api

url_beg当URL以一个string开始时返回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