Tomcat 설치 디렉토리 구성
과거에 Tomcat Multi Instance 설치에 관해서 쓴 글이 있다. Multi Instance 설치에서 핵심은 CATANINA_HOME과 CATALINA_BASE 를 분리하는데 있다.
오늘은 한발 더 들어가서 배포를 위한 설정과 시작, 종료 스크립트의 변경등에 대해서 이야기해보고자 한다.
Multi Instance 구성
Tomcat 을 다운로드 받아 압축을 풀면 그것이 곧 CATALINA_HOME 이 된다. 그리고 CATALINA_BASE 를 위해서 conf 디렉토리를 복사해주고 bin, lib, logs, temp, webapps, work 디렉토리를 생성해준다. 그리고 더블어서 war 파일을 배포를 위한 디렉토리를 Deployments 를 생성해주고 PID 저장을 위한 run 디렉토리도 생성해준다.
1 |
Deployments bin conf lib logs run temp webapps work |
CATALINA_HOME 에서 복사해주는 디렉토리는 conf 밖에 없다는걸 상기해야 한다.
setenv.sh 작성
catalina.sh 스크립트를 보면 Tomcat 를 위한 설정등은 setenv.sh 를 읽어오도록 되어 있다.
1 2 3 4 5 |
if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then . "$CATALINA_BASE/bin/setenv.sh" elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then . "$CATALINA_HOME/bin/setenv.sh" fi |
CATALINA_BASE/bin/setsenv.sh 를 먼저 확인하고 없으면 CATALINA_HOME/bin/setenv.sh 를 찾도록 되어 있다.
setenv.sh 에는 CATALINA_OPTS, JAVA_OPTS 등의 환경변수등을 설정할 수 있다. 환경변수에 대해서는 catalina.sh 파일을 열어보면 자세히 나온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh export JAVA_OPTS=" ${JAVA_OPTS} -server" export JAVA_OPTS=" ${JAVA_OPTS} -DjvmRoute=groupware1" export JAVA_OPTS=" ${JAVA_OPTS} -Dport.http=8180" export JAVA_OPTS=" ${JAVA_OPTS} -Dport.https=81443" export JAVA_OPTS=" ${JAVA_OPTS} -Dport.ajp=8109" export JAVA_OPTS=" ${JAVA_OPTS} -Dport.shutdown=8105" export JAVA_OPTS=" ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom" export JAVA_OPTS=" ${JAVA_OPTS} -Djava.library.path=/usr/local/apr/lib" export CATALINA_OPTS=" ${CATALINA_OPTS} -XX:NewRatio=3" export CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+DisableExplicitGC" export CATALINA_OPTS=" ${CATALINA_OPTS} -XX:+HeapDumpOnOutOfMemoryError" export CATALINA_OPTS=" ${CATALINA_OPTS} -XX:HeapDumpPath=/home/${INSTANCE_OWNER}/instance1/logs" export CATALINA_OPTS=" ${CATALINA_OPTS} -verbosegc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" export CATALINA_OPTS=" ${CATALINA_OPTS} -Xloggc:/home/${INSTANCE_OWNER}/instance1/logs/gc_`date "+%Y%m%d%H"`.log" |
‘-Dport.http’ 와 같은 변수 선언은 server.xml 에 다음과 같이 활용할 수 있다.
1 2 3 |
<Connector port="${port.http}" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="${port.https}" URIEncoding="UTF-8" /> |
그리고 이제 start.sh 와 shutdown.sh 는 다음과 같이 아주 간단하게 작성하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash export INSTANCE_OWNER=tomcat export CATALINA_HOME=/opt/tomcat export CATALINA_BASE=/home/$INSTANCE_OWNER/instance1 export CATALINA_PID=/home/$INSTANCE_OWNER/instance1/run/${INSTANCE_OWNER}.pid if [ $USER = "root" ]; then /bin/su -p -s /bin/sh $INSTANCE_OWNER $CATALINA_HOME/bin/startup.sh else $CATALINA_HOME/bin/startup.sh fi |
CATALINA_HOME, CATALINA_BASE 디렉토리를 함께 정의해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash export INSTANCE_OWNER=tomcat export CATALINA_HOME=/opt/tomcat export CATALINA_BASE=/home/$INSTANCE_OWNER/instance1 export CATALINA_PID=/home/$INSTANCE_OWNER/instance1/run/${INSTANCE_OWNER}.pid if [ $USER = "root" ]; then /bin/su -p -s /bin/sh $INSTANCE_OWNER $CATALINA_HOME/bin/shutdown.sh else $CATALINA_HOME/bin/shutdown.sh fi |
기본적은 환경 변수를 start.sh, shutdown.sh 에 넣어주거나 하니면 별도로 빼서 소스해줘도 된다.
배포
Tomcat 에는 appBase, docBase 와 같은 지시자가 존재한다. 이것을 별도로 지정하지 않으면 webapps 디렉토리가 appBase, docBase 가 된다. 이를 분리하면 war 파일 배포와 app 실행 디렉토리를 분리할 수 있게 된다.
이를 위해서 먼저 server.xml 에서 다음과 같이 설정을 변경한다.
1 2 3 4 |
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context path="/" docBase="${catalina.base}/Deployments/groupware.war" reloadable="true" /> |
위와같이 Context 에서 docBase 로 war 파일을 지정하면 된다. 이렇게하면 war 파일을 읽어서 webapps 디렉토리에 압축을 해제하게 된다.
이렇게해야 하는 이유가 있는데, war 파일을 배포하는 디렉토리의 소유권을 배포계정으로 하고 others 에 읽기(read) 퍼미션만 준다. 즉, 운영계정과 배포 계정을 분리해서 운영할 수 있게 된다는 것이다.
배포는 conf/CATALINA/${virtualhost}/ 디렉토리에 context 이름으로 xml 파일을 작성해도 배포가 된다. Multi Instance 를 구성하게 되면 Manager 가 없게 된다. 그런데, 많은 사람들은 이를 CATALINA_HOME/webapps/manager 디렉토리를 CATALINA_BASE/webapps 디렉토리에 복사해 넣는다. 하지만 그렇게 하지 않아도 된다.
1 2 3 |
<?xml version="1.0" encoding="UTF-8"?> <Context privileged="true" antiresourcelocking="false" docBase="${catalina.home}/webapps/manager" /> |
이를 ${catalina.base}/conf/Catalina/localhost/manager.xml 파일로 작성한다.
그러면 Tomcat 은 이를 읽어서 manager context 를 실행 준다.
왜 이렇게 하나?
CATALINA_HOME 과 CATALINA_BASE 를 분리하면 좋은 점이 업그레이드를 해야할 경우 나타난다.
몇몇 프로젝트하는 곳에서 Tomcat 설치된 것을 보면 CATALINA_HOME 에 startup.sh 파일이나 catalina.sh 파일을 직접 수정하는 경우를 볼 수 있다. 만일 보안 업데이트가 발생해 이를 Tomcat 업데이트를 해야한 경우라면 startup.sh, catalina.sh 파일을 새롭게 수정해줘야 한다.
하지만 CATALINA_HOME 과 CATALINA_BASE 를 분리하면 CATALINA_HOME 은 건드린게 없기 때문에 그냥 새로운 버전의 Tomcat 으로 바꿔치기하면 그만이다.
이는 휴먼 에러를 줄이는 확실한 방법이며 보안 업데이트 시간을 단축시켜준다.