HAProxy:与前端位于同一子域的 API

HAProxy:与前端位于同一子域的 API

我的文件中有这样的配置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将使用文件提供文件- 那么它应该使用我的后端。nginxpath/apisubdomain.mydomain.com/api/*api

现在,使用当前配置,当我重新启动haproxy服务时,会出现两种情况:

  1. 我转到subdomain.mydomain.com- 服务很好nginx-frontend- 很棒。然后我转到subdomain.mydomain.com/api- 404(nginx已使用)。

  2. 我转到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

相关内容