haproxy NOSRV 重定向端口问题

haproxy NOSRV 重定向端口问题

我尝试在一个端口 (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 认为它已关闭

相关内容