HAProxy 404 错误时 URL 重写

HAProxy 404 错误时 URL 重写

当第一个后端缺少文件时,如何让 HAProxy 重写到不同的后端?我需要的是errorloc进行重写而不是重定向,这样客户端就不会意识到重定向。

我们开发了一个以 NginX 为核心的应用程序,它既是负载平衡反向代理,又是静态文件的 Web 服务器。应用程序基于奥帕需要基于 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
    [...]
  }
}

服务器已迁移,现在使用 HAPproxy 进行负载平衡,它不是 Web 服务器,不支持此功能。现在每次客户端尝试访问资源时都会执行动态软件生成,这要慢得多,而且浪费资源。如果第一个(用于静态文件的简单缓存 Web 服务器)因错误 404 而失败,它可以使用下一个后端,那就没问题了,但我找不到简单的方法。我/thumb只想到重定向到 NginX,它会尝试读取静态文件,然后再次使用新的 HTTP 标头重写到 HAproxy,但我想找到更好的方法。

答案1

HAProxy 的后端要么处于启动状态,要么处于关闭状态(或者正在启动/关闭中)。

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

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

我在这里看到了几个选项:

  • Nginx 作为缓存代理
  • 使用应用服务器处理静态内容
  • 使用 CDN

缓存代理

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

使用应用服务器处理静态内容

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

CDN 选项

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

相关内容