HAProxy URL 重写 40​​4 错误

Mar*_*ski 9 nginx haproxy

当第一个缺少文件时,如何使 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 只出现在我的脑海中,但我想找到更好的东西。

jef*_*aid 1

HAProxy 的后端要么启动,要么关闭(或者正在启动/关闭)。

有多种方法可以检查后端的运行状况,但我不知道有任何方法可以提供基于每个请求的跟踪。一旦请求失败,该后端将被标记为已关闭或将失败(正在被视为已关闭)。

这与 Nginx 设置的逻辑非常不同,Nginx 设置是根据每个请求路由请求的。

我在这里看到几个选项:

  • Nginx 作为缓存代理
  • 将应用程序服务器用于静态内容
  • 使用 CDN

缓存代理

在 HAProxy 中,您可以使用 ACL 将静态内容请求路由到特定后端。这些后端节点将使用缓存代理运行 nginx。如果 nginx 缓存了该文件,它就会直接提供该文件。如果没有,它会调用您的后端。

将应用程序服务器用于静态内容

如果您的应用服务器能够高效地提供静态内容,您可能不需要在 haproxy 中拆分请求。只需将所有请求发送到您的应用程序后端即可。在它们中构建逻辑以提供静态内容(如果可用),如果不可用则将请求发送到后端。

CDN 选项

如果您可以为静态内容使用专用域,则也许可以使用 CDN。在 CDN 上,您只需将源 URL 指向您的应用程序节点。然后,您可以在 CDN 级别控制缓存。这与上面的 Nginx 缓存类似,只是 CDN 提供商正在为您处理它。