我配置了一个 HAProxy 服务器,它应该检测请求是否来自server.company.cxx
并将请求转发到 10.0.xx 上的服务器。如果请求不满足此条件,它会将请求转发到本地主机上的默认 Web 服务器。
因此,我使用这个配置:
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
# [...]
frontend public
bind :8080
acl is_company_server hdr(host) -i server.company.cxx
use_backend company_www if is_company_server
default_backend default
backend company_www
timeout server 60s
server www_server 10.x.x.x:8080
backend default
timeout server 2s
server default 127.0.0.1:80
我尝试访问http://server.mycompany.cxx:8080
,但每个请求都以默认后端结束。就好像acl
不起作用一样。
我激活了日志服务,但我只看到以下内容:
Jul 3 19:26:41 localhost haproxy[11070]: 70.x.x.x:60819 [03/Jul/2016:19:26:41.563] public default/default 0/0/0/0/0 304 174 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
我如何知道为什么 HAProxy 选择后端“默认”并且 ACL 失败?
答案1
其实,解决方案很简单:HAProxy 服务器监听的是 8080 端口。因此,URL 是http://server.company.cxx:8080/
。因此,主机名是server.company.cxx:8080
,其中包括端口号作为主机名的一部分。
这解决了问题:
frontend public
bind :8080
acl is_company_server hdr(host) -i server.company.cxx:8080
或者,可以这样解决:
frontend public
bind :8080
acl is_company_server hdr_dom(host) -i server.company.cxx