Reescritura de URL de HAProxy en error 404

9

¿Cómo hacer que HAProxy reescriba en un back-end diferente cuando falta el primer archivo? Lo que necesito es errorlochacer una reescritura en lugar de redirigir, para que el cliente no tenga conocimiento de la redirección.

Hemos desarrollado una aplicación con NginX en mente, que era tanto el proxy inverso de equilibrio de carga como el servidor web para archivos estáticos. La aplicación se basa en el marco Opa que requiere sesiones fijas basadas en cookies, compatibles con NginX y HAproxy. La característica de aplicación con la que tenemos problemas es la generación dinámica de contenido. Genera imágenes a pedido, pero después de la generación se guarda en el disco y se puede acceder estáticamente con una ruta determinista.

El problema se resolvió fácilmente con NginX: intenta leer el archivo local y usar el back-end de carga equilibrada solo si falta el archivo (aún no se ha generado):

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
    [...]
  }
}

El servidor se migró y ahora usa HAPproxy para el equilibrio de carga, que no es un servidor web y no es compatible con esta función. Ahora la generación dinámica de software se realiza cada vez que el cliente intenta acceder al recurso, lo que es mucho más lento y desperdicia recursos. Estaría bien si pudiera usar el siguiente back-end si el primero (servidor web de almacenamiento en caché simple para archivos estáticos) fallara con el error 404, pero no puedo encontrar una manera de hacerlo de manera simple. Redireccionar /thumba NginX, que intenta leer un archivo estático y vuelve a escribir en HAproxy con un nuevo encabezado HTTP, solo me viene a la mente, pero me gustaría encontrar algo mejor.

Marcin Skórzewski
fuente
¿Qué pila de aplicaciones utilizan los servidores de aplicaciones de fondo?
jeffatrackaid

Respuestas:

1

Los backends de HAProxy están hacia arriba o hacia abajo (o en camino hacia arriba / abajo).

Hay varias formas de verificar el estado del backend, pero no conozco ninguna que proporcione un seguimiento por solicitud. Una vez que falla una solicitud, ese backend se marcaría como inactivo o estaría fallando (en camino a ser considerado inactivo).

Esta es una lógica muy diferente a la configuración de Nginx, que enrutaba las solicitudes por solicitud.

Veo un par de opciones aquí:

  • Nginx como proxy de almacenamiento en caché
  • Usar servidores de aplicaciones para contenido estático
  • Use un CDN

Proxy de almacenamiento en caché

En HAProxy, usaría ACL para enrutar solicitudes de contenido estático a un backend específico. Esos nodos de back-end ejecutarían nginx con un proxy de almacenamiento en caché. Si nginx tuviera el archivo en caché, solo lo serviría. Si no, llamaría a tu backend.

Usar servidores de aplicaciones para contenido estático

Si sus servidores de aplicaciones son eficientes para servir contenido estático, es posible que no necesite dividir la solicitud en haproxy. Simplemente envíe todas las solicitudes a los servidores de su aplicación. Cree lógica en ellos para servir contenido estático si está disponible y, si no, envíe la solicitud al backend.

Opción CDN

Si puede usar un dominio dedicado para el contenido estático, puede usar una CDN. En el CDN, solo apunta a la URL de origen a los nodos de su aplicación. Luego puede controlar el almacenamiento en caché a nivel de CDN. Esto es similar al almacenamiento en caché de Nginx anterior, excepto que el proveedor de CDN lo está manejando por usted.

jeffatrackaid
fuente