2012-08-07 2 views
12

여러분, 우리는 아파치는 다음과 같은 시나리오에 대해 역방향 프록시를 설치하려고하는과 :ProxyPassMatch ProxyPassReverse

  • 들어오는 요청이 URL은 말하자면, 차이 버전을 참조합니다 일부 서버의 형태 http://foo.com/APP/v1/main.html
  • 을, http://foo.com/APP/v2/main.html
  • 업스트림로드 밸런서 (HAProxy)는 올바른 서버에 요청을 보내고 Apache2 역방향 프록시는 JBoss 서버를 앞세운다. 요청이 아파치 2에 나타 때
  • 은 우리가 http://localhost:8080/AppContext/main.html 밖으로 (역방향) 프록시 원하는 /APP/v1/main.html
  • 같은 요청 경로, 에 관계없이 URL의 버전 조각 (V1, V2 등)이있을 것이다.

그래서 같이이 일을 시도하고있다 :

ProxyPassMatch ^/.*?/APP.*?/(.*)$ http://localhost:8080/AppContext/$1 
ProxyPassReverse /APP http://localhost:8080/AppContext 

내 질문

은 다음과 같습니다

  1. ProxyPassMatch 내 사용이 맞습니까?
  2. ProxyPassReverse은 "정적"입니다. /APP 이후에 잠재적으로 변하는 것들을 어떻게 인식시킬 수 있습니까?

모든 통계를 제공해 주셔서 감사합니다.

-Raj

답변

8

당신이있어 가까운 버전의 단편을 고려하여 정규 표현식을 약간 변경해보십시오 : 위치의 재 작성에 즉석을 보장하기 위해

ProxyPassMatch ^/.*?/APP.*?/v[0-9]+/(.*)$ http://localhost:8080/AppContext/$1 

ProxyPassReverse가 대부분입니다 프록시 된 앱에서 제공 한 응답의 헤더 필드 따라서 http://localhost:8080/AppContext/something에 301 리디렉션을 반환하면 apache는이를 /APP/v1/something으로 변경하는 것으로 알고 있기 때문에 프록시 정보가 노출되지 않습니다. 역방향 프록시에서 사용되는 동적 URL이 있으므로 여기에서 몇 가지 선택 사항이 있습니다. 당신은 HAProxy로드 밸런서에게 그것을 보낼 수 있습니다 (당신을위한 곳이 어디인지는 확실하지 않습니다). 그런 다음 당신이 당신이 /APP/balancer/에서 부하 분산이있는 경우 예를 들어, 다음 등 /APP/v1/, /APP/v2/, /APP/v3/에 요청을 보내는 작업을 수행 할 수 있습니다

ProxyPassReverse /APP/balancer http://localhost:8080/AppContext 

을 그렇지 않으면, 당신은 단지 하나의 희망을 가리 수 최고 :

ProxyPassReverse /APP/v1 http://localhost:8080/AppContext 
+0

감사합니다. Jon에게 즉각적인 답변을드립니다. 우리는 클러스터에 자유롭게 배포 할 수있는 동종의 템플릿을 갖기 위해 Apache 설정에 버전 특정 항목이없는 상태로 유지하려고합니다. ProxyPassReverse 일을 안정적으로 수행 할 수없는 것처럼 보입니다. 일종의 다시 쓰기 모듈을 통해이를 수행하도록 제안 하시겠습니까? – Raj

+0

@Raj Rewrite는 다른 방향이기 때문에 도움이되지 않습니다. 앱 서버는 요청을 리디렉션하려고 시도하지만 액세스하는 데 사용되는 실제 URL에 대해 알지 못하므로 "http : // localhost : 8080/AppContext/something"로 이동하면 브라우저 브라우저가있는 컴퓨터에 localhost 포트 8080에서 실행중인 응용 프로그램 서버가 없기 때문에 404를 반환합니다. –

관련 문제