Haproxy - 将请求转发到 S3 托管站点

Haproxy - forward request to S3 hosted site

我对haproxy知之甚少。正在测试

的配置

S3 托管网站(route 53 别名)- content.mydomain.com
URL 登陆 haproxy - www.mydomain.com/getfiles/

是否可以将 www.mydomain.com/getfiles/ 重定向到 content.mydomain.com(s3 托管网站)。

我能够使用下面提到的配置

将它重定向到同一服务器上的另一个应用程序运行
  acl display-s3-content path_beg /getfiles/
  use_backend my-content if display-s3-content

backend my-content   
  reqrep ^([^\ ]*)\ (.*) \ /path/   
  server test www.mycomain.com:1936

但是当我尝试将它重定向到 s3 托管站点时,它不起作用。下面是不工作配置的后端

  reqrep ^([^\ ]*)\ (.*) \ /path/
  server test1 content.mydomain.com

谢谢!

正如您在评论中指出的那样,这有效:

reqirep ^Host: Host:\ content.mydomain.com

想法是将 Host header 设置为 S3 期望的值。

一种更简洁的方法是:

http-request set-header Host content.mydomain.com

我说"better"是因为它使用newer/better/safer机制进行header操作,但它从根本上实现了相同的目的:将请求header更改为目标服务器 (S3) 期望。使用 http-request 方法是 safer/cleaner 因为它是 "smarter" 关于它如何操纵请求——使用 req[i]rep 比使用 [= 更容易完全破坏协议15=].

最初,您询问了存储桶中 /getfiles/test.jpg/test.jpg 的映射。这种重写在 HAProxy 1.6 及更高版本中非常简单和干净:

http-request set-path %[path,regsub(^/getfiles,)]

...但是在 1.5 中您必须使用 reqirep 因为 regsub(正则表达式替换)转换器不可用:

reqirep ^([^\ :]+)\ +/getfiles(.*) \ 

这与请求中的 GETHEADPOST 等)行匹配,并从路径中删除额外的 /getfiles。在排除模式中包含 : 可防止它匹配任何其他 header。可以使用类似的模式在将请求发送到 S3 之前添加前缀(例如发布版本等)。

我也在这里发布了一个示例配置。此配置将提供:

http://<haproxy>/foo/index.html

index.html 坐在 S3 上。

https://gist.github.com/amslezak/6573767376860ed59a74878fbff6e61f