当第一个缺少文件时,如何使 HAProxy 重写到不同的后端?我需要的是errorloc
进行重写而不是重定向,因此客户端不知道重定向。
我们开发了一个考虑到 NginX 的应用程序,它既是负载平衡反向代理,也是静态文件的 Web 服务器。应用程序基于Opa框架,该框架需要基于 cookie 的粘性会话 - 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
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
服务器已迁移,现在使用 HAPproxy 进行负载均衡,它不是 Web 服务器,不支持此功能。现在每次客户端尝试访问资源时都会执行动态软件生成,这样会慢得多并且浪费资源。如果第一个(静态文件的简单缓存 Web 服务器)失败并显示错误 404,如果它可以使用下一个后端就好了,但我找不到一种简单的方法。重定向/thumb
到 NginX,它尝试读取静态文件并再次使用新的 HTTP 标头重写到 HAproxy 只出现在我的脑海中,但我想找到更好的东西。
HAProxy 的后端要么启动,要么关闭(或者正在启动/关闭)。
有多种方法可以检查后端的运行状况,但我不知道有任何方法可以提供基于每个请求的跟踪。一旦请求失败,该后端将被标记为已关闭或将失败(正在被视为已关闭)。
这与 Nginx 设置的逻辑非常不同,Nginx 设置是根据每个请求路由请求的。
我在这里看到几个选项:
缓存代理
在 HAProxy 中,您可以使用 ACL 将静态内容请求路由到特定后端。这些后端节点将使用缓存代理运行 nginx。如果 nginx 缓存了该文件,它就会直接提供该文件。如果没有,它会调用您的后端。
将应用程序服务器用于静态内容
如果您的应用服务器能够高效地提供静态内容,您可能不需要在 haproxy 中拆分请求。只需将所有请求发送到您的应用程序后端即可。在它们中构建逻辑以提供静态内容(如果可用),如果不可用则将请求发送到后端。
CDN 选项
如果您可以为静态内容使用专用域,则也许可以使用 CDN。在 CDN 上,您只需将源 URL 指向您的应用程序节点。然后,您可以在 CDN 级别控制缓存。这与上面的 Nginx 缓存类似,只是 CDN 提供商正在为您处理它。
归档时间: |
|
查看次数: |
2002 次 |
最近记录: |