HAProxy URL重写404错误

当第一个文件丢失时,如何使HAProxy重写到不同的后端? 我需要的是errorloc但重写而不是redirect,所以客户端不知道redirect。

我们已经开发了一个Nginx的应用程序,这个应用程序既是负载均衡反向代理,也是静态文件的Web服务器。 应用程序基于Opa框架,该框架需要基于cookie的粘性会话(由NginX和HAproxy支持)。 我们遇到的应用程序function是dynamic内容生成。 它可以根据需要生成图像,但生成后会保存在磁盘上,并可以通过确定性path静态访问。

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服务器,并且不支持此function。 现在,每当客户端尝试访问资源时,都会执行dynamic软件生成,而速度慢得多,浪费资源。 如果第一个(静态文件的简单高速cachingWeb服务器)出现404错误,它可以使用下一个后端,但是我找不到一种简单的方法。 redirect/thumb到NginX,它试图读取静态文件,并重新写入到HAproxy与新的HTTP头只出现在我的脑海,但我想find更好的东西。

HAProxy的后端可能是上升或下降(或在上升/下降的路上)。

有各种方法来检查后端的健康状况,但我不知道有任何提供每个请求的跟踪。 一旦请求失败,后端将被标记为closures或将失败(正在考虑closures的方式)。

这与你的Nginx设置是非常不同的逻辑,它是按请求路由请求的。

我在这里看到几个选项:

  • Nginx作为caching代理
  • 对静态内容使用应用服务器
  • 使用CDN

高速caching代理

在HAProxy中,您将使用ACL将静态内容请求路由到特定的后端。 那些后端节点将使用caching代理运行nginx。 如果nginx已经caching了文件,它只会提供它。 如果不是,它会调用你的后端。

为静态内容使用应用服务器

如果您的应用程序服务器在提供静态内容方面效率很高,则可能不需要在haproxy中拆分请求。 只需将所有请求发送到您的应用程序后端。 在它们中build立逻辑以提供静态内容(如果可用的话),以及如果不将请求发送到后端。

CDN选项

如果您可以为静态内容使用专用域,则可以使用CDN。 在CDN,您只需指向源应用程序节点的URL即可。 然后您可以控制CDN级别的caching。 这与上面的Nginxcaching类似,除了CDN提供商正在为您处理。