mod_proxy_ajp.so 를 이용한 Apache httpd 와 Apache Tomcat 연동
1. mod_proxy_ajp.so 모듈 활성화
1.1. Apache httpd 를 컴파일해서 설치한 경우
conf/httpd.conf 에서 다음의 부분을 찾아 주석을 풀어준다.
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
Apache httpd 뒤에 2개 이상의 Apache Tomcat 을 두는 경우 다음의 항목도 찾아 주석을 해제한다.
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
1.2. Ubuntu 에서 apt 로 Apache httpd 를 설치한 경우
다음과 같이 하면 된다.
sudo a2enmod proxy sudo a2enmod proxy_ajp
2개 이상의 Apache Tomcat 과 연동하는 경우 다음의 명령들도 실행한다.
sudo a2enmod proxy_balancer sudo a2enmod slotmem_shm sudo a2enmod lbmethod_byrequests
2. Apache Tomcat 설정
2.1. Connector 설정
Apache Tomcat 을 설치하고 아무 것도 하지 않았다면, 먼저 AJP 를 활성화해야 한다.
Apache Tomcat 을 다운로드 받아 압축을 해제하는 방법으로 설치했다면,
conf/server.xml 파일에서
8009 를 검색해서
주석으로 막혀져 있는 다음과 같은 부분을 찾는다.
<Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" maxParameterCount="1000" />
Ubuntu 에서 apt 로 Apache Tomcat 을 참조했다면,
다음에서 8009 를 검색한다.
주석을 풀거나, <Connector port="8080"> 의 아래에 붙여넣고 Apache Tomcat 을 다시 시작한다.
redirectPort="8443" 은 SSL 전송이 필요한 경우
8443 포트로 redirect 시키라는 것인데,
8443 포트를 SSL 로 여는 설정을 하지 않았다면, 의미가 없는 설정이다.
주의 할 것은 address="::1" 부분이다.
::1 는 ipv6 의 loopback 표기이다.
ipv4 의 127.0.0.1 과 같다.
address="::1" 로 설정하면,
Apache httpd 설정에서는 ajp://[::1]:8009/ 와 같은 형태가 되어야 한다.
address="127.0.0.1" 로 설정해도 차이가 없고,
이 경우 Apache httpd 설정에서는 ajp://127.0.0.1:8009/ 와 같은 형태가 될 것이다.
address 속성값이 ::1 이거나 127.0.0.1 혹은 localhost 인 경우
localhost 에서만 접근할 수 있고,
다른 컴퓨터나 서버에서 접근할 수 없다.
반면, address 속성값을 192.168.0.2 와 같이 하게 되면, localhost 에서는 접근이 안된다.
address 속성을 지워버리면 address="0.0.0.0" 으로 한 것과 동일하고,
192.168.0.2 이나 127.0.0.1 로 접근할 수 있다.
secret 속성도 추가해야 한다.
여기서 정의한 secret 속성 값은 httpd.conf(apache2.conf) 에서 사용된다.
임의로 passw0rd (소문자 o 대신 숫자 0) 로 정했다.
<Connector protocol="AJP/1.3" address="127.0.0.1" port="8009" redirectPort="443" maxParameterCount="1000" secret="passw0rd" />
만약,
localhost 에서만 접근하도록 포트를 열었거나
iptables 등의 방화벽을 사용해서 허가되지 않는 접근을 차단했다면,
secret 속성을 secretRequired="false" 으로 변경한다.
2.1. Sticky Session 설정
conf/server.xml 에서 <Engine 을 찾아
다음과 같이
jvmRoute="node_001" 속성을 추가한다.
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node_001">
Apache Tomcat 마다 서로 다르게,
예를 들면 node_001, node_002 와 같이 한다.
이 값은 cookie
JSESSIONIDcookie 값에 붙어다니기 때문에, 사용자는 "Firefox > Tools > Browser Tools > Web Developer Tools > Network" 에서 그 값을 알아낼 수 있다.
3. Apache httpd 설정
3.1. localhost 에 1개의 Apache Tomcat 을 두는 경우
VirtualHost 내에 다음과 같이 추가한다.
<VirtualHost 0.0.0.0:443> ProxyPass / ajp://localhost:8009/ secret=passw0rd ProxyPassReverse / ajp://localhost:8009/ ProxyRequests Off </VirtualHost>
ProxyPass / ajp://localhost:8009/ secret=passw0rd 에서 secret=passw0rd 는
Apache Tomcat 의 <Connector protocol="AJP/1.3"> 에서 지정한 속성값이다.
만약,
secret속성 대신secretRequired="false"속성을 설정했다면,secret=passw0rd부분은 삭제한다.
Apache Tomcat 의 conf/server.xml 에서 <Connector address="::1" 과 같이 설정했다면,
ajp://localhost:8009 는 ajp://[::1]:8009/ 혹은 ajp://ip6-localhost:8009/ 와 같이 변경해야 한다.
ip6-localhost는 일반적으로/etc/hosts에 설정되어 있다.
만약, Apache Tomcat 에 manager 와 같은 context 를 차단하고 싶다면, VirtualHost 에 다음과 같은 설정을 추가할 수 있다.
ProxyPass /docs ! ProxyPass /examples ! ProxyPass /host-manager ! ProxyPass /manager !
3.2. 2개 이상의 Apache Tomcat 을 두는 경우
<VirtualHost 0.0.0.0:443> ProxyPass / balancer://mytomcatcluster/ ProxyPassReverse / balancer://mytomcatcluster/ ProxyRequests Off <Proxy balancer://mytomcatcluster> BalancerMember ajp://localhost:8009 secret=passw0rd BalancerMember ajp://192.168.0.2:8009 secret=passw0rd </Proxy> </VirtualHost>
만약, Apache Tomcat 에서
secret 속성 대신 secretRequired="false" 속성을 설정했다면,
secret=passw0rd 부분은 삭제한다.
Apache Tomcat 의 conf/server.xml 에서 <Connector address="::1" 과 같이 설정했다면,
BalancerMember ajp://localhost:8009 는 BalancerMember ajp://[::1]:8009 와 같이 변경해야 한다.
만약, Apache Tomcat 에 manager 와 같은 context 를 차단하고 싶다면, VirtualHost 에 다음과 같은 설정을 추가할 수 있다.
ProxyPass /docs ! ProxyPass /examples ! ProxyPass /host-manager ! ProxyPass /manager !
3.3. Sticky Session 설정
<VirtualHost> 의 <Proxy> 내에
ProxySet stickysession=JSESSIONID|jsessionid 를 추가한다.
<VirtualHost 0.0.0.0:443> ProxyPass / balancer://mytomcatcluster/ ProxyPassReverse / balancer://mytomcatcluster/ ProxyRequests Off <Proxy balancer://mytomcatcluster> BalancerMember ajp://localhost:8009 route=node_001 secret=passw0rd BalancerMember ajp://192.168.0.2:8009 route=node_002 secret=passw0rd ProxySet stickysession=JSESSIONID|jsessionid </Proxy> </VirtualHost>
만약, Apache Tomcat 에서
secret 속성 대신 secretRequired="false" 속성을 설정했다면,
secret=passw0rd 부분은 삭제한다.
Apache Tomcat 의 conf/server.xml 에서 <Connector address="::1" 과 같이 설정했다면,
ajp://localhost:8009 는 ajp://[::1]:8009 와 같이 변경해야 한다.
만약, Apache Tomcat 에 manager 와 같은 context 를 차단하고 싶다면, VirtualHost 에 다음과 같은 설정을 추가할 수 있다.
ProxyPass /docs ! ProxyPass /examples ! ProxyPass /host-manager ! ProxyPass /manager !
4. 주의사항
8009 포트 보안과 Apache Tomcat 의 manager 등의 Context 와 관련된 것은 mod_jk.so 를 이용한 Apache httpd 와 Apache Tomcat 연동 을 참조한다.