具有子域设置的Haproxy设置


8

希望有人可以帮助确认这是否可行?我正在尝试将3个子域流量路由到同一haproxy主机;

这是我的设置

具有一个接口ip 10.10.10.100和dns名称haproxy01.mydomain.com的haproxy

3条与之相关的CNAME记录;sub1.mydomain.com,sub2.mydomain.com和sub3.mydomain.com

所有传入流量都用于端口443。

可以说,有两个后端应用程序服务器在三个端口8081、8082、8083上接受流量。

用于8081的sub1.mydomain.com用于8082的sub2.mydomain.com和用于8083的sub3.mydomain.com

该应用程序仅需要为端口8081的流量提供SSL传递,所以我认为我必须为其使用tcp模式,而针对8082和8083的其他流量也应使用SSL,但可以在Haproxy处将其终止,但是对于测试,我使用了所有TCP模式。

我的配置部分实现了以下内容;

    #Application Setup 
frontend mytraffic
    bind *:443
    mode  tcp
    acl host_sub1 hdr(host) -i sub1.mydomain.com
    acl host_sub2 hdr(host) -i sub2.mydomain.com
    acl host_sub3 hdr(host) -i sub3.mydomain.com

    use_backend sub1_nodes if host_sub1
    use_backend sub2_nodes if host_sub2
    use_backend sub3_nodes if host_sub3

    option tcplog backend sub1_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8081 check
    server node2 10.10.10.102:8081 check 
backend sub2_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8082 check
    server node2 10.10.10.102:8082 check 
backend sub3_nodes
    mode tcp
    balance roundrobin
    stick-table type ip size 200k expire 30m
    stick on src
    server node1 10.10.10.101:8083 check
    server node2 10.10.10.102:8083 check


    # APPLICATION SETUP END

例如,当我尝试通过HAproxy访问应用服务器以获取8082流量时,会抛出日志。

本地主机haproxy [6097]:xxxx:51241 [20 / Mar / 2015:12:19:38.720] mytraffic mytraffic / -1 / -1 / 0 0 SC 0/0/0/0/0 0/0

感谢有关此设置的一些指导。

附注:由于这是我的第一篇文章,因此我在此处无法清晰地嵌入任何图像:-(


日志消息不完整;3月20日12:19:38本地主机haproxy [6097]:xxxx:51241 [20 / Mar / 2015:12:19:38.720] mytraffic mytraffic / <NOSRV> -1 / -1 / 0 0 SC 0/0/0 / 0/0 0/0
全球学习

NOSRV表示找不到合适的后端。您可以访问统计信息页面或套接字,看看HAproxy认为后端有什么发展吗?
Jim G.

还要检查haproxy和应用程序服务器之间是否存在连接。如果使用数控:数控-v 10.10.10.101 8081,NC -v 10.10.10.102 8081,等等
hdanniel

haproxy监控仪表板上的最后一项检查正在报告所有节点。我还确认了从Haproxy控制台到所有端口上的这些应用程序服务器的连接。
Global Learning

@HD是,两个节点上的连接都很好。
Global Learning

Answers:


11

在TCP模式下,HAProxy不会解码HTTP请求,因此您的acl行将不执行任何操作,并且前端将永远无法与后端匹配,如您输入的日志所示:这mytraffic/<NOSRV>意味着它无法选择后端或服务器。

您必须将3个子域划分为2个不同的前端,每个前端都有自己的IP,因为它们都连接在端口443上。一个用于直通,另一个用于SSL终止和使用进行内容切换mode http。需要注意的是,如果要添加还需要传递权限的第四个子域(sub4.mydomain.com),则需要第三个前端和IP。

您还需要在DNS中创建不同的CNAME或A记录,以便正确的子域指向正确的IP。

鉴于此DNS配置:

10.10.10.100        A         haproxy01-cs.mydomain.com
10.10.10.101        A         haproxy01-pt1.mydomain.com
10.10.10.102        A         haproxy01-pt2.mydomain.com
sub1.mydomain.com   CNAME     haproxy01-pt1.mydomain.com
sub2.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub3.mydomain.com   CNAME     haproxy01-cs.mydomain.com
sub4.mydomain.com   CNAME     haproxy01-pt2.mydomain.com

HAproxy配置看起来像这样:

#Application Setup 
frontend ContentSwitching

  bind 10.10.10.100:443
  mode  http
  option httplog
  acl host_sub2 hdr(host) -i sub2.mydomain.com
  acl host_sub3 hdr(host) -i sub3.mydomain.com
  use_backend sub2_nodes if host_sub2
  use_backend sub3_nodes if host_sub3

frontend PassThrough1
  bind 10.10.10.101:443
  mode  tcp
  option tcplog
  use_backend sub1_nodes     

frontend PassThrough2
  bind 10.10.10.102:443
  mode  tcp
  option tcplog
  use_backend sub4_nodes

backend sub1_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8081 check
  server node2 10.10.10.102:8081 check 

backend sub2_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8082 check
  server node2 10.10.10.102:8082 check 

backend sub3_nodes
  mode http
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8083 check
  server node2 10.10.10.102:8083 check

backend sub4_nodes
  mode tcp
  balance roundrobin
  stick-table type ip size 200k expire 30m
  stick on src
  server node1 10.10.10.101:8084 check
  server node2 10.10.10.102:8084 check

实际上,我在这里拥有的IP没有任何意义(我将10.10.10.101-102用于将它们分配给节点的前端),但是您对它的外观有所了解。
GregL

@GreL-谢谢。我将尝试此方法并圈出结果。在使用tcp模式和acl之前,我很担心。
Global Learning

谢谢格雷格。有用。最后一个问题,我可以吗?从客户端-> haproxy和haproxy->后端服务器获取SSL(就像它可以终止,但是在后端启动一个新的SSL),推荐的做法是什么?SSL通过TCP模式?我之所以想要8081端口流量通过,是因为需要与应用程序和客户端进行相互认证的会话。端口8082和8083的其余流量需要ssl,但不需要相互认证。(现在我采用直通方法)。
全球学习

好的,HAProxy可以通过使用语句的ca-fileverify optional选项来进行客户端证书检查bind。如果这样做,则可以将单个前端绑定到一个IP,然后根据主机标头的要求将内容切换到适当的后端。要确认相互身份验证有效,您可以创建一个acl这样acl ClientSSLValid ssl_c_verify 0,然后将其作为另一个条件添加到该use_backend语句中,例如use_backend sub1_nodes if host_sub1 ClientSSLValid
GregL

这里这里都有关于如何执行此操作的不错的文章,比我提供的更多细节。
GregL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.