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

时间:2016-04-12 23:59:12

标签: amazon-s3 haproxy

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

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

1 个答案:

答案 0 :(得分:6)

这绝对是可能的。

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

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)

所以,既然我们有一个backup后端,我们需要一些其他的指令。

无论请求路径如何,都强制路径/

http-request set-path / if { nbsrv le 1 } { srv_is_up(s3-fallback) }

如果您使用带有错误文档的基本上空的存储桶,则不需要这样做,因为任何请求路径都会产生相同的错误。

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

http-request set-header host example.com if { nbsrv le 1 } { srv_is_up(s3-fallback) }

如果存储桶名称不是有效的DNS名称,则应在此处包括整个网站端点。对于名为&#34;示例&#34; -

http-request set-header host example.s3-website-us-east-1.amazonaws.com if { nbsrv le 1 } { srv_is_up(s3-fallback) }

如果您的客户向您发送了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) }

你也可能不想回归&#34; 200 OK&#34;对于这些回复,从技术上讲,您正在显示错误页面,并且您不希望搜索引擎尝试索引这些内容。在这里,我选择了&#34; 503 Service Unavailable&#34;但任何有效的响应代码都可以...例如500或502。

http-response set-status 503 if { nbsrv le 1 } { srv_is_up(s3-fallback) }

并且,你有它 - 使用S3桶网站端点作为备份后端,其行为与任何其他后端没有区别。没有浏览器重定向。

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

此解决方案在HAProxy 1.6.4上进行测试。

请注意,默认情况下,只有在重新启动HAProxy时才会执行S3端点的DNS查找。如果该IP地址发生更改,HAProxy将无法在没有其他配置的情况下看到更改 - 这超出了本问题的范围,但请参阅配置手册的the resolvers section

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

但是,有一种更简单的方法可以让所有后端都关闭时使用自定义错误页面,如果这是你想要的。

errorfile   503 /etc/haproxy/errors/503.http

此指令通常在全局配置中找到,但它在后端也有效 - 因此,对于尝试使用此后端的任何请求,代理会自动返回此原始文件,如果全部这个后端的服务器是不健康的。

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

这些文件受响应缓冲区大小的限制,我相信tune.bufsize,默认为16,384字节...所以它只对我们有用小文件。

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.

最后,请注意,尽管您希望透明地代理请求,但&#34;我不会想到这个短语&#34;透明代理&#34;对于你正在尝试做的事情是正确的,因为&#34;透明代理&#34;意味着客户端或服务器或两者都会在连接上看到彼此的IP地址,并认为它们是直接通信的,两者之间没有代理,因为代理和/或网络基础设施完成了某些操作。隐瞒代理人在路径中的存在。这不是你要找的东西。