设置
我有一个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,它们都是按顺序排列的)。我已经花了几个小时了,真的不知道还能尝试什么。