2010-02-10 4 views
0

apache2 사용 내부 서블릿 URL을 완전히 다른 URL로 외부 적으로 매핑하는 Tomcat 서버용 AJP 프록시를 설정하려고합니다. 현재 나는 다음과 같은 구성을 사용하고 있습니다 :내부 서블릿 이름을 다른 외부 이름으로 매핑하는 AJP 프록시

아파치 구성 : external_nameservlet_name이 다르다는 것을

<IfModule mod_proxy.c> 
    ProxyPreserveHost on 
    ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name 
    ProxyPassReverse /external_name ajp://192.168.1.30:8009/servlet_name 
</IfModule> 

참고.

톰캣 6 구성 :

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 

그러나 이것은 작동하지 않습니다. 아파치는 HTTP 요청을 Tomcat으로 전달하는 것으로 보인다. 그러나 Tomcat이 반환 한 URL과 리디렉션은 여전히 ​​원래 servlet_name을 사용하고 있으며 Apache는 이들을 external_name에 매핑하지 않습니다.

AJP를 사용할 수 있습니까? 그렇지 않다면 대신 일반 HTTP 프록시를 사용하여 완료 할 수 있습니까?

답변

0

Apache와 Tomcat간에 서로 다른 이름을 매핑하는 것은 매우 까다로울 수 있으며 웹 응용 프로그램이 응답 URL을 작성하는 방법에 따라 달라집니다.

기본적으로 설정이 올바르지 만 애플리케이션에서 자체 servlet_name을 리디렉션과 URL로 사용하는 경우 ProxyPassReverse가 매핑하지 않습니다.

이 종류의 설치가 필요한 경우 (Apache 타사 모듈)에서 URL 및 응답 헤더뿐 아니라 mod_proxy로 내용을 파싱하고 다시 작성합니다.

0

(늦은 대답하지만, 난 그냥이 문제에 자신을 달렸다.)

ProxyPassReverse 사용 AJP가 나타납니다

: 헤더가 AJP이없는 리디렉션에서 반환하기 때문에 작동하지 않습니다 URL에서 위치 :, 그들은 http : URL을 가지고 있습니다. ProxyPassReverse는 일치하는 헤더를 다시 작성하기 만하고 문자열은 반환되는 내용과 일치하지 않습니다.

이 작동합니다 :

ProxyPreserveHost on 
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name 
ProxyPassReverse /external_name http://192.168.1.30/servlet_name 

(당신은 리디렉션 헤더 및 디버그를 검사하는 '컬 -I'를 사용할 수 있습니다.) (위치 제공. 필드에 숫자 주소 아닌 호스트 이름이 것을 사용)

this note을 참조하거나 웹 페이지의 URL을 다시 작성하는 데 mod_proxy_html 을 사용하는 경우 더 많은 내용이 포함 된 solution here을 참조하십시오.

0

answer from Steven D. Majewski에는 추가로 하나의 문제가 있습니다. 대상 응용 프로그램에서 요청 호스트 이름을 사용하여 리디렉션 (302 Moved Temporarily)을 만들면 여러 호스트 이름과 함께 작동하지 않습니다. 하나는 다음과 같이, 모든 이름에 대해 여러 구성을 작성해야합니다

ProxyPassReverse /external_name http://server.com/servlet_name 
ProxyPassReverse /external_name http://server.org/servlet_name 
ProxyPassReverse /external_name http://server.co.uk/servlet_name 

는 실제로 ProxyPreserveHost on이 문제를 해결하고 ProxyPass에 지정된 주소 나 IP로 들어오는 요청의 호스트 헤더를 교체해야합니다. 불행히도 ajp 커넥터와 함께 작동하지 않는 것 같습니다 ProxyPreserveHost. 내 구성의 바람둥이는 여전히 브라우저 이름 대신 192.168.1.30으로 바꾼 호스트 이름을 받았습니다.결과적으로 브라우저 기반 리디렉션은 모든 이름에 대해 작동하지 않았습니다.

에 따라 구성. 해결 방법은 대신 AJP의 HTTP를 사용했다

# NOT WORKING !!! 
ProxyPassReverse /external_name http://%{HTTP_HOST}/servlet_name 

:-(잘 작동하지 않았다

ProxyPreserveHost on 
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name 
ProxyPassReverse /external_name http://192.168.1.30/servlet_name 

은 누군가가 나를 위해 그것을 깊이?

0

을 조사 했 , 이것은 문제를 일으키는 것으로 보입니다 :

ProxyPreserveHost on 
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name 
ProxyPassReverse /external_name http://192.168.1.30/servlet_name 
이 동안 363,210

이 작동 듯 :

ProxyPreserveHost on 
ProxyPass /external_name ajp://192.168.1.30:8009/servlet_name 
ProxyPassReverse /external_name ajp://192.168.1.30:8009/servlet_name 

나는 이유는 모르겠지만 그냥했다.

+0

동일하거나 그렇지 않은 항목이 있습니까? –

+0

다른 경우, 두 번째 ProxyPassReverse 선언의 첫 번째 것과 같이 HTTP가 아닌 AJP로 시작하는 URL이 있습니다. –