使用 haproxy 的同一 vps 上有多个站点的问题

使用 haproxy 的同一 vps 上有多个站点的问题

设置

我有一个VPS正在使用的docker。我目前有 3 个容器。1 个用于 haproxy,其他 2 个容器包含各自的站点(在端口 8080 上运行 nodejs http 服务器)。

我有以下域和子域。

  • 我的域名
  • deus.ex.machina.mydomain.com
  • fela.mydomain.com

我希望mydomain.com转到两个节点服务器中的第一个,然后fela.mydomain.com转到另一个节点服务器。第三个域deus.ex.machina.mydomain.com应该转到不存在的 IP 地址,以模拟服务器宕机,这样我就可以确保显示 503 页面。

这是我的haproxy.cfg

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option http-server-close
    timeout connect 5000
    timeout client  10000
    timeout server  10000

listen stats
    bind       :1988
    stats uri /

frontend http-in
        bind *:80

        # define hosts
        acl host_deusexmachina  hdr_beg(host) -i deus.ex.machina.mydomain.com
        acl host_fela           hdr_beg(host) -i fela.mydomain.com
        acl host_mydomain       hdr_beg(host) -i mydomain.com

        # figure out which one to use
        use_backend deusexmachina_cluster   if host_deusexmachina
        use_backend fela_cluster            if host_fela
        use_backend mydomain_cluster        if host_mydomain

backend deusexmachina_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server deusexmachina_s1 172.17.0.99:8080 check cookie deusexmachina_s1

backend fela_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server fela_s1 172.17.0.59:8080 check cookie fela_s1

backend mydomain_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server mydomain_s1 172.17.0.50:8080 check cookie mydomain_s1
  • 172.17.0.50:8080 正在运行(nodejs 在端口 8080 上)
  • 172.17.0.59:8080 正在运行(nodejs 在端口 8080 上)
  • 172.17.0.99:8080 无法正常工作(模拟nodejs宕机)

对这三个的所有请求都来自同一个 IP 地址(同一个设备),这就是我这样做的原因option http-server-close

问题

剩下的问题是:有什么问题?

大约 90% 的时间里它们的重定向都是正确的。

  • 如果我连接mydomain.com并点击刷新按钮,10 次中有 9 次会显示正确的页面(172.17.0.50:8080),但有 1 次会显示 503(好像是定向到deus.ex.machina.mydomain.com或者是服务器?我不知道如何检查这一点)。

  • 因为fela.mydomain.com当点击刷新按钮时,十有八九会显示正确的页面 (172.17.0.59:8080),只有 1 次会显示mydomain.com(非 503 页面)页面 (172.17.0.50:8080)。

  • 点击刷新按钮时也是一样deus.ex.machina.mydomain.com,十有八九会显示正确的页面(503 错误),只有一次会显示mydomain.com(非 503 页面)页面(172.17.0.50:8080)。

添加后,option httpclose重定向到错误页面的可能性将达到 50/50,这会使情况变得更糟。

我在同一个 Chrome 浏览器的选项卡中打开了所有 3 个域名,并在它们之间切换并刷新它们。

我怀疑 haproxy 混淆了请求?也许是缓存了 IP 请求应该发送到哪个后端?正如所见,我正在使用 cookie,它应该将请求定向到正确的服务器(我检查了客户端 cookie,它们都是按顺序排列的)。我已经花了几个小时了,真的不知道还能尝试什么。

相关内容