개발/아파치와 톰캣

ajp 프로토콜 설정

jongqui 2018. 7. 8. 20:59

보통 톰캣 서버나 JAVA EE 서버를 사용할 때에는 load balancing을 위해 nginx나 apache 등 웹 서버를 배치한다.

이중 아파치와 톰캣을 연결하기 위해 크게 AJP 프로토콜과 reverse proxy를 사용한다.

reverse proxy는 자바 서버나 아파치에 국한되지 않고, 모든 종류의 서버에 사용할 수 있다는 장점이 있지만, 설정이 좀 더 복잡하다.

AJP 프로토콜은 아파치 재단에서 만든 프로토콜인데, 아파치 웹 서버와 JAVA EE 서버 간의 연결을 위한 프로토콜이다. 


지난 포스팅에서는 apache를 빌드했었다. 저 빌드로는 아파치에서 기본적인 html 페이지밖에 띄워주진 못하지만, 목적이 실제 운영이 아닌 AJP 프로토콜을 이용한 통신에서 테스트하는 것에 있으므로 php 등이 작동하든 말든 큰 상관은 없다.


AJP 프로토콜을 사용하기 위해선 AJP 모듈을 설치해야 한다. 이는 톰캣 공식 홈페이지에 들어가면 설치할 수 있다.

tomcat에는 포함되어 나오기 때문에 설치해줄 필요가 없다.

링크는 아래와 같다.

http://tomcat.apache.org/download-connectors.cgi


기본적으로 아파치와 아파치의 모듈은 C로 작성된 프로그램이기 때문에, 빌드 방식은 다 똑같다.

다만 이번엔 tomcat-connector directory에서 native 디렉토리까지 들어가야 한다.



./configure --with-apxs=/home/hello/apache/bin/apxs

make && make install



이번엔 prefix가 없다. apxs는 apache의 bin 디렉토리 내에 존재하므로, 상대경로를 알아서 다 잡아주는 것으로 보인다.

빌드가 끝났으면 apache 디렉토리 내의 modules 디렉토리에 mod_jk.so가 생긴 것을 볼 수 있다.


이제 conf/httpd.conf로 들어가서 


LoadModule jk_module modules/mod_jk.so

<IfModule jk_module>

 JkWorkersFile /home/hello/apache/conf/workers.properties

 JkLogFile logs/mod_jk.log

 JkLogLevel info

JkMount  /* worker1

</IfModule>



를 추가한다. 

JkWorkersFile은 연동할 서버의 목록과 사용할 포트, host 등을 표시한 파일의 경로를 의미한다.

JkMount는 AJP가 적용될 context 경로를 의미한다.

그리고, conf directory 내에 workers.properties를 추가한다.


worker.list=worker1


worker.worker1.port=8009

worker.worker1.host=127.0.0.1

worker.worker1.type=ajp13


여기서 list에 여러 worker를 할당할 수 있는데, 각 worker는 ,로 구분한다.

여기서 나오는 "worker1"은 httpd.conf 파일에서 각 context를 어떤 worker에 mount 해줄지 결정할 때 쓰인다.

톰캣에선 기본 설정에 port 80009가 설정되어 있다. tomcat/conf/server.xml에 보면 아래와 같이 설정이 있다.


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


여기서 인코딩을 변경할 수 있다. URIEncoding을 추가하면 된다. 기본 인코딩은 ISO-8859-1이다.


<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>


이제 TOMCAT_HOME/bin에 들어가 ./startup.sh 를 실행해 톰캣을 해 테스트 하면 잘 작동한다.