我在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以/api ( subdomain.mydomain.com/api/* )开头 – 那么它应该使用我的api后端。
现在,使用当前的configuration,当我重新启动haproxy服务时,有两种情况:
我去subdomain.mydomain.com – 它服务于nginx-frontend – 很好。 然后我去subdomain.mydomain.com/api – 404(使用nginx )。
我去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