当第一个文件丢失时,如何使HAProxy重写到另一个后端?我需要的是errorloc,但是进行重写而不是重定向,因此客户端不知道重定向。
我们开发了一个基于NginX的应用程序,它既是负载平衡反向代理,也是用于静态文件的web服务器。应用程序基于Opa框架,它需要基于cookies的粘性会话--由NginX和HAproxy都支持。我们遇到的问题是动态内容生成。它按需生成图像,但生成后会保存在磁盘上,可以通过确定性路径静态访问。
使用NginX很容易解决问题-它尝试读取本地文件并使用负载平衡后端,只有当文件丢失时(尚未生成):
server {
server_name wkaliszu.pl;
location /thumb {
root /path_on_disk/to_cached_content;
expires 7d;
# try to access already generated content
try_files $uri @wkaliszu;
}
location / {
# reverse proxy to the application
[...]
}
location @wkaliszu {
# reverse proxy to the application
[...]
}
}服务器是迁移的,现在使用HAPproxy进行负载平衡,它不是web服务器,不支持此特性。现在,每次客户端试图访问资源时,都会执行动态软件生成,这样做的速度要慢得多,而且浪费资源。如果第一个(静态文件的简单缓存web服务器)出现错误404失败,它可以使用下一个后端,但我无法找到一种简单的方法。将/thumb重定向到NginX,它尝试读取静态文件,然后再次使用新的header重写到HAproxy,但我想找到更好的东西。
发布于 2015-09-10 21:14:30
HAProxy的后端要么是向上的,要么是向下的(或者是在上升/下降的过程中)。
有多种方法来检查后端的健康状况,但我不知道有任何提供基于每个请求的跟踪。一旦请求失败,该后端将被标记为下降或失败(在被考虑下降的过程中)。
这与Nginx设置的逻辑非常不同,Nginx是根据每个请求来路由请求的。
我在这里看到了几种选择:
在HAProxy中,您可以使用ACL将静态内容请求路由到特定的后端。这些后端节点将使用缓存代理运行nginx。如果nginx缓存了该文件,它只会为它服务。如果不是,它会调用你的后端。
如果您的应用服务器高效地提供静态内容,您可能不需要在haproxy中拆分请求。只需将所有请求发送到应用程序后端即可。将逻辑构建到它们中,以便在可用的情况下为静态内容服务,如果没有,则将请求发送到后端。
如果可以为静态内容使用专用域,则可以使用CDN。在CDN,您只需指向应用程序节点的源URL。然后,您可以在CDN级别控制缓存。这与上面的Nginx缓存类似,只不过CDN提供程序正在为您处理它。
https://serverfault.com/questions/664263
复制相似问题