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

Amazon s3 Haproxy-将请求转发到S3托管站点,amazon-s3,haproxy,Amazon S3,Haproxy,我对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/

我对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 ^([^\ ]*)\ (.*) \1\ /path/\2   
  server test www.mycomain.com:1936
但当我尝试将其重定向到s3托管站点时,它不起作用。下面是不工作配置的后端

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

谢谢

正如您在评论中所指出的,这是有效的:

reqirep ^Host: Host:\ content.mydomain.com
其思想是将主机头设置为S3期望的值

一种较为干净的方法是:

http-request set-header Host content.mydomain.com
我之所以说“更好”,是因为它使用了一种更新/更好/更安全的机制来进行报头操作,但它基本上实现了相同的目的:将请求报头更改为目标服务器(S3)所期望的。使用
http请求
方法更安全/更干净,因为它在处理请求的方式上更“聪明”——使用
req[i]rep
比使用
http请求
更容易完全破坏协议

最初,您询问了bucket中映射到
/test.jpg
/getfiles/test.jpg
。在HAProxy 1.6及更高版本中,此重写非常简单和干净:

http-request set-path %[path,regsub(^/getfiles,)]
…但在1.5中,您必须使用
requirep
,因为
regsub
(regex替换)转换器不可用:

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

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

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

http:///foo/index.html

index.html
放在S3上


这不是“重定向”,而是“转发”。因此,如果请求的路径以
/getfiles/
开头,则需要将该请求发送到bucket。我可以发布一个答案来说明这是如何实现的,但首先,我需要知道您希望如何处理路径开头的
/getfiles/
,以便我们在bucket中找到正确的路径。移除它?用别的东西代替它?还有,HAProxy的哪个版本?嘿,michael,我很高兴知道它的正确方法,HAProxy-1.5.2,我相信需要删除它,因为我想目前s3正在抛出301,因为它必须是content.mydomain.com才能显示内容。谢谢这条路怎么样?例如,名为
/getfiles/test.jpg
的文件在bucket中的什么位置?仍然在
/getfiles/test.jpg
?或者只是
/test.jpg
?还是另一个路径?它只是/test.jpg,content.mydomain.com指向bucket content.mycomain.com,索引文档是index.html,如下所示。我来自www.mydomain.com/getfiles。这个http请求语句添加了哪个文件?@fuzzi这些指令是在HAProxy中设置的。它通常位于
/etc/haproxy/haproxy.cfg
,但该路径可能会在不同的安装中更改。我是否也可以将https通信转发到同一后端?如果haproxy使用SSL证书绑定到:443,它应该透明地转发到s3。以下是有关如何绑定443+证书的快速方法: