Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 HaProxy到AWS S3静态网站页面的透明代理_Amazon S3_Haproxy - Fatal编程技术网

Amazon s3 HaProxy到AWS S3静态网站页面的透明代理

Amazon s3 HaProxy到AWS S3静态网站页面的透明代理,amazon-s3,haproxy,Amazon S3,Haproxy,我正在使用haproxy来平衡服务器集群。我正在尝试向haproxy配置添加维护页面。我相信我可以通过在后端用“backup”修饰符定义一个服务器声明来做到这一点。我的问题是,如何使用远程托管在AWS S3 bucket(静态网站)上的维护页面,而不实际将用户重定向到该页面(即haproxy服务器“redir”定义) 如果我有服务器:a、b、c。所有服务器都停机进行维护,然后我希望所有请求都由服务器定义d(标有“备份”)解析到S3上的静态地址。请注意,我不希望在s3上对路径进行继承和评估,它应该

我正在使用haproxy来平衡服务器集群。我正在尝试向haproxy配置添加维护页面。我相信我可以通过在后端用“backup”修饰符定义一个服务器声明来做到这一点。我的问题是,如何使用远程托管在AWS S3 bucket(静态网站)上的维护页面,而不实际将用户重定向到该页面(即haproxy服务器“redir”定义)


如果我有服务器:a、b、c。所有服务器都停机进行维护,然后我希望所有请求都由服务器定义d(标有“备份”)解析到S3上的静态地址。请注意,我不希望在s3上对路径进行继承和评估,它应该始终呈现静态维护页面。

这绝对是可能的

首先,声明一个备份服务器,该服务器仅在非备份服务器关闭时使用

server s3-fallback example.com.s3-website-us-east-1.amazonaws.com:80 backup
只有在使用备用路径时,以下配置条目才用于修改请求或响应。我们在以下示例中使用了两个测试:

# { nbsrv le 1 } -- if the number of servers in this backend is <= 1
# (and)
# { srv_is_up(s3-fallback) } -- if the server named "s3-fallback" is up; "server name" is the arbitrary name we gave the server in the config file
# (which would mean it's the "1" server that is up for this backend)
如果您使用的是一个基本上为空的bucket和一个错误文档,那么实际上并不需要这样做,因为任何请求路径都会生成相同的错误

接下来,我们需要在传出请求中设置
Host:
头以匹配bucket的名称。如果bucket的名称与从浏览器收到的请求中已经存在的
Host:
头的名称相同,那么从技术上讲,这是不需要的,但可能仍然是一个好主意。如果bucket名称不同,则需要转到此处

http-request set-header host example.com if { nbsrv le 1 } { srv_is_up(s3-fallback) }
如果bucket名称不是有效的DNS名称,则应在此处包含整个网站端点。对于一个名为“示例”的bucket--

如果您的客户正在向您发送他们的cookie,则无需将这些cookie转发给S3。如果客户端是HTTPS,而S3连接是HTTP,那么您一定要去掉这些连接

http-request del-header cookie if { nbsrv le 1 } { srv_is_up(s3-fallback) }
现在,处理响应

您可能不希望浏览器缓存来自此备用后端的响应

http-response set-header cache-control no-cache if { nbsrv le 1 } { srv_is_up(s3-fallback) }
您可能也不希望为这些响应返回“200OK”,因为从技术上讲,您正在显示一个错误页面,并且您不希望搜索引擎尝试索引这些内容。在这里,我选择了“503服务不可用”,但任何有效的响应代码都可以工作。。。例如,500或502

http-response set-status 503 if { nbsrv le 1 } { srv_is_up(s3-fallback) }
而且,您已经有了它——使用S3 bucket网站端点作为备份后端,其行为与任何其他后端都没有区别。没有浏览器重定向

您还可以将对S3的请求配置为使用HTTPS,但由于您只是获取静态内容,因此这似乎是不必要的。如果浏览器使用HTTPS连接到代理,连接的该部分仍然是安全的,尽管您确实需要从浏览器的请求中删除任何敏感内容,因为它将被未加密地转发到S3(请参阅上面的“cookie”)

该溶液在HAProxy 1.6.4上进行测试


请注意,默认情况下,只有在HAProxy重新启动时,才会执行S3端点的DNS查找。如果该IP地址发生更改,HAProxy将不会看到更改,而不会进行额外的配置——这超出了本问题的范围,但请参阅配置手册的部分


我确实在几个不同的系统中使用S3作为HAProxy背后的后端服务器,我发现这是解决许多不同问题的一个极好的解决方案

但是,如果您需要的话,有一种更简单的方法可以在所有后端都关闭时使用自定义错误页面

errorfile   503 /etc/haproxy/errors/503.http
此指令通常在全局配置中找到,但在后端也是有效的——因此,如果此后端中的所有服务器都不正常,代理将自动为尝试使用此后端的任何请求返回此原始文件

该文件是原始HTTP响应。它基本上是在磁盘上以零处理的方式写入客户机,因此必须包含所需的响应头,包括
连接:close
。标题的每一行和标题后的每一行必须以
\r\n
结尾才能成为有效的HTTP响应。您也可以只复制其中一个,并根据需要对其进行修改

这些文件受到响应缓冲区大小的限制,我认为是,默认为16384字节。。。所以它只适用于小文件

HTTP/1.0 503 Service Unavailable\r\n
Cache-Control: no-cache\r\n
Connection: close\r\n
Content-Type: text/plain\r\n
\r\n
This site is offline.


最后,请注意,尽管您希望“透明地代理一个请求”,但我认为“透明代理”一词并不适合您所要做的事情,因为“透明代理”这意味着客户机或服务器或两者都会在连接上看到对方的IP地址,并认为他们是直接通信的,中间没有代理,因为代理和/或网络基础设施进行了一些欺骗,以隐藏代理在路径中的存在。这不是你要找的

此答案可能存在问题,需要修改确定备份服务器是否处于活动状态时使用的逻辑。进一步的测试表明,
nbsrv
fetch的行为似乎并不像预期的那样。到目前为止我还不清楚,但该值可能只计算非备份服务器,因此
nbsrv eq 0
可能实际上是正确的,当1个非备份后端服务器保持在线时,会导致不正确的行为。将在进一步审查后更新。
errorfile   503 /etc/haproxy/errors/503.http
HTTP/1.0 503 Service Unavailable\r\n
Cache-Control: no-cache\r\n
Connection: close\r\n
Content-Type: text/plain\r\n
\r\n
This site is offline.