Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

mod_proxy_ajp.so 를 이용한 Apache httpd 와 Apache Tomcat 연동

제목

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 를 검색한다.

https://github.com/apache/tomcat/blob/9.0.x/conf/server.xml

주석을 풀거나, <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 JSESSIONID cookie 값에 붙어다니기 때문에, 사용자는 "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:8009ajp://[::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:8009BalancerMember 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:8009ajp://[::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 연동 을 참조한다.

제목

첨부파일