우분투에 Open Java를 설치하여 사용하다가,

최근에 Oracle Java로 변경하였습니다.


Oracle Java를 요구하는 프로그램 때문에 강제이전을 실시하였는데요,

그에 대한 사이드 이펙트로-

그간 사용했던 온갖 프로그램이 제대로 동작하지 않게 되었습니다.

웹 앱 서버로 사용하던 tomcat도 동작을 안하더군요 :)


이번 포스팅은 Java 변경으로 인한 tomcat 살리기에 초점을 맞췄습니다.



개인적인 용도로 Web Application Server를 구동하고 있습니다.

정적인 파일교환은 Web Server이고,

동적인 데이터교환은 Web Application Server로 고착화되어 있는데요,

Tomcat은 Web Server + Web Application Server의 기능을 하기 때문에 애용하고 있습니다.

물론 대규모 서버에서는 Web Server와 Web Application Server를 분리하는게 일반적이겠지만요.


톰캣을 Web Server로 사용할 수 있느냐 없느냐에 대한 이야기는,

꽤나 흥미롭고도 재미있는 주제이지만 본 포스팅과 무관하므로 생략하겠습니다.


어쨌든 최근에 Oracle Java를 설치하였습니다.

(Oracle Java 설치는 이 포스팅을 참고하세요)

기존에는 Open Java를 설치하여 톰캣이 Open Java를 사용하도록 했었는데요,

Oracle Java로 완전히 돌아서기 위해 '별 생각없이' Open Java를 지워버렸습니다. :)

그리고 톰캣은 바로 운명하셨지요.


이 기회에 톰캣을 7에서 8로 업그레이드하기로 합니다.

최신 버전은 언제나 재미난 기능이 포함하지만, 그 이상으로 귀찮은 호환성 문제를 야기합니다.

톰캣8도 예외는 아닐테지만, 이번 만큼은 귀차니즘을 잠시 접어두죠.


$ sudo apt-get install tomcat8
[sudo] password for storycompiler:
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다      
상태 정보를 읽는 중입니다... 완료
다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
  libatk-wrapper-java libatk-wrapper-java-jni libgconf2-4 libgif4 libice-dev libpthread-stubs0-dev
  libsm-dev libx11-dev libx11-doc libxau-dev libxcb1-dev libxdmcp-dev libxt-dev python-dateutil
  python-deltarpm python-keyring python-secretstorage x11proto-core-dev x11proto-input-dev
  x11proto-kb-dev xorg-sgml-doctools xtrans-dev
Use 'apt-get autoremove' to remove them.
다음 패키지를 더 설치할 것입니다:
  libtomcat8-java tomcat8-common
제안하는 패키지:
  libtcnative-1 tomcat8-admin tomcat8-docs tomcat8-examples tomcat8-user
다음 새 패키지를 설치할 것입니다:
  libtomcat8-java tomcat8 tomcat8-common
