我正在尝试为开发人员/测试人员提供一种访问 HAProxy 后面的特定服务器的方法,以方便测试。我们现在的做法是直接访问服务器的主机名(例如 server1.mywebsite.com),但我们已经看到了与虚拟主机、ssl 等相关的差异……我想设置一个 cookie 或查询字符串参数或其他东西,这样我就可以强制使用服务器……
类似于 www.mywebsite.com (带有 cookie super_secret_cookie=server1) 或 www.mywebsite.com?super_secret_key=server1
需要明确的是,这将由内部用户使用,而不是普通公众。
有想法吗?
编辑:我使用的是 1.3.12 版本
答案1
我想你的问题已经过时了,但是对于后来者来说,我是这样做的:
我们定义一些acl:
frontend http-in
acl has_server1_cookie hdr_beg(cookie) server1
use_backend single_server1_backend if has_server1_cookie
当然我们必须定义后端:
backend single_server1_backend
server server1.mywebsite.com 192.168.1.123:80 maxconn 32 check
我们甚至可以在后端部分添加以下内容
reqadd backend:\ server1
这将告诉 haproxy 向发送到 server1 的每个请求添加一个 http 标头
backend: server1
这很好,而且很容易检查,以确保它确实有效。
答案2
你不必要地把事情复杂化了。如果你有“与虚拟主机、ssl 等相关的差异”,那么就修复它们。当你开始用 cookies 和查询字符串参数搞乱事情时(你会修改你的应用程序以在每个请求中保留该查询字符串参数吗?即使更多的复杂化……)你只会让事情变得更加复杂,这意味着更难调试,更有可能被不相关的变化意外破坏,总的来说,你只会让自己的生活变得困难和其他所有人。
因此,退一步思考,不要问如何实施你想出的不成熟的解决方案,而是问一个问题如何解决你的问题。“我们有一个 haproxy,想直接访问机器,但是当我们这样做时,我们得到(描述与虚拟主机的区别)”。
我猜想您的 vhosts 问题在于它们没有设置为直接接受机器的名称,这很容易修复 - 一个额外的条目server_name
(或一个新的ServerAlias
)可以让您摆脱困境。对于 SSL,如果您不使用通配符证书,这会有点棘手,但由于它只是内部用户,因此忽略 SSL 警告是解决问题的(半)有效方法 - 或者您可以为每台机器运行单独的 SSL 证书(在内部 CA 上)。如果您在负载平衡器上终止 SSL,那么别再这样做了。