【问题标题】:How do I locally test haproxy when routing based on host name?基于主机名路由时如何在本地测试 haproxy?
【发布时间】:2017-09-21 23:14:15
【问题描述】:

我有一个相当复杂的 haproxy 配置,它根据请求的主机(通过 acl + hdr_dom)路由到后端。如果我想在本地测试配置,我必须更改要测试的主机的分辨率(例如,通过更改 hosts 文件将主机解析为 127.0.0.1)。然后我可以使用 wget 或 curl 在本地测试 haproxy 配置,然后重置 hosts 文件。

但是,我想要进行自动化测试,而在自动化测试中更改系统级别的内容让我很紧张。在我以自动方式更改主机文件的路径之前,有没有办法告诉 haproxy“假装这个请求是向 xxx.yyy.com 发出的”?我可以采取其他方法吗?

谢谢

【问题讨论】:

    标签: automated-tests haproxy


    【解决方案1】:

    有没有办法告诉 haproxy“假装这个请求是向 xxx.yyy.com 发出的”?

    我认为这是个错误的问题。正确的问题是“我如何告诉 curl example.com 的 IP 地址是 127.0.0.1?”

    答案是--resolve

    curl -v --resolve example.com:80:127.0.0.1 http://example.com
    curl -v --resolve example.com:443:127.0.0.1 https://example.com
    

    这会将答案 (127.0.0.1) 预加载到 curl 的 DNS 缓存中,仅用于该调用,这显然会欺骗它实际上不进行 DNS 查找,因为它认为它已经做了。相反,它将连接到您指定的 IP 地址。

    【讨论】:

    • 谢谢,这是完美的。我就知道外面一定有这样的东西
    【解决方案2】:

    上面 Micheal 的答案是解决这个问题的最佳方法(因为它实际上是通过 DNS 查找)。如果这不起作用,我发现将 Host HTTP Header 设置为服务器也可以。例如,在 Windows/PowerShell 中,以下工作。

    iwr http://localhost:8090/testjudge.aspx?version=1 -headers @{Host="xxx.yyy.com"}
    

    Linux 的原生 curl 有不同的语法,但想法是一样的。见This post on how to do this on various platforms

    【讨论】:

    • 这确实有效——大多数情况下——但在您使用 HTTPS 和 SNI 时无效。使用--resolve 技巧基本上与破解您的主机文件相同,但侵入性较小。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2023-03-22
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多