【发布时间】: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-status和set-header是第一个选项的核心,如果您想在我创建一些示例之前先尝试一下。事实证明,您不必担心 404 正文,因为浏览器会将其丢弃,只需将代码更改为 302 并重定向到源 URI 的修改版本。
标签: haproxy