我正在使用haproxy来平衡一组服务器.我正在尝试向haproxy配置添加维护页面.我相信我可以通过使用'backup'修饰符在后端定义服务器声明来实现此目的.问题是,我如何使用远程托管在AWS S3存储桶(静态网站)上的维护页面,而不实际将用户重定向到该页面(即haproxy服务器'redir'定义).
如果我有服务器:a,b,c.所有服务器都停机进行维护,然后我希望所有请求都由服务器定义d(标有'backup')解析为S3上的静态地址.请注意,我不希望路径继承并在s3上进行评估,它应始终呈现静态维护页面.
这绝对是可能的.
首先,声明一个备份服务器,该服务器仅在非备份服务器关闭时使用.
server s3-fallback example.com.s3-website-us-east-1.amazonaws.com:80 backup
Run Code Online (Sandbox Code Playgroud)
仅当我们使用备用路径时,以下配置条目才用于修改请求或响应.我们在以下示例中使用了两个测试:
# { 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)
Run Code Online (Sandbox Code Playgroud)
所以,既然我们有一个backup后端,我们需要一些其他的指令.
/无论请求路径如何,强制路径.
http-request set-path / if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
如果您使用的是一个带有错误文档的空桶,那么这并不是真的需要,因为任何请求路径都会产生相同的错误.
接下来,我们需要Host:在传出请求中设置标头以匹配存储桶的名称.如果存储桶的名称与Host:我们从浏览器收到的请求中已经存在的标题相同,则技术上不需要这样做,但可能仍然是个好主意.如果存储桶名称不同,则需要转到此处.
http-request set-header host example.com if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
如果存储桶名称不是有效的DNS名称,则应在此处包括整个网站端点.对于称为"示例"的桶 -
http-request set-header host example.s3-website-us-east-1.amazonaws.com if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
如果您的客户向您发送他们的cookie,则无需将这些内容转发给S3.如果客户端是HTTPS并且S3连接是HTTP,那么你绝对要剥离它们.
http-request del-header cookie if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
现在,处理响应......
您可能不希望浏览器缓存来自此备用后端的响应.
http-response set-header cache-control no-cache if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
您也可能不希望为这些响应返回"200 OK",因为从技术上讲,您正在显示错误页面,并且您不希望搜索引擎尝试索引这些内容.在这里,我选择了"503服务不可用",但任何有效的响应代码都可以工作......例如500或502.
http-response set-status 503 if { nbsrv le 1 } { srv_is_up(s3-fallback) }
Run Code Online (Sandbox Code Playgroud)
而且,你有它 - 使用S3桶网站端点作为备份后端,其行为与任何其他后端没有区别.没有浏览器重定向.
您还可以将请求配置为使用HTTPS,但由于您只是获取静态内容,因此这似乎是不必要的.如果浏览器使用HTTPS连接到代理,则该部分连接仍然是安全的,但您确实需要从浏览器的请求中清除任何敏感内容,因为它将被转发到未加密的S3(请参阅上面的"cookie") .
该解决方案在HAProxy 1.6.4上进行测试.
请注意,默认情况下,只有在重新启动HAProxy时才会执行S3端点的DNS查找.如果该IP地址发生更改,HAProxy将无法看到更改,无需其他配置 - 这超出了本问题的范围,但请参阅配置手册的resolvers部分.
我在几个不同的系统中使用S3作为HAProxy背后的后端服务器,我发现这是解决许多不同问题的出色解决方案.
但是,有一种更简单的方法可以在所有后端都关闭时使用自定义错误页面,如果这是您想要的.
errorfile 503 /etc/haproxy/errors/503.http
Run Code Online (Sandbox Code Playgroud)
此指令通常在全局配置中找到,但它在后端也有效 - 因此,如果此后端的所有服务器中的所有服务器,则该代理会自动返回此原始文件以用于尝试使用此后端的任何请求.结束是不健康的.
该文件是原始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.
Run Code Online (Sandbox Code Playgroud)
最后,请注意,尽管您希望"透明地代理请求",但我不认为"透明代理"这个短语对于您正在尝试执行的操作是正确的,因为"透明"代理"意味着客户端或服务器或两者都会在连接上看到彼此的IP地址,并认为它们是直接通信,两者之间没有代理,因为代理和/或网络基础设施完成了隐藏的一些欺诈行为代理在路径中的存在.这不是你想要的.
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |