HAProxy reqrep eliminar URI en la solicitud de back-end

27

Real pregunta rápida sobre HAProxy reqrep. Estoy tratando de reescribir / reemplazar la solicitud que se envía al backend.

Tengo el siguiente dominio de ejemplo y URI, ambos comparten el mismo nombre de dominio, pero diferentes grupos de servidores web de fondo.

http://domain/web1
http://domain/web2

Quiero que web1 vaya al backend webfarm1, y web2 para ir a webfarm2. Actualmente esto sucede. Sin embargo, quiero quitar el URI web1 o web2 cuando la solicitud se envía al backend.

Aquí está mi haproxy.cfg

frontend webVIP_80
        mode http
        bind    :80
        #acl routing to backend
        acl web1_path path_beg /web1
        acl web2_path path_beg /web2

        #which backend
        use_backend webfarm1 if web1_path
        use_backend webfarm2 if web2_path
        default_backend webfarm1

backend webfarm1
        mode http
        reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
        server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
        mode http
        reqrep ^([^\ ]*)\ /web2/(.*)     \1\ /\2
        balance roundrobin
        option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
        server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
        server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms

Si voy http://domain/web1o http://domain/web2lo veo en los registros de error, la solicitud en un servidor en cada servidor indica que la solicitud es para el recurso / web1 o / web2 respectivamente. Por lo tanto, creo que hay algo mal con mi expresión regular, a pesar de que la copié y pegué de la Documentación. http://code.google.com/p/haproxy-docs/wiki/reqrep

Resumen: Estoy tratando de enrutar el tráfico basado en URI, sin embargo, quiero que HAProxy elimine el URI cuando envíe la solicitud al grupo de back-end.

¡Gracias!

-Jim

Jim
fuente
Hay botones de edición y comentario ahora.
Chris S
1
Jim, tienes problemas para comentar porque has iniciado sesión con una cuenta diferente de la que usaste para crear esta pregunta. Intente mantener su cuenta de inicio de sesión coherente para que esto no suceda en el futuro. He marcado un moderador para arreglar esto.
MDMarra

Respuestas:

28

Tu tienes esto:

reqrep ^([^\ ]*)\ /web1/(.*)     \1\ /\2

Creo que quieres esto:

reqrep ^([^\ ]*\ /)web1[/]?(.*)     \1\2

La diferencia es que el segundo funcionará si se omite el / después de webN.

En respuesta a su comentario a continuación, entrar en detalles sobre cómo funcionan las expresiones anteriores es más esfuerzo de lo que puedo dar. Sin embargo, tal vez esto ayude.

Todo antes de / web1 está "capturando" todo lo que viene antes de web1 en la cadena de solicitud. Por lo general, eso sería GET o POST. El (. *) "Captura" todo después de web1, incluyendo nada si no hay nada.

La siguiente parte ( \1\2) dice qué hacer con esas partes capturadas. Dice formar una cadena compuesta de \1(la primera parte capturada) y \2(seguida de la segunda parte capturada). Como web1 nunca se captura, no se ensambla en la salida final.

cuello largo
fuente
¿Qué significa \ 1 \ \ 2 \ 3? Con respecto a la documentación de reqrep, ¿qué hace ^ ([^ \] *) \ do? Aquí está el ejemplo dado en la página de documentación. # reemplace "/ static /" con "/" al comienzo de cualquier ruta de solicitud. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim
Después de leer su comentario, me di cuenta de que mi solución propuesta era un poco demasiado complicada. Lo simplifiqué.
cuello largo
Entonces, ¿cuál es la sintaxis de reqrep? reqrep {string_2_search_thru} {search_string} {replace_string}? Estoy confundido en cuanto a la \ 1 \ \ 2 \ 3?
Jim
¿Hay alguna manera de incorporar este reqrep a trabajar si el usuario pone / web1 o / web1 /?
Jim
¿Lo intentaste?
cuello largo