HAProxy reqrep에 관한 실제 빠른 질문. 백엔드로 전송되는 요청을 다시 쓰거나 바꾸려고합니다.
동일한 도메인 이름을 공유하지만 다른 백엔드 웹 서버 풀을 공유하는 다음 예제 도메인 및 URI가 있습니다.
http://domain/web1
http://domain/web2
web1은 백엔드 webfarm1로 가고 web2는 webfarm2로 가고 싶습니다. 현재 이것은 일어나고 있습니다. 그러나 요청이 백엔드로 전송되면 web1 또는 web2 URI를 제거하고 싶습니다.
여기 내 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
내가 이동하는 경우 http://domain/web1
또는 http://domain/web2
I 오류 로그에서 볼 것을 requst 각각 자원 / WEB1 또는 / Web2입니다위한 것으로 각 백엔드에있는 서버에 요청. 따라서 문서에서 복사하여 붙여 넣었지만 정규 표현식에 문제가 있다고 생각합니다. http://code.google.com/p/haproxy-docs/wiki/reqrep
요약 : URI를 기반으로 트래픽을 라우팅하려고하지만 요청을 백엔드 풀로 보낼 때 HAProxy가 URI를 제거하기를 원합니다.
고맙습니다!
짐
답변
당신은 이것을 가지고 있습니다 :
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
나는 당신이 이것을 원한다고 생각합니다 :
reqrep ^([^\ ]*\ /)web1[/]?(.*) \1\2
차이점은 webN 후 /가 생략되면 두 번째 것이 작동한다는 것입니다.
아래의 의견에 대한 답변으로 위의 표현이 어떻게 작동하는지에 대해 자세히 설명하십시오. 그러나 이것이 도움이 될 것입니다.
/ web1 이전의 모든 것은 요청 문자열에서 web1 이전의 모든 것을 “캡처”합니다. 일반적으로 GET 또는 POST입니다. (. *)는 아무것도 없으면 아무것도 포함하지 않고 web1 이후의 모든 것을 “캡처”합니다.
다음 부분 ( \1\2
)은 캡처 된 부분으로 수행 할 작업을 나타냅니다. \1
(첫 번째 캡처 된 부분)과 \2
(두 번째 캡처 된 부분이 뒤 따르는 ) 문자열로 구성되어 있습니다. web1은 캡처되지 않으므로 최종 출력으로 어셈블되지 않습니다.
답변
이것을 프론트 엔드에 놓으십시오
reqirep ^([^\ :]*)\ /(.*) \1\ /web1/\2
좋은 교훈은 문자열을 제거하는 방법을 배우십시오 : https://gist.github.com/PiBa-NL/8ad6c222354cbd7a5af5