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/web1
o http://domain/web2
lo 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
Respuestas:
Tu tienes esto:
Creo que quieres esto:
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.fuente
Pon esto en la interfaz
Buena lección para aprender a pelar cadenas: https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5
fuente