💛03_Server & OS/02_Apache Tomcat

#Tomcat #server.xml #autoDeploy #reloadable #Jenkins배포오류 #tomcat설정

roomname-dev 2023. 4. 11. 09:24
728x90

프로젝트를 진행하다 Jenkins를 통해 배포를 하던 도중 에러가 발생했다. 

로그를 보면 서버가 시작되면서 발생하는 에러라는 내용이였다. 

 

알고 보니 tomcat 설정에서 autoDeploy설정이 true로 되어있었고 jenkins에서도 server재기동 로직이 충돌하면서 발생한 

내용이였다. 그래서 autoDeply와 reloadable설정에 대해 알아보도록 하겠습니다. 

 

일단 알아보기 전에 tomcat에 server.xml에 대해 간략히 알아보고 가자. 

 

🧨server.xml

$CATALINA_HOME/conf/server.xml은 Tomcat의 메인 설정 파일로 Tomcat 기동시에 참조 된다.

$CATALINA_HOME/conf/ 디렉토리에는 디폴트 server.xml 이외에 최소한의 설정만으로 구성된

server-minimal.xml이 준비되어 있다. 새로 서버를 설정하고자 할 경우에는 server-minimal,xml의 이름을 변경하여 사용하면 편리하다.

server.xml 은 톰캣이 실행시 필요한 정보를 정의한 파일이다. 포트 정보, DB 접속정보, 웹 리소스(ex. jsp, image 파일) 참조경로, 이벤트 리스너(event listener) 등을 설정한다.

<Server>
	<Listener/>
	
	<GlobalNamingResources>
    		<Resource/>
	</GlobalNamingResources>
	
	<Service>
		<Connector/>
		<Engine>
			<Realm/>
			<Host/>
		</Engine>
	</Service>
</Server>

<Server> 는 server.xml 의 최상위 컴포넌트다. 이 아래에 필요한 컴포넌트가 기술된다.

Listener: 톰캣의 이벤트 리스너 정의
GlobalNamingResources: JNDI정보, 즉 JDBC 와 같은 java-DB 연결정보를 정의
Service: 클라이언트의 요청을 어떻게 처리할지 정의

🧨autoDeploy(default true)

autoDeploy설정은 기본 true로 설정이 되어있다. war파일을 appBase디렉토리에 위치시켜두면 톰캣 구동시 war파일을 자동으로 읽어 배포 진행 합니다. 

🧨reloadable

reloadable = true 옵션은 일정 주기마다(15초간격) 루트경로의 class파일 변경내역이 존재시 서버 자동 재기동하여 리로드 처리를 제공한다.

단! 이설정에 참고사항이 있으니 알고 가자!

1. out of memory 

서버 재기동 이후 리로드 될때 기존 클래스 파일에 대한 메모리 해제가 되지 않는다. 기존 클래스 파일에 대한 메모리는 그대로 가지고 있으면서 신규 클래스 파일의 메모리를 새롭게 할당하게 됨으로 누적이 많이 발생할 경우 heap memory 부족 tomcat오류가 발생함으로 서버를 가끔 재기동 해주자

 

2. jenkins배포시 오류 발생

jenkins를 통해서 배포를 하다보면 memory leak이란 문구가 나오며 에러가 발생할수 있다. 일단 필자는 jenkins를 간접적으로 이용하여 배포를 진행 하였으나 충돌이 나서 jenkins배포가 정상적으로 이뤄지지 않았다. 그래서 reloadable 옵션, autodeploy옵션을 끄고 jenkins배포를 진행 결과 정상적으로 배포가 되는 내역이 발생하였다. 

jenkins배포동안 ant빌드, maven빌드를 통해 class파일이 변경되고 이때 서버에서 reloadable옵션이 되어있으면 서버가 자동 재기동 되는데 이때 충돌하는것 같다. 

war파일을 통해서 직접 배포시에는 에러가 발생하지 않지만 위 옵션을 설정하고 배포시 jenkins에서 재공하는 서버재기동과 충돌이 발생하여 해당 설정을 끄고 진행 하였다. 

 

🧨unPackWARs(default true)

unPackWARs 옵션은 WAR파일을 appBase 디렉토리에 위치시키면 톰캣 재기동시 WAR파일을 자동으로 읽어 배포(deply)를 하는 설정입니다. 

<Host name="localhost"  appBase="webapps" 
unpackWARs="true" autoDeploy="false" reloadable="false">
728x90