※ 해당 포스팅은 JDK 1.8.0_202 사용을 전제로 Apache Tomcat 8.5.버전으로 진행하였습니다.
#1. Apache Tomcat 다운로드 및 실행
Apache Tomcat 8.5.버전 다운로드 : https://tomcat.apache.org/download-80.cgi
※ Apache Tomcat 8.5 버전을 사용하는 이유
해당 포스팅은 Oracle Java JDK 1.8.202 버전을 설치하였고,
JDK 1.8 버전의 경우 Apache Tomcat 9 버전까지 호환된다.
그렇기에 비슷한 시기에 나온 Apache Tomcat 8.5를 사용한다.
1) Apahce Tomcat 다운로드 받기
wget 관리 도구를 이용하여 Apache Tomcat 다운로드 한다.
$ wget https://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.버전/bin/apache-tomcat-8.5.버전.tar.gz
--YYYY-MM-DD HH:MM:SS-- https://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.버전/bin/apache-tomcat-8.5.버전.tar.gz
Resolving mirror.navercorp.com (mirror.navercorp.com)... 125.209.216.167
Connecting to mirror.navercorp.com (mirror.navercorp.com)|125.209.216.167|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10559131 (10M) [application/octet-stream]
Saving to: ‘apache-tomcat-8.5.버전.tar.gz’
100%[===========================================================================================================================>] 10,559,131 1.84MB/s in 6.2s
YYYY-MM-DD HH:MM:SS (1.63 MB/s) - ‘apache-tomcat-8.5.버전.tar.gz’ saved [10559131/10559131]
다운받은 apache-tomcat-8.5.버전.tar.gz 파일을 /usr/local 경로에 압축을 해제한다.
$ sudo tar zxfv apache-tomcat-8.5.버전.tar.gz -C /usr/local
apache-tomcat-8.5.버전/conf/
apache-tomcat-8.5.버전/bin/
apache-tomcat-8.5.버전/lib/
apache-tomcat-8.5.버전/logs/
apache-tomcat-8.5.버전/temp/
apache-tomcat-8.5.버전/webapps/
~~ 이하 생략 ~~
2) Apahce Tomcat의 Port 및 Unicode 변경하기
압축을 해제하고 톰캣을 실행하기 전에 설정을 변경할 것이다.
Apache Tomcat의 Port 및 Unicode 변경하여 준다.
$ sudo vim /usr/local/apache-tomcat-8.5.버전/conf/server.xml
<?xml version='1.0' encoding='utf-8'?>
~~ 이 하 생 략 ~~
<Service name="Catalina">
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8181" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
~~ 이 하 생 략 ~~
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009"
protocol="AJP/1.3"
redirectPort="8443"
URIEncoding="UTF-8"/>
~~ 이 하 생 략 ~~
</Service>
</Server>
포트( port ) | 8181 |
텍스트 인코딩( URIEncoding ) 방식 | UTF-8 |
Apache Tomcat의 Port를 위와가팅 변경했다면
지정한 Prot 번호로 외부에서 접근할 수 있게끔 방화벽을 해제해 주어야 한다.
$ sudo firewall-cmd --zone=public --add-port=8181/tcp --permanent
success
이제 FireWall 방화벽을 재시작해 준다.
$ sudo firewall-cmd --reload
success
3) Apahce Tomcat 실행하기
Shell Script 실행명령으로 『startup.sh』 파일을 실행하여 Tocmat을 시작한다.
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-8.5.버전
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.버전
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.버전/temp
Using JRE_HOME: /
Using CLASSPATH: /usr/local/apache-tomcat-8.5.버전/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.버전/bin/tomcat-juli.jar
Tomcat started.
Tomcat을 실행하고 Browser를 통해 도메인 입력창에 Linux_Server_IP주소 : Port번호 형식으로 입력하여 준다.
http://Linux_Server_IP주소:8181
그럼 클라이언트의 Browser에서 위와같이 나타나는 것을 확인 할 수 있다.
반대로 Tomcat을 종료하는 Shell Script 파일은 『shutdown.sh』 파일이다.
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-8.5.버전
Using CATALINA_HOME: /usr/local/apache-tomcat-8.5.버전
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.5.버전/temp
Using JRE_HOME: /
Using CLASSPATH: /usr/local/apache-tomcat-8.5.버전/bin/bootstrap.jar:/usr/local/apache-tomcat-8.5.버전/bin/tomcat-juli.jar
#2. Apache Tomcat의 JAVA_HOME 경로 지정
Tomcat 설치 경로의 『setenv.sh』 파일을 열고, 위에서 확인한 Java JDK가 설치된 경로를 아래와 같이 추가해준다.
Tomcat의 구동 스크립트인 『catalina.sh』는 실행에 필요한 환경변수와 JVM 옵션을
setenv.sh를 통해서 사용자들이 설정할 수 있는데
Tomcat은 기본적을 실행될때 아래와 같이 『catalina.sh』이 『setenv.sh』 파일을 찾고 『setenv.sh』의 옵션을 등록하게 된다.
$ sudo vim /usr/local/apache-tomcat-8.5.버전/bin/catalina.sh
~~ 이 하 생 략 ~~
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
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
~~ 이 하 생 략 ~~
위와같이 『setenv.sh』를 호출하는것을 확인 하였으니 이제 『setenv.sh 파일을 만들어서 JAVA_HOME 경로를 지정하여 준다.
$ sudo vim /usr/local/apache-tomcat-8.5.버전/bin/setenv.sh
#!/bin/sh
# JAVA_HOME 경로 지정
JAVA_HOME="/usr/java/jdk1.8.0_202-amd64/"
JAVA_HOME 변수를 생성하고 "/usr/java/jdk1.8.0_202-amd64/" 디렉토리 위치 정보를 추가해 주기만 하면 된다.
JDK의 설치 경로를 찾을 수 없다면 아래 명령을 통해 확인 할 수 있다.
먼저 which 명령을 사용해 javac 명령어가 위치한 경로를 확인한다.
$ which javac
/usr/bin/javac
위 경로로 javac 명령어가 위친한 것을 확인 할 수 있다.
다음으로 readlink 명령으로 javac 명령의 실제 대상 경로를 찾아보자.
$ readlink -f /usr/bin/javac
/usr/java/jdk1.8.0_202-amd64/bin/javac
위 경로가 실제로 JDK 1.8.0_202가 설치된 경로이다.
#3. Apache Tomcat의 JVM 구동 옵션 설정
기본 Tomcat 설정은 JVM의 메모리가 작게 설정되어 있으니 직접 『setenv.sh』 파일을 한번더 수정해 주도록 하자.
$ sudo vim /usr/local/apache-tomcat-8.5.버전/bin/setenv.sh
#!/bin/sh
# JAVA_HOME 경로 지정
JAVA_HOME="/usr/java/jdk1.8.0_202-amd64/"
# JVM 옵션 설정
MIN_MEMORY="128m"
MAX_MEMORY="512m"
MAX_PERM_SIZE="256m"
SERVICE_NAME="myWebApp"
JAVA_OPTS="-Dcom.example.servicename=${SERVICE_NAME} -Xms${MIN_MEMORY} -Xmx${MAX_MEMORY} -XX:MaxPermSize=${MAX_PERM_SIZE} ${JAVA_OPTS}"
변수명 | 설 명 |
MIN_MEMORY | · 자바 가상 머신에 초기 할당되는 메모리 풀의 크기. · -Xms 옵션의 파라미터로 전달된다. |
MAX_MEMORY | · 자바 가상머신에 할당되는 메모리이 최대 크기. · 규모가 큰 어플리케이션을 구동하거나 시스템에 메모리 여유가 있다면 늘리는 것을 권장한다. |
MAX_PERM_SIZE | · 자바 가상 머신의 PermGen( Permanet Ganeration ) 영역의 크기, 클래스나 메서드, 기타 객체가 저장되는 영역이며 부족할 경우 OutOfMemoryError 가 발생할 수 있다. 특히 Tomcat의 manager를 이용해 핫 디플로이( Hot Deploy )를 한다면 크기를 더 늘려야 한다. |
SERVICE_NAME | · ps 명령어로 현재 구동된 톰캣 어플리케이션의 이름을 가져올 경우 여러개의 JVM이 구동 중이면 grp java로도 원하는 JVM 프로세스를 찾기가 어려울 수 있다. 이를 방지하고 현재 톰캣의 인스턴스를 명확히 구분하기 위해 구동시 서비스명을 지정하면 grep을 이용해 손쉽게 프로세스 정보를 가져올 수 있다. |
JAVA_HOME 추가와 함께 JVM 구동 옵션의 설정까지 모두 완료되었다면
이제 Apache Tomcat을 종료하고 재실행 해주어야 한다.
『shutdown.sh』 파일을 실행하여 Apache Tocmat을 종료하여 준다.
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown.sh
그런데 이 경우 종종 Apache Tomcat이 정상적으로 종료되지 않아 문제가 되는 일이 발생할 수 있는데,
이러한 경우 아래 내용을 참고하자.
#4. Apache Tomcat 강제 종료 Shell Script 작성
가끔 톰캣이 제대로 종료되지 않아 서비스 포트는 오픈되어 있고, 관리용 포트만 닫혀 있는 상황으로
JVM( Java Virtual Machine ) 자바 가상머신이 실행중인 경우가 존재한다.
이같은 상황에서는 shutdown.sh 명령을 실행하여도 종료할 수 없고
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown.sh
startup.sh 명령을 실행해도 이미 기존 프로세스가 서비스 포트를 사용하고 있어 구동할 수 없는 상황에 놓이게 된다.
이러한 경우 프로레스 및 파일을 보는 명령어인 lsof를 이용해 PORT를 사용중인 프로세스의 정보를 통해
PID를 알아낸 후 kill 명령어로 종료할 수 있지만,
매번 프로세스 명령을 알아내고 kill 명령으로 강제 종료 해주어야 하는 번거로움을 감수해야 한다.
1) Apache Tomcat 종료 쉘 스크립트( Shell Script ) 제작
Tomcat이 제대로 종료되지 않았을 경우 위에서 설명한 대로 lsof를 이용해 PID를 구한 다음 kill로 종료시킬 수 있지만
lsof의 출력결과를 가공해야 하므로 자동화 하기 어렵다는 단점이 있기에
아래와 같은 『shutdown_graceful.sh』 파일을 생성하여 Linux 서버에 반영해 보자.
$ sudo vim /usr/local/apache-tomcat-8.5.버전/bin/shutdown_graceful.sh
#!/bin/sh
# 프로세스 이름과 사용자명으로 PID 를 찾아서 종료시키는 함수
killproc() {
local prog=$1
local user=$2
local signal="TERM"
if [ "$#" = 0 ]; then
echo $"Usage: killproc {program} {user} {signal}"
return 1
fi
if [ "$#" = 3 ]; then
signal=$3
fi
PID=`ps -eaf|grep ${prog}|grep -v grep|grep ${user}|awk '{print $2}'`
## process still running..
if [ ! -z ${PID} ] && [ ${PID} -gt 0 ];then
echo "kill -${signal} ${PID}"
kill -${signal} ${PID};
return 1;
else
return 0;
fi
}
# 톰캣 인스턴스 이름.
# grep 으로 프로세스 찾을 때 java 나 tomcat 으로 찾으면
# 여러 개의 프로세스가 나올 수 있으므로 이 이름으로 찾는게 좋다.
# setenv.sh 에 SERVICE_NAME 프로퍼티에 지정한 이름을 적어주자.
SERVICE_NAME="servicename=myWebApp"
# 톰캣 홈 디렉토리.
# 설치 위치에 맞게 수정하자.
# 디렉터리가 없다면 스크립트를 호출한 위치를 톰캣 홈으로 사용한다.
TC_HOME=/usr/local/apache-tomcat-8.5.버전
if [ ! -d ${TC_HOME} ];then
TC_HOME=`pwd`
fi
# 사용자 별로 톰캣이 떠 있을수 있으므로 프로세스 소유자 명으로도 필터링한다.
USER=`whoami`
cd ${TC_HOME}
./bin/shutdown.sh >& /dev/null
sleep 1 # 톰캣 정상 종료를 위해 1초 대기
# 루프를 2번 실행
for i in 1 2;do
killproc ${SERVICE_NAME} ${USER}
RET=$?
if [ $RET = 0 ];then
break;
fi;
sleep $i;
done
# 아직도 종료되지 않았다면 KILL 시그널을 전송
killproc "${SERVICE_NAME}" "${USER}" "KILL"
2) Shell Script에 실행 권한 부여
『shutdown_graceful.sh』 파일이 완성되면 실행 『shutdown_graceful.sh』 파일에 대한 실행권한을 부여하여 준다.
$ sudo chmod +x /usr/local/apache-tomcat-8.5.버전/bin/shutdown_graceful.sh
※ "sudo chmod +x"는 파일에 실행권한을 부여하는 명령이다.
3) Apache Tomcat 종료
이제 『shutdown_graceful.sh』 파일을 실행하여 Apache Tomcat을 종료하여 준다.
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown_graceful.sh
#5. 별칭( alias )을 이용하여 Tomcat 실행 및 종료 단축 명령 지정
Apache Tomcat을 실행하기 위해서는 Linux 설치 경로에 존재하는
『startup.sh』 파일, 『shutdown.sh』 파일( 혹은 『shutdown_graceful.sh』 파일 ) 실행하여야 한다.
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/startup.sh
$ sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown.sh
물론 실제 서비스를 운영을 시작하고나면 수시로 Apache Tomcat을 실행하거나, 종료하는 경우는 없겠지만.
프로젝트를 진행하는 과정중에는 수시로 Tomcat을 재시작 해주어야 하기에
위와같이 명령을 입력하는 것은 매우 비효율 적일 수밖에 없다.
그래서 Linux에서 지원하는 긴 명령어의 별칭을 부여하여 사용을 간소화 해주는 alias를 이용하여
Tomcat의 실행( startup.sh ) 및 종료( shutdown.sh )종료 명령을 별칭을 지정하여
빠르게 Apache Tomcat을 종료하고 재기동 할 수 있는 작업을 진행하자.
1) Apache Tomcat의 시작( startup.sh ) 명령 별칭 지정
먼저 Apache Tocmat을 실행하는 별칭부터 만들어 보자.
$ alias tomcat_start='sudo sh /usr/local/apache-tomcat-8.5.버전/bin/startup.sh'
tomcat_start
별칭( alias )를 지정하고 Apache Tocmat을 실행 한다.
2) Apache Tomcat의 종료( shutdown.sh ) 명령 별칭 지정
종료명령은 『shutdown.sh』 가아닌 위에서 제작한 『shutdown_graceful.sh』 파일을 지정할 것이다.
$ alias tomcat_stop='sudo sh /usr/local/apache-tomcat-8.5.버전/bin/shutdown_graceful.sh'
tomcat_stop
별칭( alias )를 지정하고 Apache Tomcat을 종료 한다.
별칭( alias ) 지정이 마무리 되었다면 tomcat_start, tomcat_stop 명령이 제대로 등록되었는 지 한번 확인해 보자.
$ alias
~~ 이 하 생 략 ~~
alias tomcat_start='sudo sh /usr/local/apache-tomcat-버전/bin/startup.sh'
alias tomcat_stop='sudo sh /usr/local/apache-tomcat-버전/bin/shutdown_graceful.sh'
~~ 이 하 생 략 ~~
함께보면 좋을 문서
톰캣 운영 노하우 : https://www.slideshare.net/jieunsys/ss-56543446
[오픈소스컨설팅] 아파치톰캣 운영가이드 v1.3 : https://www.slideshare.net/ienvyou/scouter-jboss
'LINUX > CentOS' 카테고리의 다른 글
[CentOS] Scouter를 이용한 모니터링 시스템 구축 (0) | 2024.04.11 |
---|---|
[CentOS7] Oracle JDK 1.8 설치 및 환경변수 설정 (0) | 2024.04.11 |
[CentOS] Docker 설치하기 (4) | 2024.03.05 |
[CentOS] Redis 설치 (0) | 2023.12.18 |
[LINUX] CentOS7 - MediaWiki 설치 및 사용 (0) | 2023.08.07 |