1. Confidential
[오픈소스컨설팅] Tomcat 운영 메뉴얼_v1.0.docx
Last printed on 11/9/2018 12:12:00 PM
Apache Tomcat 운영 메뉴얼
Focus Area: Apache Tomcat 메뉴얼
Product/Process: Apache Tomcat 8.5.x
Prepared By:
Document Owner(s) Project/Organization Role
Jun-Young Son Senior Engineer
Project Status Report Version Control
Version Date Author Change Description
1.0 2018/11/08 Jun-Young Son Document created
[Version #] [mm/dd/yy] [Change owner]
• [Change 1]
• [Change 2]
• [Change n]
2. Installation Guide
Confidential Page 2 11/9/2018
TABLE OF CONTENTS
1. 본 문서의 목적............................................................................................................................. 5
1.1 Apache Tomcat 정보.................................................................................................. 5
1.2 Apache Tomcat Versions.......................................................................................... 5
2 APACHE TOMCAT 동작원리.................................................................................................. 7
2.1 Tomcat Architecture ................................................................................................. 7
2.2 Tomcat Connectors (3-Main Connectors).............................................................. 8
3 TOMCAT 구성......................................................................................................................... 8
3.1 Tomcat 표준 구성도.................................................................................................... 8
인스턴스 구성 위치 ................................................................................................ 9
3.2 WAS 구성 : Tomcat 8.5.x.......................................................................................... 9
Web Application Server ...................................................................................... 9
3.3 Tomcat Structure..................................................................................................... 10
Tomcat Component............................................................................................ 10
3.4 Tomcat 엔진 설치 ..................................................................................................... 12
Tomcat 다운로드................................................................................................. 12
Tomcat 설치........................................................................................................ 12
Tomcat 엔진 디렉토리 구조................................................................................ 13
3.5 Tomcat 설치 및 설정 .................................................................................................. 14
Tomcat Instance 디렉터리 구조 ........................................................................... 14
Tomcat 인스턴스 Concept ................................................................................... 14
Tomcat 환경변수.................................................................................................. 15
인스턴스 서비스 포트 변경................................................................................... 15
3. Installation Guide
Confidential Page 3 11/9/2018
4 TOMCAT 인스턴스 구성......................................................................................................... 16
4.1 Tomcat 인스턴스 생성 .............................................................................................. 16
Tomcat Template & 설정파일 복사 .................................................................. 16
Tomcat 서버 설정................................................................................................ 16
각 인스턴스 서버 설정 파일................................................................................. 17
실행 스크립트의 구성........................................................................................... 17
관리 스크립트의 구성........................................................................................... 23
5 TOMCAT DATASOURCE 설정 ............................................................................................ 25
5.1 JDBC Connection Pool 기본 설정............................................................................ 25
5.2 DataSource 설정....................................................................................................... 29
6 TOMCAT DEPLOY 설정 ....................................................................................................... 30
6.1 Application Deploy................................................................................................... 30
7 TOMCAT 운영 인프라 환경 설정........................................................................................... 31
7.1 OS Kernel Parameter 설정...................................................................................... 31
/etc/sysctl.conf................................................................................................... 31
/etc/security/limits.conf .................................................................................... 32
공통 JVM 옵션 설정............................................................................................. 32
8 TOMCAT 모니터링................................................................................................................ 33
8.1 모니터링 가이드......................................................................................................... 33
모니터링 항목....................................................................................................... 33
System Resource 체크....................................................................................... 35
Process Resource 체크...................................................................................... 36
Server Status...................................................................................................... 37
5. Installation Guide
Confidential Page 5 11/9/2018
1. 본 문서의 목적
본 문서의 목적은 Tomcat 운영에 필요한 내용을 담은 가이드 문서입니다. 본 문서에는
Tomcat 설치 현황 및 설치 및 환경 구성에 대한 내용이 포함되어 있으며, 기타 모니터링을
위한 정보 등을 모두 포함하고 있습니다.
1.1 Apache Tomcat 정보
1996 년 6 월 제 4 회 JavaOne (당시 Sun Microsystems 주최)가 개발하고 있던,
JSWDK(JavaServer Web Development Kit)을 Apache Software Foundation 에
기증하여 시작 되었습니다.
Tomcat 은 Apache Software Foundation(ASF) 하위의 Apache Tomcat 프로젝트에서
개발 되고 있는 Sevlet/JSP Container 가 포함된 웹 애플리케이션 서버(WAS)입니다.
1.2 Apache Tomcat Versions
⚫ Servlet 버전과 Tomcat Spec
Servlet
Spec
JSP
Spec
EL
Spec
WebSocket
Spec
JASPIC
Spec
Tomcat
Version
Latest
Version
Support
Java
Version
4.0 2.3 3.0 1.1 1.1 9.0.x 9.0.12
8 and
later
3.1 2.3 3.0 1.1 1.1 8.5.x 8.5.34
7 and
later
3.1 2.3 3.0 1.1 N/A 8.0.x 8.0.53
7 and
later
3.0 2.2 2.2 1.1 N/A 7.0.x 7.0.91
6 and
later
2.5 2.1 2.1 N/A N/A 6.0.x 6.0.53
5 and
later
2.4 2.0 N/A N/A N/A 5.5.x 5.5.36
1.4 and
later
2.3 1.2 N/A N/A N/A 4.1.x 4.1.40
1.3 and
later
2.2 1.1 N/A N/A N/A 3.3.x 3.3.2
1.1 and
later
자세한 정보는 URL 을 참조하십시오 http://tomcat.apache.org/whichversion.html
6. Installation Guide
Confidential Page 6 11/9/2018
⚫ Apache Tomcat Version 구분
- Alpha: Spec 및 버그에서 요구되는 많은 양의 테스트되지 않았거나 누락된
기능이 포함될 수 있으며, 안정적으로 실행되지 않을 수 있습니다.
- Beta: 테스트되지 않은 기능 및 여러가지 minor 버그가 포함될 수 있습니다.
- Stable: minor 버그를 해소하였지만, 상대적으로 추가적인 버그가 포함될 수
있습니다. Stable 릴리즈는 운영환경 용도로 사용이 가능하며 안정적으로 운영이
가능합니다.
⚫ Apache Tomcat 9.x
9.x 는 최신 버전이며 Tomcat 8.x 기반으로 하여 Servlet 4.0, JSP 2.3, EL 3.0,
WebSocket 1.1 및 JASPIC 1.1 사양을 구현합니다.
- HTTP/2 에 대한 지원을 추가 (Java 9 또는 Tomcat 네이티브 라이브러리 필요)
- JSSE 커넥터(NIO 및 NIO2)와 함께 TLS 지원을 위한 OpenSSL 사용에 대한
지원을 추가
- SNI(TLS 가상 호스팅)에 대한 지원을 추가
⚫ Apache Tomcat 8.x
8.x 는 Tomcat 7.0.x 를 기반으로 하여 Servlet 3.1, JSP 2.3, EL 3.0 및 WebSocket
1.1 사양을 구현합니다.
- HTTP/2 에 대한 지원을 추가 (Tomcat 네이티브 라이브러리 필요)
- JSSE 커넥터(NIO 및 NIO2)와 함께 TLS 지원을 위한 OpenSSL 사용에 대한
지원을 추가
- SNI(TLS 가상 호스팅)에 대한 지원을 추가
⚫ Apache Tomcat 7.x
7.x 는 Tomcat 6.0.x 의 향상된 기능을 기반으로 하며 Servlet 3.0, JSP2.2, EL2.2 및
WebSocket 1.1 사양을 구현합니다.
- 웹 응용 프로그램 메모리 누수 감지 및 예방
- Manager 및 Host Manager 응용 프로그램의 향상된 보안
- 일반적인 CSRF 보호
7. Installation Guide
Confidential Page 7 11/9/2018
- 웹 애플리케이션에 직접 외부 컨텐츠를 포함할 수 있도록 지원
- 리팩토링(커넥터, 라이프 사이클) 및 많은 내부 코드 정리
2 Apache Tomcat 동작원리
2.1 Tomcat Architecture
⚫ Server
✓ 서버의 개념으로 Tomcat 컨테이너 자체를 나타냄
⚫ Service
✓ 서버 내에 존재하는 컴포넌트에 대한 중재자 역할을 수행하며, 엔진에 하나 혹은
그 이상의 커넥터 사용
⚫ Engine
✓ 특정 서비스를 위한 요청 처리 파이프라인을 나타냄
✓ 하나의 서비스는 여러 개의 커넥터를 가질 수 있으며, 엔진은 이러한
커넥터들로부터 모든 요청을 수신하고 처리함
⚫ Host
✓ 특정 네트워크의 이름을 Tomcat 서버에 할당
8. Installation Guide
Confidential Page 8 11/9/2018
✓ 하나의 엔진의 여러 개의 호스트를 가질 수 있으며, 호스트의 요소는 도메인등과
같이 네트워크 별칭을 지원
⚫ Connector
✓ 클라이언트와의 프로토콜 통신을 처리하며, HTTP 및 AJP 커넥터를 가짐
⚫ Context
✓ 웹 애플리케이션을 나타내며, 하나의 Host 는 여러 개의 Context 를 가질 수 있음
✓
참조 URL: http://tomcat.apache.org/tomcat-8.5-doc/config/server.html
2.2 Tomcat Connectors (3-Main Connectors)
⚫ HTTP
✓ Application 서버로의 direct request 를 받음
✓ Default: enabled, 8080 port
⚫ HTTPS
✓ HTTPS 를 직접 입력으로 받음, SSL keystore 필요
✓ Default: siabled, 8443 port
⚫ AJP
✓ Apache Web Server 를 통해 mod_jk 를 통해 입력 받는 커넥터
✓ Default: enabled, 8009 port
3 Tomcat 구성
3.1 Tomcat 표준 구성도
⚫ 멀티 인스턴스 구성 시 CATALINA_HOME 은 최초 설치 상태에서 변경하지 않고
CATALINA_BASE 를 파일 복사, 스크립트를 추가하여 여러 대의 인스턴스 생성 시
아래의 그림과 같은 구성으로 생성합니다.
9. Installation Guide
Confidential Page 9 11/9/2018
인스턴스 구성 위치
Tomcat 의 디렉토리 위치는 인스턴스 의 “/opt/was/servers/{인스턴스명}/” 디렉토리에
설치 되어 있습니다.
실제 인스턴스 구성 파일 : server.xml
장비명 설정파일명 SERVER_HOME configuration 경로
# centos10 Server.xml
/opt/was/servers/{인스
턴스명}/”
/opt/was/servers/{
인스턴스명}/”conf
3.2 WAS 구성 : Tomcat 8.5.x
Web Application Server
서버 (WAS01)
Hostname # centos10
서버 IP 192.168.15.100
응용관리계정 wasuser ( / opt/was )
엔진관리계정 wasuser ( / opt/was/ apache-tomcat-8.5.23 )
domain home 위치 /opt/was/servers
기동 /opt/was/servers/{인스턴스명}/bin/start.sh
10. Installation Guide
Confidential Page 10 11/9/2018
정지 /opt/was/servers/{인스턴스명}/bin/stop.sh
비상정지 /opt/was/servers/{인스턴스명}/bin/kill.sh
Log 위치 /opt/was/servers/{인스턴스명}/logs
Config File server.xml
JVM Heap Size
Xms512m Xmx512m
MetaspaceSize=256m MaxMetaspaceSize=256m
3.3 Tomcat Structure
Tomcat Component
⚫ Server: Server = Catalina Servlet Container = Tomcat Instance
JVM 안에 Singletom 으로 존재, Server 내에 포함되는 Service 들 Life Cycle 관리 담당
⚫ Context: Web Application 을 나타내는 구성요소, Spec 상 ServletContext 와 매핑.
WAS/EAR 파일이나, Exploded 된 디렉토리
11. Installation Guide
Confidential Page 11 11/9/2018
⚫ Listeners: Tomcat Lifecycle 이벤트 발생시 action 을 수행하는 컴포넌트. Tomcat 의
Lifecycle 을 커스터마이징하고 싶은 경우 활용 가능
⚫ Manager: HTTP 세션을 생성 관리해주는 Session manager
⚫ Logger: JULI(Java Logging Implimentation)라는 자체 구현체를 제공
⚫ Valve: 컨테이너(Engine, Host, Context)와 관련된 각각의 request 처리 pipeline(valve
chain 객체)안에 들어가 있는 컴포넌트
12. Installation Guide
Confidential Page 12 11/9/2018
3.4 Tomcat 엔진 설치
- Tomcat 엔진은 https://tomcat.apache.org 에서 설치하고자 하는 Tomcat 엔진
버전을 다운로드 받아 설치파일의 파일을 압축을 푸는 것으로 설치를 수행합니다.
- Tomcat Engine 8.x 설치 시 아래의 URL 을 통해 zip, tar.gz 파일을 다운로드 받을 수
있습니다.
• 다운로드 URL: https://tomcat.apache.org/download-80.cgi
Tomcat 다운로드
다운로드 URL 을 통해서 설치 파일을 다운로드 합니다.
Tomcat 설치
13. Installation Guide
Confidential Page 13 11/9/2018
⚫ 설치 방법은 앞서 설명했던 것과 같이 서버에 업로드를 수행한 후 압축을 풀면 설치가
됩니다.
일반적으로 엔진과 애플리케이션 위치로 구성합니다.
[wasuser@centos10 /installFile/was]$ unzip apache-tomcat-8.5.23.zip
….생략
[wasuser@centos10 /installFile/was]$ls -al
drwxr-xr-x 9 wasuser wasuser 149 Sep 28 2017 apache-tomcat-8.5.23
NOTE. 엔진 설치는 파일 업로드 시간 + 압축 해제 시간이 전부입니다.
Tomcat 엔진 디렉토리 구조
Tomcat 의 디렉토리 구조는 다음과 같습니다.
인스턴스 생성을 위한 기본 template 정보는 별도의 servers 폴더에 위치하고 있습니다.
14. Installation Guide
Confidential Page 14 11/9/2018
3.5 Tomcat 설치 및 설정
⚫ Tomcat 의 각 서비스별 인스턴스 생성을 위하여 ㈜오픈소스컨설팅에서 제공하는
template 파일을 복사하여 생성을 진행합니다.
Tomcat Instance 디렉터리 구조
각 도메인 디렉토리 하위 정보는 다음과 같이 구성됩니다.
디렉터리 설명
bin Tomcat 를 구동하는 명령 스크립트 디렉토리
conf Tomcat Web 서비스를 위한 설정 파일 디렉토리
lib Tomcat Engine 이 사용하는 외부 라이브러리 (.jar) 디렉토리
log Tomcat 로그 파일 디렉토리 (catalina.out)
temp Tomcat Engine 에서 사용하는 임시 파일 디렉토리
webapps Tomcat 에서 웹 애플리케이션 Deploy 디렉토리
work jsp 파일이 서블릿으로 컴파일(.class)된 디렉토리
Tomcat 인스턴스 Concept
- Tomcat Engine 은 CATALINA_HOME 을 기준으로 “lib”, “bin” 디렉토리만
사용합니다.
- 실제 서비스를 담당하는 인스턴스들은 “conf”, “logs”, “temp”, “webapps”, “work”
디렉토리를 사용합니다.
- 이와 같은 디렉토리를 분리합으로써 “멀티 인스턴스” 환경을 구성합니다.
15. Installation Guide
Confidential Page 15 11/9/2018
$CATALINA_HOME/bin/startup.sh 실행하면 실제로 catalina.sh 이 실행됩니다.
catalina.sh 또는 Catalina.bat 은 CATALINA_HOME 환경 변수를 통해서 “Tomcat
Engine” 디렉토리를 통해서 기동합니다.
Tomcat 환경변수
Tomcat 내의 실제 인스턴스의 속성을 정의 한 환경 변수입니다
.
• CATALINA_HOME: Tomcat Engine 홈 디렉토리
• CATALINA_BASE: 멀티 인스턴스의 홈 디렉토리
• SERVER_NAME: 멀티 인스턴스의 서버명
• PORT_OFFSET: 멀티 인스턴스에서 사용하는 계산되는 port 범위
• COMP_USER: 인스턴스를 조작하기 위한 사용자 계정
• LOG_BASE: 멀티 인스턴스의 로그 디렉토리 지정
인스턴스 서비스 포트 변경
각 인스턴스 별로 server.xml 을 수정합니다.
16. Installation Guide
Confidential Page 16 11/9/2018
변경 이유는 동일한 포트를 사용하면서 서버를 기동하려 할 때, Port 충돌로 인해 서버
기동이 되지 않습니다. 인스턴스에서 지정한 port offset(env.sh) 과 default port 를 더하기
연산을 하여 인스턴스 내에 offset 연산으로 인해 포트 충돌에 대한 문제점을 해결할 수
있습니다.
- Shutdown Port
<Server port="${shutdown.port}" shutdown="SHUTDOWN">
- http port
<Connector port="${http.port}" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="${ssl.port}" />
- ajp port
<Connector port="${ajp.port}" protocol="AJP/1.3" redirectPort="${ssl.port}" />
4 Tomcat 인스턴스 구성
4.1 Tomcat 인스턴스 생성
Tomcat 인스턴스 설치는 Naming Rule 에 따라 /opt/was/{업무도메인}/{업무명} 라는
디렉토리를 사용하도록 합니다.
Tomcat Template & 설정파일 복사
㈜오픈소스컨설팅에서 제공하는 스크립트는 CATALINA_BASE/bin 디렉토리에
저장하고 $CATALINA_HOME/conf 파일을 기본 설정 파일을 복사하여 설치할
인스턴스에 복사합니다.
cp –fR /opt/was/apache-tomcat-8.5.23/conf /opt/was/server/{인스턴스명}/conf
Tomcat 서버 설정
노드명 서비스명 인스턴스명 Port offset Shutdown http ajp
17. Installation Guide
Confidential Page 17 11/9/2018
# centos
10
test test-svr-11 100 8105 8180 8109
각 인스턴스 서버 설정 파일
노드명 configuration 경로 configuration 파일명
# centos
10
/opt/was/servers/{인스턴스명}/conf server.xml
실행 스크립트의 구성
Setenv (환경설정, java 옵션 적용)
서비스에 해당하는 모든 설정이 env.sh 를 통해서 이루어지며 JVM 옵션 등은
env.sh 파일만 조작하시면 됩니다.(JVM 옵션, JNDI 포트 포함)
env.sh
#!/bin/bash
#************************ Warning **********************************
#* *
#* This configuration is property of OPEN SOURCE CONSULTING, INC. *
#* Don't distribute this to other project. *
#* *
#* Contact jchoi@osci.kr(http://www.osci.kr) *
#*******************************************************************
# This is tomcat env.sh for iosp by Open Source Consulting, Inc
export DATE=`date +%Y%m%d_%H%M%S`
#####################################
## Set Tomcat base env #####
#####################################
export JAVA_HOME=/usr/java/jdk1.8.0_152
export SERVER_NAME=tomcat8_11
export CATALINA_HOME=/opt/was/apache-tomcat-8.5.23
21. Installation Guide
Confidential Page 21 11/9/2018
echo "================================================"
start (인스턴스 기동)
start.sh 는 Java Processer 를 구동 시킬 때 사용하며 로그파일의 백업
옵션등을 설정할 수 있습니다.
start.sh
#!/bin/bash
. ./env.sh
DATE=`date +%Y%m%d%H%M%S`
# Process Check ---------------------------------------
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`
echo $PID
if [ e$PID != "e" ]
then
echo "Tomcat ($SERVER_NAME) is already RUNNING..."
exit;
fi
# WAS User Check----------------------------------------
UNAME=`id -u -n`
if [ e$UNAME != "e$COMP_USER" ]
then
echo "$COMP_USER USER to start this SERVER! - $SERVER_NAME..."
exit;
fi
# Make LOG Directory------------------------------------
if [ ! -d "${LOG_DIR}" ];
then
22. Installation Guide
Confidential Page 22 11/9/2018
mkdir -p ${LOG_DIR}
fi
if [ ! -d "${GC_LOG_DIR}" ];
then
mkdir -p ${GC_LOG_DIR}
fi
if [ ! -d "${HEAP_DUMP_DIR}" ];
then
mkdir -p ${HEAP_DUMP_DIR}
fi
# Make Temp Directory------------------------------------
if [ ! -d $CATALINA_BASE/temp ]
then
echo "temp directory is not exist. create temp directory."
mkdir -p $CATALINA_BASE/temp
fi
# -------------------------------------------------------
nohup $CATALINA_HOME/bin/catalina.sh run >> ${LOG_DIR}/$SERVER_NAME.out
2>&1 &
# ------------------------------------------------------
if [ e$1 = "enotail" ]
then
echo "Starting... $SERVER_NAME"
exit;
fi
# -----------------------------------------------------
sleep 1
23. Installation Guide
Confidential Page 23 11/9/2018
$CATALINA_BASE/bin/tail.sh
shutdown (요청 처리 후 종료)
stop.sh 파일은 JAVA Processer 를 종료할 때 사용합니다.
stop.sh
#!/bin/sh
. ./env.sh
$CATALINA_HOME/bin/shutdown.sh
kill (강제 종료)
kill.sh 파일은 kill -9 명령으로 즉시 종료할 때 사용합니다.
Linux OS 의 경우는 다음의 script 를 이용합니다.
kill.sh
#!/bin/bash
. ./env.sh
ps -ef | grep java | grep "server=$SERVER_NAME" | awk {'print "kill -9 " $2'}
| sh -x
관리 스크립트의 구성
Thread dump (장애 시 dump 파일 생성)
dump.sh 파일은 인스턴스가 느려지거나, JVM 의 현재 상황을 보려고 Thread Dump 를
얻으려고 할 때 사용하는 스크립트입니다.
24. Installation Guide
Confidential Page 24 11/9/2018
dump.sh
#!/bin/sh
. ./env.sh
for count in 1 2 3 4 5; do
echo "Thread Dump : $count"
for i in `ps -ef | grep java | grep "SERVER=$SERVER_NAME " | awk '{print
$2}'`;do
echo "+kill -3 $i"
kill -3 $i
echo "sleep 1 sec"
sleep 1
done
echo "done"
sleep 3
done
Process status (tomcat process 확인)
status.sh 스크립트는 프로세스가 동작 중인지 체크하기 위한 스크립트입니다.
status.sh
#!/bin/sh
. ./env.sh
ps -ef | grep java | grep "SERVER=$SERVER_NAME "
25. Installation Guide
Confidential Page 25 11/9/2018
tail.sh
tail.sh 는 nohup 로그를 보기 위한 스크립트입니다.
tail.sh
#!/bin/sh
. ./env.sh
tail -f $DOMAIN_BASE/$SERVER_NAME/log/server.log
5 Tomcat DataSource 설정
⚫ Tomcat 은 Database Connection Pool 로 Commons DBCP 와 Tomcat JDBC Pool 의
2 가지 Pool 을 제공
Common DBCP: org.apache.tomcat.dbcp. dbcp.BasicDataSourceFactory (default)
- org.apache.common -> org.apache.tomcat. 패키지 변경
Tomcat JDBC: org.apache.tomcat.jdbc.pool.DataSourceFactory
⚫ DBCP 는 Apache Commons 프로젝트가 제공하는, Database Connection Pool 로
오픈 소스 Database Connection Pool 을 가장 많이 알려져 있고, 많이 사용하고
있습니다.
⚫ Tomcat JDBC 는 Apoache Tomcat 프로젝트가 독립적으로 개발한 Database
Connection Pool 입니다.
5.1 JDBC Connection Pool 기본 설정
공통 DB 접속 설정
구분 설명 비고
username
DB 연결을 위해 JDBC 드라이버에 전달되는 사용자
이름
password
DB 연결을 위해 JDBC 드라이버에 전달되는 사용자
패스워드
26. Installation Guide
Confidential Page 26 11/9/2018
url DB 연결을 위해 JDBC 드라이버에 전달되는 URL
driverclassname
JDBC 드라이버의 FQCN (Fully Qualified Class
Name)
connectionProperties
DB 연결을 위해 JDBC 드라이버에 전달되는 연결
Properties
항목 설명 기본값
defaultAutoCommit Connection 의 AutoCommit true
defaultReadOnly Connection 기본 ReadOnly 상태 dirver
defaultTransactionsolation
Connections 의 기본 Transactionsolation 상태
-READ_COMMITTED
-READ_UNCOMMITTED
-REPEATABLE_READ
-SERIALIZABLE
defaultCatalog Connection 의 defaultCatalog dirver
cacheState
Connection 이 사용될 때 이후 모든 쓰기에서
readOnly 와 autoCommit 설정을 캐시
true
defaultQueryTimeout
Null 이 아닌 경우 Connection 에서 사용할 쿼리
시간을 제한
null
enableAutoCommitOnReturn
Connection 이 반환될 때
Connection.setAutoCommit(true)인지 체크되고
해당 값으로 설정
true
rollbackOnReturn Connection 반환될 때 rollback 수행 true
⚫ Common JDBC Connection 설정
항목 설명 기본값
Initialsize Pool 이 시작될 때 생성되는 초기 Connection 수 0
maxTotal Pool 에서 동시에 할당할 수 있는 최대 연결 수 8
Maxidle Pool 에서 최대 idle Connection 수 8
Minidle Pool 에서 최소 idle Connection 수 0
maxWaitMillis Connection 을 얻기 위해 대기 시간 무제한
⚫ Tomcat JDBC Connection 설정
27. Installation Guide
Confidential Page 27 11/9/2018
항목 설명 기본값
Initialsize Pool 이 시작될 때 생성되는 초기 Connection 수 10
maxActive Pool 에서 동시에 할당할 수 있는 최대 연결 수 100
Maxidle Pool 에서 최대 idle Connection 수 100
Minidle Pool 에서 최소 idle Connection 수 10
maxWaitMillis Connection 을 얻기 위해 대기 시간 무제한
⚫ JDBC Connection Validation 설정
항목 설명 기본값
validationQuery Connection 유효성 확인을 위한 SQL Query
testOnBorrow
Pool 에서 Connection 을 전달하기 전에 유효성을
검증. 검증에 실패했을 경우, 해당 연결을 삭제하고,
새롭게 Pool 에서 Connection 시도
testOnReturn
Pool 에 Connection 을 반환하기 전에 Connection
유효성을 검증
testWileidle
Idle 상태의 Connection 에 대한 유효성을 검증
검증에 실패할 경우 해당 Connection 을 파기함
이기능은 Evictor 를 이용하기 때문에 Evictor 를
활성화 해야됨(timeBetweenEvictionRunsMillis 설정
참조)
initSQL Connection 을 만들 때 실행되는 SQL Query
validationClassName
Validation Class 명을 지정.
이 속성을 지정 시 vaildationQuery 에 의한 검증 대신,
Validator Class 에 의한 연결의 검증이 이루어짐
(org.apache.tomcat.jdbc.pool.Validator 인터페이스
구현 필요)
validationInterval Vaildation 의 실행 간격 지정 30 초
logValidationErrors Validation 중 오류 발생시, 로그 출력할지에 대한 설정 false
⚫ PoolCleaner 설정(Evictor)
항목 설명 기본값
28. Installation Guide
Confidential Page 28 11/9/2018
timeBetweenEvictionRunsMilles Idle 상태의 Connection 을 Check 하는 간격 5 초
minEvictableIdleTimeMillis Idle Connection 의 생존 기간 60 초
⚫ Connection Leak 검출 설정 (removeAbandoned)
항목 설명 기본값
removeAbandoned Connection 누수 감지 설정 사용 여부 false
removeAbandonedTimeout Connection 누수로 판단하기까지의 시간 60 초
logAbandoned
Connection 누수를 감지했을 때,
Connection 을 Close 하지 않은
애플리케이션의 Stuck Thread 를 로그로
출력 여부의 설정
False
suspectTimeout
Conection 누수의 의심에 대한 판단
할때까지의 시간
suspectTimeout 시간을 초과한
Connection 에 대해 경고 로그 및 JMX 에
통지를 수행
0
AbandonWhenPercentageFull
누수된 Connection 을 파기할 비율을 설정
0~100 사이로 설정하며, 이 설정을 초과한
누수 Connection 을 파기
RemoveAbandonedTimeout 가 초과한
Connection 은 모두 파기
0
⚫ DataSource 설정 샘플
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/OracleDS"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="false"
testOnReturn="false"
validationQuery="SELECT 1 FROM DUAL"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="10"
maxIdle="5"
maxWait="10000"
29. Installation Guide
Confidential Page 29 11/9/2018
initialSize="5"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="false"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.Connection
State;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="scott"
password="jan01jan"
driverClassName="oracle.jdbc.OracleDriver"
poolPreparedStatements="true"
url="jdbc:oracle:thin:@192.168.10.100
</Context>
5.2 DataSource 설정
⚫ Global Resource Level
- DataSource Pool Global Level 공유
✓ Global Resource(server.xml) + Resource Link(application-context.xml)
✓ Server: ${CATALINA_HOME}/conf/server.xml
<Server port="${port.shutdown}"
shutdown="ARGO_INSTANCE_SHUTDOWN">
<GlobalNamingResources>
<Resource name="jdbc/argo" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://10.0.1.88:3306/oom"
username="root“ password="uCO5FkZ3NfgDo/LWB0l+0A=="
……
/>
</GlobalNamingResources>
</Server>
⚫ Context Level
- DataSource Pool 해당 Context 별 생성됨
- Global Context (context.xml)
✓ 모든 Application 에서 사용 가능
✓ Context(1) : ${CATALINA_HOME}/conf/context.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<ResourceLink global="jdbc/argo" name="jdbc/argo"
type="javax.sql.DataSource"/>
30. Installation Guide
Confidential Page 30 11/9/2018
</Context>
- Application Context (application-context.xml)
✓ 해당 Application 에서만 사용 가능
✓ Context(2) :
${CATALINA_HOME}/conf/Catalina/localhost/${CONTEXT_NAME}.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Context docBase="/sorc001/argo/application/sample-simpleweb" path="/"
reloadable="false">
<ResourceLink global="jdbc/argo" name="jdbc/argo"
type="javax.sql.DataSource"/>
</Context>
6 Tomcat Deploy 설정
6.1 Application Deploy
Tomcat 인스턴스는 $CATALINA_BASE/webapps 또는 다른 경로일 경우 server.xml 에
context 를 지정하여 deploy 설정이 가능합니다.
⚫ Deploy Type
✓ Archive File Type
✓ Exploded Structure
⚫ Web Archive
✓ Catalina.base/webapps 디렉토리에 .war 파일을 복사하여 디플로이
⚫ Exploded
✓ Catalina.base/webapps 디렉토리에 exploded 형태의 디렉토리 구조를 사용
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false">
<Context path="" docBase="/opt/was/apps/test.war" reloadable="false"/>
</Host>
항목 설명 기본값
path 컨텍스트 경로에 대한 설정
docBase 애플리케이션 document 경로 설정
reloadable 클래스 변경시 마다 자동 reload
31. Installation Guide
Confidential Page 31 11/9/2018
7 Tomcat 운영 인프라 환경 설정
7.1 OS Kernel Parameter 설정
/etc/sysctl.conf
리눅스 OS 시스템에서 기본 default 설정에서 몇가지 설정을 변경 하게 되면 빠른 장애 감지
효과 등이 있으므로 튜닝 요소가 됩니다.
해당 설정은 다음의 /etc/sysctl.conf 파일에 추가하여 설정을 할 수 있습니다.
항목 설명 기본값 권장값
net.ipv4.neigh.default.unres_qlen Increase TCP 6 100
net.ipv4.tcp_keepalive_time Drop Keep-alive time 7200 30
net.ipv4.tcp_fin_timeout
Drop it so lack of FIN times
out quicker
60 10
net.core.netdev_max_backlog
Increase number of
incoming connections
backlog
1000 2500
net.ipv4.tcp_retries1
How many times to retry
killing an alive TCP
connection
3 2
net.ipv4.tcp_retries2
How many times to retry
killing an alive TCP
connection
15 3
net.ipv4.ip_local_port_ran Increase Local port range
32768
60999
1024
65000
net.core.rmem_max Max TCP receive Buffer 25165824 16777216
net.core.rmem_default Default TCP receive Buffer 8388608 16777216
net.core.wmem_max Max TCP Send Buffer 25165824 16777216
net.core.wmem_default Default TCP send Buffer 212992 16777216
32. Installation Guide
Confidential Page 32 11/9/2018
net.ipv4.tcp_window_scali
ng
Enable really big(>65kb)
TCP window
scaling
0 1
net.ipv4.tcp_timestamps Turn off timestamp 1 0
net.ipv4.tcp_sack Turn off tcpsack 1 0
net.ipv4.tcp_orphan_retrie
s
유저파일 핸들에 할당되지
않은 연결에
몇 번 재시도할지
7 0
vm.swappiness Swap 사용량결정 10 1
/etc/security/limits.conf
Open files 및 native stack 관련해서 limits 설정을 변경합니다. ( ulimit -a)
asmanager soft nofile 8192
asmanager hard nofile 65535
asmanager soft nproc 8192
asmanager hard nproc 65535
공통 JVM 옵션 설정
항목 설명 값
client/server
-client : JVM hotspot 의 client 모드로 사용,
client 모드는 Application 시작 시간과 메모리 사용량을
최소로 수행 -
server
-server : 컴파일 등 최적화를 수행하여 최적의 성능으로
수행
Xms 초기 메모리 크기
1024
M
Xmx 최대 메모리 크기 1024
M
-XX:+PrintGCDetails
Garbage Collection 시 조금 더 상세한 항목의 로그 출력을
위한 설정
-XX:+ UseG1GC - G1GC를 사용하기 위한 설정
33. Installation Guide
Confidential Page 33 11/9/2018
-
XX:+HeapDumpOnOu
tOfMemoryError
JVM 에서 OutOfMemory 에러가 발생할 경우 Heap
Memory Dump 를 생성할지 여부를 결정
-XX:HeapDumpPath Heap Memory 생성시 생성 위치
-Xloggc
GC 로그를 별도의 파일로 저장하기 위한 옵션
Memory 사용 추이를 확인할 수 있음.
-
Dcom.sun.managemen
t.jmxremote
-
Dcom.sun.managemen
t.jmxremote.port=1501
1
-
Dcom.sun.managemen
t.jmxremote.authentica
te=false
-
Dcom.sun.manageme
nt.jmxremote.ssl=false
JMX : Java Management Extention 활성화 내용으로
서버의 모니터링을 위한 설정
8 Tomcat 모니터링
8.1 모니터링 가이드
모니터링 항목
대항목 중항목 세부항목 설명 모니터링 결과
OS
System
Resource Usage
CPU 사용량 CPU 전체 사용량 양호
Memory 사용량 Memory 전체 사용량 양호
운영환경
서버 상태
Process
Resource Usage
Process CPU 과부하
사용
프로세스 CPU 사용률 양호
Disk Usage 설치 디스크의 사용량 양호
Server Status Server Status Server Life Cycle 양호
실행 상태
Execute Status Thread status
실행 쓰레드 및
idle thread status
양호
Garbage
Collection
Full GC Duration Full GC 처리 상태 양호
34. Installation Guide
Confidential Page 34 11/9/2018
Heap Memory
Heap Memory Init 힙메모리 초기값 양호
Heap Memory Max 힙메모리 최대값 설정 양호
Perm Area Max Size MaxPermSize 의 설정 양호
JDBC
커넥션풀
Configuration
JDBC url
jdbc connection meta
data URL
양호
JDBC driver name jdbc driver class name 양호
Monitorming Connections 사용중인 커넥션 개수 양호
로그 분석 ServerLog
Critical Message 부팅 Critical 에러 양호
Too many open files 파일 오픈 개수 초과 양호
OutOfMemoryError 힙메모리 부족 양호
35. Installation Guide
Confidential Page 35 11/9/2018
System Resource 체크
cpu 사용량
사용서비스 되어지는 CPU 의 사용량 체크를 위하여 다음의 명령어를 통해 모니터링을
진행합니다.
vmstat 1 100
항목 설명
us : user cpu usage
sy : system cpu usage
id : cpu idle usage
정상 여부 확인 : id 60% 이상일 경우 양호, id 30% 미만인 경우 위험
$ vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- --
system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 853424 69016 4648 29128 0 0 13 8 8 4 0 0 99 0 0
0 0 853424 69008 4648 29128 0 0 0 0 113 242 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 75 211 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 106 254 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 73 208 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 118 263 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 78 203 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 95 244 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 89 219 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 85 237 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 93 221 0 0 100 0 0
0 0 853424 69008 4648 29128 0 0 0 0 109 244 1 0 100 0 0
36. Installation Guide
Confidential Page 36 11/9/2018
Memory 사용량
사용서비스 되어지는 Memory 사용량 체크를 위하여 다음의 명령어를 통해 모니터링을
진행합니다.
free -m
항목 설명
total : 전체 메모리 용량
used : 메모리 사용량
free : 여유 메모리 공간
shared : 공유메모리 사용량
buffers : 버퍼 메모리 공간
cached : 캐쉬메모리 사용량
정상 여부 확인 : free 최소 여유공간이 전체 메모리 대비 최소 10% 이상일 경우
$ free -m
total used free shared buffers cached
Mem: 1877 1810 66 0 0 30
-/+ buffers/cache: 1779 98
Swap: 4031 831 3200
Process Resource 체크
프로세스 과부하 cpu 여부 확인
서비스 되어지는 process 의 CPU 사용량이 과부하 인지 여부를 체크합니다.
top
항목 설명
top 명령을 통해서 해당 프로세스의 현재 CPU 정보를 확인합니다.
정상 여부 확인 : 프로세스당 CPU 사용이 많은지 여부를 확인합니다.
$ top
top - 03:14:41 up 14 days, 12:59, 4 users, load average: 0.19, 0.13, 0.09
37. Installation Guide
Confidential Page 37 11/9/2018
Tasks: 336 total, 1 running, 335 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.7%us, 3.5%sy, 0.0%ni, 92.1%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16271536k total, 15962368k used, 309168k free, 697304k buffers
Swap: 16777208k total, 529588k used, 16247620k free, 6697584k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27150 wasuser 20 0 3016276 102456 14680 S 0.3 2.6 1:55.56 /usr/java/jdk1.8.0_152/bin/java -
Djava.util.logging.config.file=/opt/+
32607 wasuser 20 0 2411612 349528 18928 S 0.3 9.0 64:52.97 /usr/java/jdk1.7.0_80/bin/java -
D[Standalone] -XX:+UseCompressedOops +
1 root 20 0 191108 3044 1952 S 0.0 0.1 9:22.88 /usr/lib/systemd/systemd --switched-root -
-system --deserialize 21
Disk Usage
서비스 되어지는 Disk 사용량을 파악하여 여유 공간을 확인합니다.
df -h
정상 여부 확인 : 서비스 사용 영역 및 root 파일 시스템의 사용율이 80% 인 경우
위험으로 간주합니다.
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_rhevmtest-lv_root
26G 23G 1.9G 93% /
tmpfs 939M 72K 939M 1% /dev/shm
/dev/vda1 485M 38M 422M 9% /boot
Server Status
Service Process 정상 여부 확인
현재 서버 상태에 대해서 모니터링을 합니다.
ps –ef | grep ${processName}
38. Installation Guide
Confidential Page 38 11/9/2018
ex) ps –ef | grep java | grep SERVER_NAME
항목 설명
ps 명령을 통해서 해당 프로세스의 현재 동작 여부를 확인합니다.
정상 여부 확인 : 프로세스 목록에 해당 내용이 있어야만 합니다.
$ ps -ef|grep java|grep SERVER_NAME
wasuser 27150 1 65 21:26 pts/2 00:00:09 /usr/java/jdk1.8.0_152/bin/java -
Djava.util.logging.config.file=/opt/was/servers/tomcat8_11/conf/logging.properties -
java.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Dserver=tomcat8_11 -
Dhttp.port=8180 -Dajp.port=8109 -Dssl.port=8543 -Dshutdown.port=8105 -
Djava.library.path=/opt/was/apache-tomcat-8.5.23/lib/ -verbose:gc -
Xloggc:/opt/was/servers/tomcat8_11/logs/gclog/gc.log -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -
XX:HeapDumpPath=/opt/was/servers/tomcat8_11/logs/heaplog/java_pid.hprof -
Djava.net.preferIPv4Stack=true -Dsun.rmi.dgc.client.gcInterval=3600000 -
Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true -
Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -
Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-classpath /opt/was/apache-tomcat-8.5.23/bin/bootstrap.jar:/opt/was/apache-tomcat-
8.5.23/bin/tomcat-juli.jar -Dcatalina.base=/opt/was/servers/tomcat8_11 -
Dcatalina.home=/opt/was/apache-tomcat-8.5.23 -
Djava.io.tmpdir=/opt/was/servers/tomcat8_11/temp org.apache.catalina.startup.Bootstrap start
Port Listen 정상 여부 확인
netstat –an | grep ${servicePort}
ex) netstat –an | grep 8180
항목 설명
netstat 명령을 통해서 해당 프로세스의 현재 Network 동작 여부를 확인합니다.
정상 여부 확인 : Port 목록에 해당 서비스에서 사용되는 포트가 LISTEN 항목으로 되어
있어야 합니다.
39. Installation Guide
Confidential Page 39 11/9/2018
$ netstat -an | grep 8180
tcp 0 0 0.0.0.0:8180 0.0.0.0:* LISTEN 27150/java
로그 파일 사이즈 체크
서비스 되어지는 해당 process 의 server 로그 및 기타 gc, nohup 로그등의 사용량을
체크합니다.
du –csh *log
정상 여부 확인 : 서비스 사용 로그 파일이 최대 2G 이내여야 합니다.
$ du –csh *
20K catalina.2018-05-03.log
20K catalina.2018-07-03.log
136K catalina.2018-07-10.log
36K catalina.2018-07-19.log
12K catalina.2018-11-08.log
224K total
Execute Status – 실행 상태
Garbage Collection 로그를 통한 서비스 정상 여부
서버 기동시 verbosegc 옵션을 통하여 gc 모니터링을 통한 서비스 정상 여부를
확인합니다.
tail
ex) tail -f gc.log.20140513
항목 설명
tail 명령을 통해서 현재 verbosegc 로그를 확인하여 지속적인 Full GC 여부를
모니터링합니다.
정상 여부 확인 : 2~5 지속적인 Full GC 로그가 보인다면 비정상으로 판단
41. Installation Guide
Confidential Page 41 11/9/2018
항목 설명
ps 명령을 통해서 해당 프로세스의 현재 동작 여부를 확인합니다.
정상 여부 확인 : 프로세스 목록 내용에서 Heap Memory 설정값이 적정값 ( min:max
1G <= 2G) 으로 설정이 되어 있는지 확인합니다.
$ ps –ef | grep java | grep SERVER_NAME
wasuser 27150 1 65 21:26 pts/2 00:00:09 /usr/java/jdk1.8.0_152/bin/java -
Djava.util.logging.config.file=/opt/was/servers/tomcat8_11/conf/logging.properties -
java.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Dserver=tomcat8_11 -
Dhttp.port=8180 -Dajp.port=8109 -Dssl.port=8543 -Dshutdown.port=8105 -
Djava.library.path=/opt/was/apache-tomcat-8.5.23/lib/ -verbose:gc -
Xloggc:/opt/was/servers/tomcat8_11/logs/gclog/gc.log -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -
XX:HeapDumpPath=/opt/was/servers/tomcat8_11/logs/heaplog/java_pid.hprof -
Djava.net.preferIPv4Stack=true -Dsun.rmi.dgc.client.gcInterval=3600000 -
Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true -
Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -
Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-classpath /opt/was/apache-tomcat-8.5.23/bin/bootstrap.jar:/opt/was/apache-tomcat-
8.5.23/bin/tomcat-juli.jar -Dcatalina.base=/opt/was/servers/tomcat8_11 -
Dcatalina.home=/opt/was/apache-tomcat-8.5.23 -
Djava.io.tmpdir=/opt/was/servers/tomcat8_11/temp org.apache.catalina.startup.Bootstrap start
8.2 모니터링 툴 소개
VisualVM
⚫ JVM 전반에 대해 모니터링을 제공하는 툴
⚫ JVM 에 포함 ($JAVA_HOME/bin/jvisualvm)되어 있으며, 공식 홈페이지에서도 다운로드
가능
⚫ 제공기능
✓ Display local and remote Java applications
✓ Display Application Configuration and runtime environment
✓ Monitor application threads, application performance and memory consumption
✓ Take and display thread dumps
✓ Take and browse heap dumps
42. Installation Guide
Confidential Page 42 11/9/2018
Scouter APM
⚫ 오픈소스 Application Performance Managerment 으로 Java, WAS 에 대한 모니터링
⚫ J2EE 시스템 운영 상태 모니터링을 위한 각종 데이터를 모니터링
⚫ WAS 단위 인스턴스 사용자 정의형 통합 대시보드 구성 환경 지원
⚫ Hardware, OS, Application, JVM 모니터링 가능