我尝试在一个端口 (8080) 上捕获 http 流量并将其重定向到内部端口 (12345)。我的 haproxy.cfg 中有以下内容
frontend rest_front
bind *:8080
#reqadd X-Forwarded-Proto:\ http
#reqadd X-Forwarded-Port:\ 12345
acl host_rest hdr(host) -i mypublicserver.myhost.com
stats uri /haproxy?stats
acl url_blog path_beg /blog
# figure out which one to use
use_backend rest_cluster if host_rest
backend rest_cluster
server rest_server_host myinternalserver.myotherhost.com:12345 check
当我测试与 mypublicserver.myhost.com 的连接时,我在日志文件中看到以下内容......
Aug 10 14:18:35 myproxy haproxy[30258]: <IP_ADDRESS>:56779 [10/Aug/2017:14:18:35.309] rest_front rest_front/<NOSRV> -1/-1/-1/-1/2 503 213 - - SC-- 1/0/0/0/0 0/0 "GET /somepage.html HTTP/1.1"
我不明白为什么后端没有命中。我使用的 URL 是http://mypublicserver.myhost.com:8080/somepage.html这应该会触发 acl。
答案1
没有默认的后端可供使用,休息集群仅在 host_rest ACL 有效时使用。
因此,任何 HOST 标头与“mypublicserver.myhost.com”不匹配的请求都不会路由到任何后端,这会导致 503 错误。
因此,您可以添加默认后端指令或者删除/编辑 ACL。
编辑:如果 ACL 不匹配,这是因为它缺少端口部分:8080
请尝试:
acl host_rest hdr (主机) -i mypublicserver.myhost.com:8080
答案2
我遇到了类似的问题,日志文件中出现了带有类似字符串的 503 错误。感谢 @MoEmEn,我解决了这个问题。
答案主要是“ACL 不匹配,这是因为它缺少端口部分“
对我来说,最好的方法是编写规则,其中 url 可以包含或不包含端口。因此,这是我针对 HAproxy 的规则:
use_backend host_rest if { req.hdr(Host),regsub(:[0-9]+$,) -i mypublicserver.myhost.com }
答案3
就我而言,问题是我正在使用 SSL-Passthrough,但是 acl hdr(host) 不适用于 pass through,因为它需要终止解密标头的请求。所以我决定使用 SSL-Termination,然后向后端服务器发出 SSL 请求。
参考 : https://discourse.haproxy.org/t/haproxy-not-switching-between-backends/1903/15
答案4
对于我来说,我必须禁用 http 检查,因为我的网站返回错误 404,而 haproxy 认为它已关闭