【问题标题】:HAProxy - Serving a URL from 2nd machine if the 1st returns a 404HAProxy - 如果第一台机器返回 404,则从第二台机器提供 URL
【发布时间】:2018-11-14 04:49:14
【问题描述】:

我有一种情况,我有一部分网站(某些 URL 路径)是从一个后端服务器提供的,而所有其他 URL 是从 HAProxy 中的不同默认后端提供的。

现在,由于应用程序逻辑的编写方式,在同一 URL 路径下提供的文件可以在两台物理服务器机器中的任何一台上的同一路径中创建。无论文件存在于哪台机器上,我都希望能够提供这些文件。所以简而言之,我如何将请求转发到一个后端,如果响应是 404(该文件不存在),则转发要从另一个后端提供服务的请求?

我是 HAProxy 的菜鸟,因此我们将不胜感激。谢谢。

haproxy.conf的相关部分:

frontend frontend0 ... acl de path_beg /path1 acl de path_beg /path2 acl de path_beg /path3 use backend backend1 if de default_backend bakend backend backend1 ... server server_name 127.0.0.1:8000 backend backend2 ... server server_name 192.168.11.1:8000

有一个路径 /path4 需要从这两台机器上提供服务,具体取决于文件所在的位置。

【问题讨论】:

  • HAProxy 会在请求发送到后端后立即释放包含标头的请求缓冲区,因此它无法在其他地方重试请求。我成功使用的一种解决方法是使用查询字符串参数将 404 更改为 302,以便浏览器必须发出第二个请求,并且当代理看到该参数时,它会尝试另一台服务器......但更好的解决方案似乎是 HAProxy 后面的清漆,因为清漆确实支持在其他地方重新启动请求。您想看看其中任何一个解决方案吗?
  • 嗨@Michael-sqlbot。我会对这两种解决方案感兴趣。重定向解决方案是我首先要使用的,因为我以前从未使用过 Varnish,但我愿意检查一下。感谢您的所有帮助。
  • 我必须找到工作示例,所以可能需要几个小时,但我会看看我能把什么放在一起。
  • 谢谢。文档中的任何指针也将不胜感激。
  • 使用http-response 指令set-statusset-header 是第一个选项的核心,如果您想在我创建一些示例之前先尝试一下。事实证明,您不必担心 404 正文,因为浏览器会将其丢弃,只需将代码更改为 302 并重定向到源 URI 的修改版本。

标签: haproxy


【解决方案1】:

感谢@Michael-sqlbot 的提示和ServerFault 上的this 问题的答案大纲。我最终使用的设置如下:

  • 我设置了一个单独的 URL /_path4,它由一个后端提供,而原始 URL /path4 由另一个后端提供。
  • 从第一个后端接收到 /path4 的 404 响应后,我重定向到 URL /_path4

我的配置文件现在如下所示:

frontend frontend0 ... acl de path_beg /path1 acl de path_beg /path2 acl de path_beg /path3 acl de path_beg /_path4 use_backend backend2 if de default_backend backend1 ... backend backend1 ... http-request set-var(txn.path) path server server_name 127.0.0.1:8000 http-response redirect location %[var(txn.path),regsub('^/path4','/_path4')] code 303 if { status 404 } { var(txn.path) -m beg '/path4' } ... backend backend2 ... server server_name 192.168.11.1:8000

正如@Michael-sqlbot 对链接问题的优秀cmets 中所解释的,需要设置事务变量,因为在http-response 阶段,缓冲区已被释放,因此前端使用的普通path 变量不可用。

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 2021-07-07
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2015-08-31
    相关资源
    最近更新 更多