我有一种情况,我从一个后端服务器提供网站的一部分(某些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
。
感谢@ Michael-sqlbot关于ServerFault上的提示和this问题的答案大纲。我最终使用的设置如下:
我的配置文件现在看起来如下:
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对链接问题的优秀评论中所解释的那样,事务变量的设置是必需的,因为在http-response
阶段,缓冲区已被释放,因此前端中使用的正常path
变量不可用。