Tomcat Manual
* 수동설치메뉴얼
Apache Install
1. apr , apr-util , pcre , apache , install , etc
Tomcat Install
1. Download
2. Setting
Load Balnce
1. Tomcat Connector install
2. Setting
Session Clustering
1. Setting
Public Session - redis
1. Setting
sh.tomcat , sh.redisclean, sh.apache
________________
Apache Install - 1. apr
cd /usr/local/
http://apache.mirror.cdnetworks.com/apr/ 이동 후 최신버전 URL 획득 후 wget 실행
ex) wget http://apache.mirror.cdnetworks.com/apr/apr-1.5.2.tar.gz
Apache Install - 2. apr-util
http://apache.mirror.cdnetworks.com/apr/ 이동 후 최신버전 URL 획득 후 wget 실행
ex) wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.5.4.tar.gz
Apache Install - 3. pcre
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 이동 후 최신버전 URL 획득 후 wget 실행
ex) wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
Apache Install - 4. apache
http://apache.tt.co.kr/httpd/ 이동 후 최신버전 URL 획득 후 wget 실행
ex) wget http://apache.tt.co.kr/httpd/httpd-2.4.18.tar.gz
________________
Apache Install - 5. Install
yum groupinstall 'Development Tools' 'Development Libraries'
tar -zxf apr-1.5.2.tar.gz
tar -zxf apr-util-1.5.4.tar.gz
tar -zxf pcre-8.38.tar.gz
tar -zxf httpd-2.4.18.tar.gz
apr Install
cd /usr/local/apr-1.5.2/
./configure --prefix=/usr/local/apr
make && make install
apr-util Install
cd /usr/local/apr-util-1.5.4/
./configure --prefix=/usr/local/aprutil --with-apr=/usr/local/apr/
make && make install
pcre Install
cd /usr/local/pcre-8.38/
./configure --prefix=/usr/local/pcre
make && make install
apache Install
cd /usr/local/httpd-2.4.18/
./configure --prefix=/usr/local/apache --enable-mods-shared=all --enable-so --enable-rewrite --enable-auth-digest --with-apr=/usr/local/apr --with-apr-util=/usr/local/aprutil/ --with-pcre=/usr/local/pcre
make && make install
________________
Apache Install - 6. Etc
방화벽 이슈로 설치가 안될 수도 있으므로 방화벽을 모두 내려 주거나
systemctl stop firewalld
포트 오픈을 해준다. (80번)
Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
라는 메세지가 나온다면
vi /usr/local/apache/conf/httpd.conf
servername 부분 주석을 풀고
ServerName localhost
:wq로빠져나온다.
로변경을 해준다.
vi /etc/hosts 에서
[root@TBU-01]
부분이 있는지 확인 한다.
없으면 추가하고 한칸 띄워 준다.
________________
Tomcat Install - 1. Download
톰캣 위치와 개수는 마음대로 지정하여도 된다.
여기서는 톰캣 위치를 클러스터링은 cd /usr/local/tomcat/
redis를 통한 클러스터링은 cd /usr/local/redis_tomcat/
으로 하겠으며, 각각명령어는
mkdir /usr/local/tomcat/
mkdir /usr/local/redis_tomcat/
cd /usr/local/tomcat/
http://tomcat.apache.org/ 이동 후 7버전 URL 획득 후 wget 실행
ex)
wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-7/v7.0.68/bin/apache-tomcat-7.0.68.tar.gz
받은 후 N개의 톰캣을 생성 하여 준다. (여기선 2개)
tar -zxf apache-tomcat-7.0.68.tar.gz
mv apache-tomcat-7.0.68 tomcat1
스크립트 생성(최하단 별첨 확인)
cd /usr/local/tomcat/ 하위에 생성
cd /usr/local/redis_tomcat/ 하위에 생성 하면 된다.
cd /usr/local/tomcat/
(스크립트생성 하부참조)
생성 후 권한부여
chmod 775 sh.apache sh.redisclean sh.tomcat
cp sh.apache ../redis_tomcat/
cp sh.redisclean ../redis_tomcat/
cd /usr/local/redis_tomcat/
( tomcat 스크립트생성 하부참조)
해서 redis용 tomcat 스크립트를 집어 넣는다.
chmod 775 sh.tomcat
cd /usr/local/tomcat/
* 필수 사항은 아니나 해주면 편하게 할 수 있다.
________________
Tomcat Install - 2. Setting
conf/server.xml
vi /usr/local/tomcat/tomcat1/conf/server.xml
1.Tomcat Port 변경
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
2. AJP Port 변경
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
3. Shutdown port변경
<Server port="8005" shutdown="SHUTDOWN">
빨간색 부분은 tomcat 마다 다르게 설정해 준다.
4. 유저생성
vi /usr/local/tomcat/tomcat1/conf/tomcat-users.xml
아래 구문 추가 (존재하면 하지 않아도 된다.)
<role rolename="manager-gui"/>
<user username="root" password="1234" roles="manager-gui"/>
roles는 유저의 권한을 의미한다.
tomcat을 실행 시킨다.
/usr/local/tomcat/tomcat1/bin/startup.sh
or
sh sh.tomcat 1 start
http://(ip):8080(protocol="HTTP/1.1" 에서 붉은색 글씨로 설정한 부분)/
접속 후 Manager App 버튼을 클릭합니다.
위에서 지정했던 root / 1234 를 입력합니다.
War file to deploy 밑의 파일 선택을 눌러 테스트 App을 업로드 시킨후
Deploy 버튼을 클릭합니다.
*부가적 세팅
vi /usr/local/tomcat/tomcat1/webapps/ROOT/index.jsp
<h1>${pageContext.servletContext.serverInfo}</h1>
검색 후
<h1>${pageContext.servletContext.serverInfo} - 1</h1>
과 같이 번호를 매긴다.(톰캣을 구분하기 위함)
하지 않으면 로그로 확인을 하면 된다.
redis 톰캣의 경우
<h1>${pageContext.servletContext.serverInfo} - redistomcat1</h1>
과 같이 해주면 구분하기 편하다.
화면에 deploy된 프로젝트가 보일 것입니다.
path 부분 밑 해당 하이퍼링크를 클릭하여 제대로 작동 하는지 확인 합니다.
cp -r tomcat1 tomcat2
tomcat2도 같은 방식(Tomcat Port 변경 부분 부터) 설정을 해줍니다.
톰캣을 모두 중지시킵니다.
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/shutdown.sh
or
sh sh.tomcat 1 stop
sh sh.tomcat 2 stop
redis tomcat 폴더로 복사
cp -r tomcat1 ../redis_tomcat/
cp -r tomcat2 ../redis_tomcat/
________________
Load Balnce -
Tomcat Connector Install
cd /usr/local/
http://apache.mirror.cdnetworks.com/tomcat/tomcat-connectors/jk/ 이동 후 최신버전 URL 획득 후 wget 실행
ex)
wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz
tar -zxf tomcat-connectors-1.2.41-src.tar.gz
압축해제
cd /usr/local/tomcat-connectors-1.2.41-src//native/
폴더이동
./configure --with-apxs=/usr/local/apache/bin/apxs
설정파일 셋팅
make && make install
컴파일
________________
Load Balnce -
Tomcat Connector Install Setting
cd /usr/local/apache/conf/
폴더이동
vi workers.properties
worker.list=worker1,worker2,balancer
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker2.port=8109
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
worker.balancer.type=lb
worker.balancer.balance_workers=worker1,worker2
빨간색 부분은 worker1 , worker2 등 변수명은 다른 것으로 해도
상관 없고, (해당 Apache에서만 쓰임)
파란색 부분은 위의 톰캣 셋팅에서 ajp 포트 수정한 부분이 있는데, 그부분의
port를 기입하여 주면 된다.
wq로 저장하고 빠져나온다.
vi mod-jk.conf
LoadModule jk_module modules/mod_jk.so <<해당 모듈 로드
<IfModule mod_jk.c>
JkWorkersFile /usr/local/apache/conf/workers.properties (절대경로)
JkLogFile /usr/local/apache/logs/mod_jk.log (절대경로)
JkMount /* balancer (workers.properties 안의 balancer 지정)
JkMount /*.jsp balancer (workers.properties 안의 balancer 지정)
JkMount /servlet/* balancer (workers.properties 안의 balancer 지정)
JkMount /examples/*.jsp balancer (workers.properties 안의 balancer 지정)
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
</IfModule>
아래는 실제 기입 코드
LoadModule jk_module modules/mod_jk.so
<IfModule mod_jk.c>
JkWorkersFile /usr/local/apache/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkMount /* balancer
JkMount /*.jsp balancer
JkMount /servlet/* balancer
JkMount /examples/*.jsp balancer
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
</IfModule>
wq로 저장하고 빠져나온다.
vi httpd.conf
최하단에
include conf/mod-jk.conf
문구 추가
TestFlow
1. Load Banlance
아파치 및 톰캣을 모두 실행 시킨다.
톰캣에 페이지를 생성 하여 번호를 매긴 후 하나씩 절체를 해보면,
톰캣이 교체가 된다. (성공 했을 경우 번호 바뀜)
________________
Session Clustering - Setting
해당 톰캣 폴더/conf/server.xml
vi /usr/local/tomcat/tomcat1/conf/server.xml
1. jvmRoute 될 고유 ID 지정
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker2">
빨간색 부분은 중복되지 않은 공유의 톰캣을 구분 할 수 있는 것으로 생각하면 된다
(아무거나 해도 된다.)
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
검색 하면 주석처리가 되어 있다.
그 밑에 아래 코드를 추가한다. (주석 밖)
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
위의 코드 안에서 빨간색 부분은 유의해야 하는데, auto라고 되어 있는 부분은
모든 설정을 마쳤으나 되지 않을 경우 해당 자기 ip로 입력을 하길 바랍니다.
4001이라고 되어 있는 부분은 모든 톰캣이 다른 값을 가지고 있어야 합니다.
세션클러스터링을 하기 위한 프로젝트의 WEB-INF/web.xml에서 다음 문구를 추가합니다.
<distributable/>
위의 문구 추가 후
톰캣을 재실행 합니다.
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh
(스크립트 사용법은 밑에 있으므로 앞으로는 생략)
tomcat2도 동일
java.net.UnknownHostException 에러가 날 경우
vi /etc/hosts
호스트네임을 추가 하고 저장한다.
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{127, 0, 0, 1}:4002,{127, 0, 0, 1},4002, alive=690083, securePort=-1, UDP Port=-1, id={-66 -96 -51 88 16 -75 67 -100 -88 92 -3 -116 -46 -20 76 -44 }, payload={}, command={}, domain={}, ]
해당 톰캣의 로그 중 해당 로그가 출력이 된다면 성공입니다.
참고) 운영 체제에서 multicat 설정이 안되어 있을 경우 위와 같이 안될 가능성이 있는데
해결방법은
shell>ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:1F:29:E7:ED:A4
inet6 addr: fe80::21f:29ff:fee7:eda4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:36157517 errors:0 dropped:0 overruns:0 frame:0
TX packets:18839 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3269828443 (3.0 GiB) TX bytes:1207502 (1.1 MiB)
Interrupt:169 Memory:f8000000-f8012100
3번째 줄의 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
같이 multicast 가 설정되어 있어야 하는데 없다를 확인 하면
shell> ifconfig eth0 multicast라고 설정해 주면 된다.
TestFlow
1. Session Clustering
설정 후 톰캣 재시작을 하여 모두 설정이 적용 되어 있다고 가정합니다.
특정 톰캣에서 세션 값을 설정 한 후 나머지 톰캣에서 같은 세션 ID을 불러
왔을 경우 모두 ID가 동일한지 확인합니다.
________________
Public Session - redis
redis 설치
cd /usr/share
wget http://download.redis.io/releases/redis-3.0.5.tar.gz
tar zxvf redis-3.0.5.tar.gz
mv redis-3.0.5 redis
cd redis
# 7.0
yum -y install epel-release
yum -y install varnish
yum -y install tcl
make
Redis Default 설정
vi redis.conf
daemonize yes << 데몬으로 실행
:wq로 빠져나옴
vi /etc/init.d/redis-server
파일 생성
아래 내용을 붙여넣기 한다.
#! /bin/sh
### BEGIN INIT INFO
# Provides: redis-server
# Description: redis-server - Persistent key-value db
# chkconfig: - 85 15
### END INIT INFO
REDISPORT=6379
EXEC=/usr/share/redis/src/redis-server
CLIEXEC="/usr/share/redis/src/redis-cli"
# exists password
if [ $2 ]
then
CLIEXEC="$CLIEXEC -a $2"
fi
PIDFILE=/var/run/redis.pid
CONF="/usr/share/redis/redis.conf"
start()
{
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
}
stop()
{
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
info)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
$CLIEXEC info
fi
;;
*)
echo "Usage: start|stop|restart [password]"
;;
esac
서비스 등록
chmod +x /etc/init.d/redis-server
chkconfig --add redis-server
chkconfig --level 2345 redis-server on
service redis-server start
테스트
/usr/share/redis/src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
REDIS 리스닝 확인
ss -nlp|grep redis
redis 설치 끝.
tomcat-redis-session-manager-1.2-tomcat-7.jar
commons-pool-1.6.jar
jedis 2.1.0
라이브러리가 필요한데,
cd /usr/local/redis_tomcat/
mkdir tmp
cd tmp
http://www.mvnrepository.com/
Jedis 검색 후 lib 다운 (2.1.0)
wget http://central.maven.org/maven2/redis/clients/jedis/2.1.0/jedis-2.1.0.jar
Commons Pool 검색 후 lib 다운 (1.6)
wget http://central.maven.org/maven2/commons-pool/commons-pool/1.6/commons-pool-1.6.jar
https://github.com/jcoleman/tomcat-redis-session-manager/downloads
tomcat-redis-session-manager-1.2-tomcat-7.jar 다운 (톰캣 7버전)
wget https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-7.jar
위에서 받은 라이브러리를 해당 Tomcat lib 폴더에 전부 포함 한다..
cp * ../tomcat1/lib/
cp * ../tomcat2/lib/
cd ..
rm -rf tmp
해당 톰캣 폴더/conf/context.xml
vi /usr/local/redis_tomcat/tomcat1/conf/context.xml
vi /usr/local/redis_tomcat/tomcat2/conf/context.xml
두 군데 전부 설정 해준다.
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="86400"/>
를 <Context> </Context> 안에 포함시켜준다.
추가 설정
root 계정으로 함을 기본으로 하며,
에러를 최대한 없앨 수 있도록 설정을 합니다.
vm 메모리 할당
vi /etc/sysctl.conf
최하단에
vm.overcommit_memory = 1
wq로 빠져 나온 후
sysctl vm.overcommit_memory=1
transparent_hugepage 프로세스 활성
* 대용량 페이지 쉽게 접근 가능
cat /sys/kernel/mm/transparent_hugepage/enabled
>>[always] madvise never
echo never > /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/enabled
>>always madvise [never]
부팅시에도 올라 올 수 있도록
vi /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
네트워크에서 최대 연결을 설정
sysctl -w net.core.somaxconn=65535
>>net.core.somaxconn = 65535
부팅시에도 올라 올 수 있도록
vi /etc/rc.local
sysctl -w net.core.somaxconn=65535
etc/security/limits.conf 설정 <최대파일 개수 및 기타 시큐리티 설정>
vi /etc/security/limits.conf
아래내용 입력
root soft nofile 65536
root hard nofile 65536
root soft nproc 131072
root hard nproc 131072
root 부분은 사용자 계정이므로 변경이 가능
maxmemory, lastsession처리, log 및 dump file 위치 설정
vi /usr/share/redis/redis.conf
로그 파일
logfile "" -> logfile "/var/log/redis/redis.log"
덤프 파일
dir ./ -> /var/redis_dump/
Redis 의 최대 가용 메모리 설정
maxmemory <bytes> 의 주석을 풀어주고
maxmemory 의 메모리를 설정 하여 준다.
ex) maxmemory 1024*1024*500
maxmemory-policy 검색 후 알맞게 방법을 변경 하여 준다.
설명은 해당 conf 파일 위에 써 있다.
maxmemory-policy volatile-lru
maxmemory-samples 검색 후 알맞게 방법을 변경 하여 준다.
maxmemory-samples 3
mkdir /var/log/redis/
mkdir /var/redis_dump/
서비스 시작
service redis-server start
서비스 중지
service redis-server stop
서비스 재시작
service redis-server restart
Apache Tomcat 서비스시작
TestFlow
1. Public Session Redis
설정 후 톰캣 재시작을 하여 모두 설정이 적용 되어 있다고 가정합니다.
특정 톰캣에서 세션 값을 설정 한 후 나머지 톰캣에서 같은 세션 값을 불러
왔을 경우 모두 값이 동일한지 확인합니다.
Redis에 세션 정보가 저장이 되므로, 톰캣을 전부 내렸다가 올려서
이전에 생성된 세션 아이디가 동일 한지 확인 합니다.
________________
sh.tomcat , sh.redisclean, sh.apache
이 항목의 경우는 테스트를 편하게 하기 위해서 작성하는 스크립트
sh.tomcat <세션 클러스터링 용>
사용법 : sh sh.tomcat <번호> [start,stop,restart,log]
ex) sh sh.tomcat 1 start
#!bin/bash
tomcat_url=/usr/local/tomcat/tomcat$1/bin
tomcat_log=/usr/local/tomcat/tomcat$1/logs
if [ $2 == 'start' ]
then
$tomcat_url/startup.sh
elif [ $2 == 'stop' ]
then
$tomcat_url/shutdown.sh
elif [ $2 == 'restart' ]
then
$tomcat_url/shutdown.sh
$tomcat_url/startup.sh
elif [ $2 == 'log' ]
then
tail -f $tomcat_log/catalina.out
fi
sh.tomcat <레디스 용>
사용법 : sh sh.tomcat <번호> [start,stop,restart,log]
사용법 : sh sh.tomcat [rm,rc,rl]
rm은 redis 내부 value 로그
rl은 access 로그
rc는 redis console 접근
#!bin/bash
tomcat_url=/usr/local/redis_tomcat/tomcat$1/bin
tomcat_log=/usr/local/redis_tomcat/tomcat$1/logs
if [ $1 == 'rm' ]
then
/usr/share/redis/src/redis-cli MONITOR
elif [ $1 == 'rc' ]
then
/usr/share/redis/src/redis-cli
elif [ $1 == 'rl' ]
then
tail -f /var/log/redis/redis.log
elif [ $2 == 'start' ]
then
$tomcat_url/startup.sh
elif [ $2 == 'stop' ]
then
$tomcat_url/shutdown.sh
elif [ $2 == 'restart' ]
then
$tomcat_url/shutdown.sh
$tomcat_url/startup.sh
elif [ $2 == 'log' ]
then
tail -f $tomcat_log/catalina.out
fi
sh.redisclean <레디스 dump,pid 삭제 및 시작>
사용법 : sh sh.redisclean
#!bin/bash
rm -rf /var/run/redis.pid
echo 'redis.pid clean'
rm -rf /var/redis_dump/*
echo 'dump clean'
service redis-server start
sh.apache
사용법 : sh sh.apache [start,stop,restart]
#!bin/bash
if [ $1 == 'start' ]
then
/usr/local/apache/bin/httpd -k start
echo 'apache start'
elif [ $1 == 'stop' ]
then
/usr/local/apache/bin/httpd -k stop
echo 'apache end'
elif [ $1 == 'restart' ]
then
/usr/local/apache/bin/httpd -k restart
echo 'apache restart'
fi