我们为 rails webapp 设置了一个临时环境,将其设置为第二个 Apache 虚拟主机,并在两者之前安装了 haproxy 1.5。直到最近,该临时环境才配置为与实时版本不同的前端,监听不同的端口。这非常有效,因为任何重定向、链接等都运行良好,所有流量都只是通过不同的端口。
但是,我们正在向网站添加 https 重定向;这会破坏基于端口的策略,因为 http 和 https 监听不同的端口(因此如果您在例如 443 上监听 ssl,则会重定向http://www.example.com:3000
到该端口,这会中断。https://www.example.com:3000
我尝试了与本文作者类似的设置:HAProxy reqrep 删除后端请求中的 URI
也就是说,如果我插入/stage/
我的 url,我已经配置了一个单独的 haproxy 前端来使用“stage”后端,所以:
www.example.com/somepage.html
从实时后端提供页面,同时
www.example.com/stage/somepage.html
从 stage 后端提供页面。因为我显然想在两个后端运行具有相同目录结构的应用程序,所以我从 stage 后端的 URI 中删除了“/stage/”。问题是,任何时候 rails 应用程序本身想要重定向我(如果我点击链接!),stage 就不再在 url 中,所以它会将我重定向到实时网站。设置的想法是,一旦我们完成测试,应用程序就可以从 stage 复制到实时,所以如果可以避免,我不希望我的 Ruby 代码知道或关心它处于哪个环境中。是否有任何方法(在 haproxy 或 apache 中)使该版本发出的任何 http 请求都“保留在内部”,以便如果我登录到 stager 版本,我就会留在那里?
提前致谢。
答案1
如果您想设置暂存环境,我不会研究不同的 URL、子目录、端口或类似的东西。相反,我可以推荐两种不需要任何 URL 重写的不同方法。
您可以在不同的 IP 地址上设置暂存环境的前端。如果您想测试暂存环境,只需将(子)域指向本地 hosts 文件中的暂存 IP 即可。当然,这种方法要求您有一个可用的 IP 地址。
您可以根据域上设置的 cookie 在 HAProxy 中设置 ACL。如果您启用 cookie,您将被发送到暂存环境。在 HAProxy 配置中,这看起来如下所示:
frontend main [... bind stuff ...] acl staging_cookie_set req.cook(enableStaging) -m str 1 [... rest of your frontend logic ...] use_backend staging if staging_cookie_set default_backend live
如果您现在将 cookie“enableStaging”设置为“1”,您将被发送到暂存环境。