HAProxy reqrep는 백엔드 요청에서 URI를 제거합니다.


27

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/web2I 오류 로그에서 볼 것을 requst 각각 자원 / WEB1 또는 / Web2입니다위한 것으로 각 백엔드에있는 서버에 요청. 따라서 문서에서 복사하여 붙여 넣었지만 정규 표현식에 문제가 있다고 생각합니다. http://code.google.com/p/haproxy-docs/wiki/reqrep

요약 : URI를 기반으로 트래픽을 라우팅하려고하지만 요청을 백엔드 풀로 보낼 때 HAProxy가 URI를 제거하기를 원합니다.

고맙습니다!


편집 및 댓글 버튼이 있습니다.
Chris S

1
Jim,이 질문을 작성하는 데 사용한 것과 다른 계정으로 로그인했기 때문에 댓글을 작성하는 데 문제가 있습니다. 앞으로는 이것이 일어나지 않도록 로그인 계정을 일관성있게 유지하십시오. 이 문제를 해결하기 위해 중재자를 신고했습니다.
MDMarra

답변:


28

당신은 이것을 가지고 있습니다 :

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

나는 당신이 이것을 원한다고 생각합니다 :

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

차이점은 webN 후 /가 생략되면 두 번째 것이 작동한다는 것입니다.

아래의 의견에 대한 답변으로 위의 표현이 어떻게 작동하는지에 대해 자세히 설명하십시오. 그러나 이것이 도움이 될 것입니다.

/ web1 이전의 모든 것은 요청 문자열에서 web1 이전의 모든 것을 "캡처"합니다. 일반적으로 GET 또는 POST입니다. (. *)는 아무것도 없으면 아무것도 포함하지 않고 web1 이후의 모든 것을 "캡처"합니다.

다음 부분 ( \1\2)은 캡처 된 부분으로 수행 할 작업을 나타냅니다. \1(첫 번째 캡처 된 부분)과 \2(두 번째 캡처 된 부분이 뒤 따르는 ) 문자열로 구성되어 있습니다. web1은 캡처되지 않으므로 최종 출력으로 어셈블되지 않습니다.


\ 1 \ \ 2 \ 3은 무엇을 의미합니까? reqrep 문서와 관련하여 ^ ([^ \] *) \는 무엇을합니까? 다음은 설명서 페이지에 제공된 예입니다. # 요청 경로의 시작 부분에서 "/ static /"을 "/"로 바꿉니다. reqrep ^ ([^ \] *) \ /static/(.*) \ 1 \ / \ 2
Jim

귀하의 의견을 읽은 후 제안 된 솔루션이 약간 지나치게 복잡하다는 것을 깨달았습니다. 나는 그것을 단순화했다.
longneck

그렇다면 reqrep 구문은 무엇입니까? reqrep {string_2_search_thru} {search_string} {replace_string}? 나는 \ 1 \ \ 2 \ 3에 대해 혼란 스럽습니까?
Jim

사용자가 / web1 또는 / web1 /을 넣을 경우이 reqrep을 통합하는 방법이 있습니까?
Jim

해봤 어?
longneck

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.