티스토리 뷰
mod_jk 잘 쓰고 있는 상태면 mod_proxy로 굳이 바꿀 필요는 없다.
mod_proxy를 쓰려는 이유는 별도의 모듈 빌드가 필요없고 별도의 설정 파일이 필요없어서 사용하려고 함.
apache 2.2버전을 사용할때 쓸만한 방법입니다.
알려진 내용으로는 mod_proxy_ajp의 경우 8K이상의 내용을 주고 받을때 문제가 있을수 있다고 합니다.
이때는 mod_jk나 mod_proxy_http를 사용하도록 합니다.
요즘의 추세는 mod_proxy_http 인것 같습니다.
아파치 문서를 잘 살펴보면 ProxyPass에 !를 써서 안보내거나 ProxyPassMatch를 이용해서 보낼것과 안보낼것을 결정할 수 있다.
ajp 프로토콜 사용시
--------------------------------------------------------
ProxyPassMatch ^/(.*\.nhn)$ ajp://localhost:8055/$1
ProxyPassMatch ^/(.*\.jsp)$ ajp://localhost:8055/$1
ProxyPassReverse / ajp://localhost:8055/
--------------------------------------------------------
http사용시 톰켓에 ajp커넥터를 지정할 필요가 없음
--------------------------------------------------------
ProxyPassMatch ^/(.*\.nhn)$ http://localhost:15359/$1
ProxyPassMatch ^/(.*\.jsp)$ http://localhost:15359/$1
ProxyPassReverse / ajp://localhost:15359/
--------------------------------------------------------
참고자료들.
mod_proxy와 mod_jk 쓸때 장단점 분석
http://stackoverflow.com/questions/1081918/apache-to-tomcat-mod-jk-vs-mod-proxy
http://www.tomcatexpert.com/blog/2010/06/16/deciding-between-modjk-modproxyhttp-and-modproxyajp
http://blog.techstacks.com/2008/03/modjk-vs-modproxy-introduction.html
간략한 mod_proxy_ajp 형식 일반적
http://www.zeitoun.net/articles/configure-mod_proxy_ajp-with-tomcat/start
Listen 1979
NameVirtualHost *:1979
<VirtualHost *:1979>
ServerName localhost
ErrorLog /var/log/apache2/ajp.error.log
CustomLog /var/log/apache2/ajp.log combined
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
</VirtualHost>
http://tomcat.apache.org/tomcat-6.0-doc/proxy-howto.html
When requests are proxied in this manner, all requests for the configured web applications will be processed by Tomcat (including requests for static content). You can improve performance by using the mod_jk web connector instead of mod_proxy. mod_jk can be configured so that the web server serves static content that is not processed by filters or security constraints defined within the web application's deployment descriptor (/WEB-INF/web.xml).
위와 같이 설정하면 모든 요청이 다 프락시를 통해서 가기때문에 정적인 파일도..
그래서 선별적으로 보내고자 하는 경우에는 mod_jk를 쓰라고 문서가 되어 있는데
##우리의 솔루션 ##
아파치 문서를 잘 살펴보면 !를 써서 안보내거나 ProxyPassMatch를 이용해서 보낼것과 안보낼것을 결정할 수 있다.
ProxyPassMatch ^/(.*\.nhn)$ ajp://localhost:8055/$1
ProxyPassMatch ^/(.*\.jsp)$ ajp://localhost:8055/$1
ProxyPassReverse / ajp://localhost:8055/
Proxy 설정에서는 주로 어디서 오는것들을 받아줄지, 설정 온 오프, 로드밸런싱 설정 같은 전역설정들이 주로 온다.
프락시 연결할때 프로토콜 뭘 쓸지를 결정한다.
프락시는 두가지 방식으로 동작한다.
포워드 프락시와 리버스 프락시가 있다.
포워드 프락시는 ProxyRequests On 을 설정해서 쓰는것으로
브라우저의 커넥션요청을 받아서 대신 가져다 준다.
보통 ProxyPass를 지정하지는 않는다. 할수는 있다.
브라우저 - 포워드 프락시 - 인터넷 - 웹서버
리버스 프락시의 경우에는
브라우저 - 인터넷 - 리버스 프락시 - 웹서버들
ProxyPass를 선택해서 요청이 들어오는것을 어디로 보내서 받아올지를 결정한다.
개념관련해서는 아래 pt를 참조하도록
http://www.erenkrantz.com/oscon/OSCON%202006%20Apache%20mod_proxy.pdf
ProxyPass /example http://backend.example.com min=0 max=20 smax=5 ttl=120 retry=300
ProxyPassReverse /example http://backend.example.com/
ProxyPass /images !
ProxyPass /css !
ProxyPass / http://backend.example.com
!를 지정하면 해당 패스의 하위패스들은 프락시를 안타도록 해준다.
여기서 ! 부분을 찾아서 설명을 읽으면 된다.
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass
regexp를 이용해서 매치되는것들만 프락시를 통해서 보낸다.
ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1
ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com:8000$1
in our previous example, it would fail with a syntax error at server startup. This is a bug (PR 46665 in the ASF bugzilla), and the workaround is to reformulate the match:
ProxyPassMatch ^/(.*\.gif)$ http://backend.example.com:8000/$1
리버스 프락시인 경우에는 ProxyPass만 써도 별 탈이 없는데
ProxyPassReverse를 지정해서 써야 할 경우가 있다.
이 속성에 대해서는 여기 설명을 참조하자
http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html
Note that usually no ProxyPassReverse directive is necessary. The AJP request includes the original host header given to the proxy, and the application server can be expected to generate self-referential headers relative to this host, so no rewriting is necessary.
The main exception is when the URL path on the proxy differs from that on the backend. In this case, a redirect header can be rewritten relative to the original host URL (not the backend ajp:// URL), for example:
Rewriting Proxied Path
ProxyPass /apps/foo ajp://backend.example.com:8009/foo
ProxyPassReverse /apps/foo http://www.example.com/foo
However, it is usually better to deploy the application on the backend server at the same path as the proxy rather than to take this approach.
정리하면 프락시 패스를 지정했는데 리다이렉션이 발생한경우 프락시패스에 상대적인 경로로 수정해준다.
더 자세한 설명은 여기서 발견할 수 있다.
http://httpd.apache.org/docs/2.2/ko/urlmapping.html
역프록시(Reverse Proxy)
아파치는 다른 서버에 있는 문서를 서버의 URL 공간으로 가져올 수 있다. 이 경우 웹서버가 원격 서버에서 문서를 가져와서 클라이언트에게 전달하는 프록시 서버와 같이 동작하기때문에 이런 방법을 역프록시(reverse proxying)라고 한다. 클라이언트의 입장에서 역프록시 서버가 문서를 보내주는 것처럼 보이므로 일반 프록시와는 다르다.
아래 설정에서 클라이언트가 /foo/에 있는 문서를 요청하면, 서버는 internal.example.com의 /bar/ 디렉토리에서 문서를 가져와서 문서가 마치 서버에 있었던 것처럼 클라이언트에게 보낸다.
ProxyPass /foo/ http://internal.example.com/bar/
ProxyPassReverse /foo/ http://internal.example.com/bar/
ProxyPass는 서버가 적절한 문서를 가져오도록 설정하며, ProxyPassReverse 지시어는 internal.example.com이 보내는 리다이렉션을 재작성하여 리다이렉션이 현재 서버의 적절한 디렉토리를 가리키도록 한다. 또, ProxyPassReverseCookieDomain과 ProxyPassReverseCookieDomain은 같은 방법으로 원래 서버가 보낸 쿠키를 재작성한다.
그러나 문서 안에 있는 링크는 재작성하지 않음을 주의하라. internal.example.com에 대한 절대링크는 클라이언트가 프록시서버가 아니라 internal.example.com으로 직접 요청하게 한다. 제삼자가 만든 mod_proxy_html 모듈을 사용하여 HTML과 XHTML에 있는 링크를 재작성할 수 있다.
예를 들면 이런거죠
/foo/1.jsp 요청했더니 http://internal.example.com/bar/1.jsp로 보내고
이 응답이 http://internal.example.com/bar/2.jsp로 리다이렉션이라고 하면
요걸 ProxyPassReverse를 보고 http://internal.example.com/bar/ 이걸 /foo/로 변환한다.
클라이언트에게는 리다이렉션이 /foo/2.jsp로 가라고 온다.
타겟서버가 여러대여서 로드밸런싱을 할때는 아래를 참조할것
http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html
ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1/
BalancerMember ajp://server2/
BalancerMember ajp://server3/
</Proxy>
주의 mod_proxy의 경우 데이터가 8kb 이상 처리할 수 없음 이런 경우 mod_jk를 계속쓰세요 :)