0개 업그레이드, 3개 새로 설치, 0개 제거 및 1개 업그레이드 안 함.
4,680 k바이트 아카이브를 받아야 합니다.
이 작업 후 6,097 k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n] Y
받기:1 http://kr.archive.ubuntu.com/ubuntu/ vivid/universe libtomcat8-java all 8.0.14-1 [4,585 kB]
받기:2 http://kr.archive.ubuntu.com/ubuntu/ vivid/universe tomcat8-common all 8.0.14-1 [52.9 kB]
받기:3 http://kr.archive.ubuntu.com/ubuntu/ vivid/universe tomcat8 all 8.0.14-1 [42.0 kB]
내려받기 4,680 k바이트, 소요시간 0초 (4,945 k바이트/초)
패키지를 미리 설정하는 중입니다...
Selecting previously unselected package libtomcat8-java.
(데이터베이스 읽는중 ...현재 216547개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack .../libtomcat8-java_8.0.14-1_all.deb ...
Unpacking libtomcat8-java (8.0.14-1) ...
Selecting previously unselected package tomcat8-common.
Preparing to unpack .../tomcat8-common_8.0.14-1_all.deb ...
Unpacking tomcat8-common (8.0.14-1) ...
Selecting previously unselected package tomcat8.
Preparing to unpack .../tomcat8_8.0.14-1_all.deb ...
Unpacking tomcat8 (8.0.14-1) ...
Processing triggers for systemd (219-7ubuntu6) ...
Processing triggers for ureadahead (0.100.0-19) ...
ureadahead will be reprofiled on next reboot
libtomcat8-java (8.0.14-1) 설정하는 중입니다 ...
tomcat8-common (8.0.14-1) 설정하는 중입니다 ...
tomcat8 (8.0.14-1) 설정하는 중입니다 ...

Creating config file /etc/default/tomcat8 with new version
시스템 사용자 `tomcat8' (121) 추가 ...
새로운 사용자 `tomcat8' (121) 을(를) 그룹 `tomcat8'(으)로 추가 ...
홈 디렉토리 '/usr/share/tomcat8' 을(를) 만들지 않습니다.


톰캣8 설치를 완료하였습니다.

톰캣8를 바로 실행해보겠습니다.

$ sudo /etc/init.d/tomcat8 restart
[....] Restarting tomcat8 (via systemctl): tomcat8.serviceJob for tomcat8.service failed. See "systemctl status tomcat8.service" and "journalctl -xe" for details.
 failed!


실패하였습니다.

다행스럽게 systemctl이나 journalctl로 로그를 확인할 수 있습니다.

$ systemctl status tomcat8.service
   tomcat8.service - LSB: Start Tomcat.
   Loaded: loaded (/etc/init.d/tomcat8)
   Active: failed (Result: exit-code) since 토 2015-07-18 17:14:48 KST; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 31290 ExecStart=/etc/init.d/tomcat8 start (code=exited, status=1/FAILURE)
 7월 18 17:14:48 storycompiler systemd[1]: Starting LSB: Start Tomcat....
 7월 18 17:14:48 storycompiler tomcat8[31290]: * no JDK or JRE found - please set JAVA_HOME
 7월 18 17:14:48 storycompiler systemd[1]: tomcat8.service: control process exited, code=exited status=1
 7월 18 17:14:48 storycompiler systemd[1]: Failed to start LSB: Start Tomcat..
 7월 18 17:14:48 storycompiler systemd[1]: Unit tomcat8.service entered failed state.
 7월 18 17:14:48 storycompiler systemd[1]: tomcat8.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

원인이 바로 나오네요.

JAVA_HOME을 설정해놓으라고 합니다.

톰캣8의 JAVA_HOME은 톰캣8용 설정파일에 설정해둬야 합니다.

아래 파일(/etc/default/tomcat8)에서 굵은 글씨부분을 자신의 자바가 설치된 홈디렉토리로 설정해주세요.


$ cat /etc/default/tomcat8 
# Run Tomcat as this user ID. Not setting this or leaving it blank will use the
# default of tomcat8.
TOMCAT8_USER=tomcat8

# Run Tomcat as this group ID. Not setting this or leaving it blank will use
# the default of tomcat8.
TOMCAT8_GROUP=tomcat8

# The home directory of the Java development kit (JDK). You need at least
# JDK version 7. If JAVA_HOME is not set, some common directories for
# OpenJDK and the Oracle JDK are tried.
#JAVA_HOME=/usr/lib/jvm/java-7-openjdk
JAVA_HOME=/usr/lib/jvm/jre1.8.0

# You may pass JVM startup parameters to Java here. If unset, the default
# options will be: -Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC
#
# Use "-XX:+UseConcMarkSweepGC" to enable the CMS garbage collector (improved
# response time). If you use that option and you run Tomcat on a machine with
# exactly one CPU chip that contains one or two cores, you should also add
# the "-XX:+CMSIncrementalMode" option.
JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"

# To enable remote debugging uncomment the following line.
# You will then be able to use a java debugger on port 8000.
#JAVA_OPTS="${JAVA_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

# Java compiler to use for translating JavaServer Pages (JSPs). You can use all
# compilers that are accepted by Ant's build.compiler property.
#JSP_COMPILER=javac

# Use the Java security manager? (yes/no, default: no)
#TOMCAT8_SECURITY=no

# Number of days to keep logfiles in /var/log/tomcat8. Default is 14 days.
#LOGFILE_DAYS=14
# Whether to compress logfiles older than today's
#LOGFILE_COMPRESS=1

# Location of the JVM temporary directory
# WARNING: This directory will be destroyed and recreated at every startup !
#JVM_TMP=/tmp/tomcat8-temp

# If you run Tomcat on port numbers that are all higher than 1023, then you
# do not need authbind.  It is used for binding Tomcat to lower port numbers.
# (yes/no, default: no)
#AUTHBIND=no


그리고 톰캣8을 재시작합니다.

$ sudo /etc/init.d/tomcat8 restart
[ ok ] Restarting tomcat8 (via systemctl): tomcat8.service.


그러면 웹페이지가 제대로 나오게 됩니다.


tomcat 버전이 올라가면,

이전 tomcat 버전에 deploy 했던 프로그램을 이전해야 합니다.

여기서는 OpenGrok을 다시 deploy 해보겠습니다.


$ /var/opengrok/bin/OpenGrok deploy
Loading the default instance configuration ...

FATAL ERROR: Unable to determine Deployment Directory for  Tomcat - Aborting!


OpenGrok이 tomcat8을 못 찾네요.

/var/opengrok/bin/OpenGrok 스크립트를 열어서 tomcat8을 찾을 수 있게 수정합니다.

파일이 너무 길어서 수정한 파일은 아래 붙여놓았습니다(0.12.1 버전).

OpenGrok

/var/opengrok/bin에 갖다가 붙이시면 됩니다.

그리고 브라우저를 통해 OpenGrok에 접근해봅니다.

정상적으로 제대로 실행되는 것을 확인할 수 있습니다.


그럼 좋은 하루 보내세요~

끝_


* References

https://en.wikipedia.org/wiki/Application_server

http://www.resultantsys.com/index.php/general/what-is-a-web-application-server/

http://tomcat.apache.org/tomcat-8.0-doc/index.html

+ Recent posts