【问题标题】:Reverse Proxing with HA Proxy使用 HAProxy 的反向代理
【发布时间】:2021-06-30 01:35:50
【问题描述】:

我正在尝试使用 HA 代理作为反向代理,主要用于负载平衡和健康检查。

因此,我必须使用多个子域和/或子路径来处理不同的域。

  1. https://sub1.example1.com
  2. https://subsub.sub1.example1.com
  3. https://sub2.example2.com
  4. https://example3.com/path1

不幸的是,我没有找到机会为每个域定义一个前端以将 SSL-cert-file 绑定到。 此外,我不太确定 HAProxy 是否提供类似 ProxyPass 的东西来处理“路径”-Stuff。

谁能给我一个例子,如何用 HAProxy 解决这个问题?

谢谢

【问题讨论】:

    标签: ssl subdomain reverse-proxy haproxy


    【解决方案1】:

    您可以拥有一个处理所有子域的前端,并使用ACL's 路由到不同的后端。您在bind 行上定义您的certificates,并且可以指定多个。我不太清楚您所说的“处理“路径”-Stuff 的 ProxyPass 是什么意思,但如果您提供更多详细信息,我可以提供帮助。 HAProxy 非常灵活。

    提供类似 ProxyPass 的东西来处理“路径”-Stuff。

    如何处理多个子域的示例:

    defaults
        mode http
    
    frontend fe_main
        bind :80
        # define all certificates
        bind :443 ssl crt /etc/haproxy/ssl/sub1.example.com.pem crt /etc/haproxy/ssl/sub2.example.com.pem crt /etc/haproxy/ssl/example3.com.pem
    
        use_backend be_sub1 if { req.hdr(host) sub1.example.com }
        use_backend be_sub2 if { req.hdr(host) sub2.example.com }
        default_backend be_catchall
    
    backend be_sub1
        server app1 192.168.1.10:80 check
    
    backend be_sub2
        server app1 10.2.0.4:443 check ssl verify none
    
    backend be_catchall
        server catchall1 10.3.2.5:80 check
    

    【讨论】:

    • 首先,谢谢,这很有帮助。 “Path-Stuff”是指从example3.com/path1server3.internal 的重定向,而(例如)example3.com 应该路由到 http:/server4.internal 有没有办法动态应用不同的证书?就像只给出文件夹路径而不是每个证书? HA-Proxy 如何知道哪个证书属于哪个域?
    • 如果您想为特定路径使用特定服务器或后端,您可以使用 ACL 与 use_backend 规则或 use-server 规则(在后端内部)结合使用。即 use_backend if { path -m beg /path1 } or use-server if { path -m beg /path1 } 关于证书,它能够匹配客户端发送的 SNI,并为客户端生成相应的证书。跨度>
    • 非常感谢@dcorbett,帮助很大
    最近更新 更多