2018년 7월 6일 금요일

(AWS) Amazon Linux 2에 Tomcat 9 설치하기

 이전 포스팅에서 yum을 이용한 Tomcat 설치에 대한 얘기를 했으나 yum으로 배포되는 Tomcat의 버전이 7.x 인지라 최신 버전을 이용해야 하는 개발자에게는 별로 도움이 되지 못한다. 그래서 이번에는 yum을 이용하지 않고 직접 Tomcat 사이트에서 배포하는 최신 Tomcat 9.x 버전으로 설치하는 방법을 설명해 보려고 한다.

 참고로 Amazon Linux 2는 CentOS를 기반으로 만들어졌기 때문에 아래 내용은 CentOS 7에서도 잘 동작하는 것으로 확인되었다.

 당연히 Tomcat 9도 JDK가 설치되어 있어야 한다. 혹시 설치되지 않은 상태라면 이전 글을 참고하여 JDK 1.8 이상을 먼저 설치하도록 하자.

 먼저 Tomcat 9 공식 배포 사이트에 접속하여 Tomcat 9.x 버전을 다운로드하도록 한다.


 여기서는 AWS의 Amazon Linux 2에 설치할 것이므로 tar.gz 으로 배포하는 버전을 받으면 된다. 다운받은 파일은 아래 명령으로 EC2 인스턴스에 복사한 후 EC2 인스턴스에 접속하도록 하자.

$ scp -i aws_keypair.pem apache-tomcat-9.0.xx.tar.gz ec2-user@{Public IP}:~/
$ ssh -i aws_keypair.pem ec2-user@{Public IP}

 접속을 하고나면 홈 폴더에는 방금 복사해넣은 Tomcat 배포 파일이 있다. 이 파일을 압축을 풀고 /opt/server/ 밑에 설치하도록 한다. 그리고나서 opt 폴더 아래 tomcat이라는 심볼릭 링크를 하나 만들어 놓도록 하자.

$ sudo mkdir /opt/server
$ sudo tar xvfz apache-tomcat-9.0.xx.tar.gz -C /opt/server/
$ cd /opt
$ sudo ln -s /opt/server/apache-tomcat-9.0.xx/ tomcat

 이제 파일의 복사 작업은 끝이 났으므로 홈 폴더에 있는 원본 tar.gz 파일은 삭제해도 상관없다. 이제 설치된 파일들의 권한 설정을 해주어야 한다.

 일반적으로 Tomcat의 실행 및 종료는 root 계정으로 하지 않는다. tomcat 계정을 만들어서 이 계정으로 Tomcat이 실행되도록 하는 게 일반적이다. root를 사용하는 것 보다는 tomcat 계정을 만들어서 사용하는 게 보안에 훨씬 도움이 되기 때문이다.

 그럼 tomcat 계정을 만들어보도록 하자. 아래 명령으로 tomcat 계정을 만든다.

$ sudo groupadd tomcat
$ sudo useradd -M -s /bin/nologin -g tomcat -d /opt/tomcat tomcat 

 간단히 설명을 하자면 먼저 tomcat 그룹을 만들고 그 다음 tomcat 사용자를 하나 만든다. 이 tomcat 계정은 로그인을 할 수 없으며 tomcat 그룹에 포함되고 /opt/tomcat 을 홈 폴더로 지정하고 있다. tomcat 계정으로 직접 로그인할 일은 없으므로 이렇게 만든다.

 만약 필요에 의하여 tomcat의 홈 폴더가 (로그 기록 등을 위해) 필요하다면 아래와 같이 -M -d 옵션은 빼고 실행하도록 하자.

$ sudo groupadd tomcat
$ sudo useradd -s /bin/nologin -g tomcat tomcat 

 이제 tomcat 계정이 준비되었다. 하지만 이렇게 하면 현재 로그인 가능한 계정으로는 tomcat에 폴더를 들어가서 뭔가를 확인할 수 없는 계정이 된다. 따라서 현재 로그인한 계정도 tomcat 폴더에 들어가서 로그 등을 확인할 수 있게 하려면 이 계정을 tomcat 그룹에 넣어주고 tomcat 그룹에 읽기 권한을 부여해주면 된다. 현재 계정이 centos라면 아래 명령으로 centos 계정을 tomcat 그룹에 추가해주도록 하자.

$ sudo usermod -aG tomcat centos

 이제 tomcat 계정이 준비되었으므로 전에 설치한 tomcat 폴더로 이동하여 권한 설정을 하도록 하겠다. 최초 권한은 소유자가 root로 되어있으므로 tomcat 계정으로 접근이 가능하도록 권한 설정을 다시 해주어야 한다.

$ cd /opt/tomcat

$ sudo chgrp -R tomcat /opt/tomcat/
$ sudo chown -R tomcat /opt/tomcat/

$ sudo find . -type d -exec chmod 750 {} +
$ sudo find . -type f -exec chmod 640 {} +

$ sudo chmod 750 bin/*.sh

 이제 위 작업에 대해서 간단히 설명하자면 설치된 Tomcat 파일들의 소유 그룹을 tomcat 그룹으로 설정하고 소유자를 tomcat 으로 변경한 다음 파일과 폴더의 권한을 다시 설정하는 작업이다. tomcat 그룹과 tomcat 계정 말고 다른 사용자는 접근할 수 없도록 750, 640으로 설정하고 있다. 마지막 명령은 bin 폴더에 있는 shell script 들이 실행될 수 있게 실행 권한을 부여하는 것이다.

 다음은 Tomcat을 서비스로 시작 & 종료할 수 있도록 시스템에 등록하는 작업을 할 차례이다. 아래 명령을 수행하여 /etc/systemd/system 폴더로 이동한 후 tomcat.service 파일을 만들고 그 아래 내용을 넣도록 하자.

$ cd /etc/systemd/system
$ sudo vi tomcat.service

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

 위 내용 중 각종 경로의 값은 자신의 상태에 맞게 바꾸면 된다. 하지만 경로들은 대부분 일치할 것이고 CATALINA_OPTS의 값을 바꾸는 일이 생길지도 모르겠다. 원하는 값으로 바꾸면 된다.

 그런데 최근에 여기서 한 가지 문제가 발견되었다. Tomcat 9.0.13 까지는 이 방법으로 시작 & 종료가 잘 동작하는데 9.0.14 버전이 동작하지 않는다. 이렇게 설정을 하고 시작을 시켜보면 조용하게 실패해버린다. Tomcat쪽에는 아무런 로그도 없이 실패해버려서 어떻게 해 볼 수가 없었다. 이 글을 수정하는 시점에서는 한 달도 안된 버전이라 뭐가 잘못된 건지 정보도 없어서 더 이상 어떻게 해 볼 수가 없었다. (혹시 이 문제에 대해서 아시는 분은 댓글 남겨주시면 대단히 감사하겠습니다.)

 이제 아래 명령으로 tomcat을 실행 & 종료할 수 있다.

# Tomcat 시작
$ sudo service tomcat start 

# Tomcat 종료
$ sudo service tomcat stop

# Tomcat 재시작
$ sudo service tomcat restart

# 부팅 시 Tomcat 자동 실행
$ sudo systemctl enable tomcat

 이제 Tomcat을 시작시키고 브라우저를 띄워서 주소창에 EC2 인스턴스의 Public IP와 포트 8080으로 접속해 보도록 하자. 아래와 같이 테스트 페이지가 뜬다면 일단 성공적으로 설치가 된 것이다.


 위 페이지에서 "Manager App"이나 "Host Manager" 등의 기능을 이용하고 싶다면 이전 포스팅에서 설명한 것처럼 계정을 추가하고 약간의 설정을 더 해주어야 한다.

 Tomcat 9도 마찬가지로 Manager App을 사용하려면 사용자 계정을 등록해 주어야 한다. 기본 설치 상태에서는 계정이 하나도 등록되어있지 않기 때문에 먼저 계정을 등록해 주도록 하자. /opt/tomcat/conf/tomcat-users.xml 파일을 열어서 아래와 같이 계정을 추가한다. username과 password는 원하는 값으로 바꿔주면 된다.

<tomcat-users ... >
...
  <role rolename="manager-gui"/>
  <role rolename="admin-gui"/>
  <user username="admin" password="mypassword" roles="admin-gui,manager-gui"/>
</tomcat-users>

 이제 사용자 등록은 되었으나 그래도 403 에러를 내면서 접속이 되지 않을 것이다. Tomcat 7과 달리 Tomcat 9에서는 localhost에서만 Manager App에 접근할 수 있도록 설정되어있기 때문에 다른 장비에서 접속을 시도하면 접속이 되지 않는다. 이것을 해제하기 위해서는 각 webapp의 META-INF 폴더 안에 있는 context.xml 파일을 수정해주어야 한다. webapps/manager 폴더와 webapps/host-manager 폴더 안에있는 META-INF/context.xml 파일을 열어서 아래와 같이 주석처리를 해주면 다른 장비에서 접속이 가능해진다.

...
<Context antiResourceLocking="false" privileged="true" >
  <!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

 수정이 끝났으면 Tomcat을 재시작하고 아까 등록한 계정으로 Manager App에 접속해보자. 이제 접속이 될 것이다. 접속이 안된다면 보안 그룹(방화벽) 설정이 제대로 되어 있는지 체크해 보도록 하자.

 Tomcat 설치 작업은 이제 끝이다. 지금부터는 자신이 원하는 환경이 되도록 conf/server.xml 파일 등을 수정해서 사용하면 된다.


0 개의 댓글:

댓글 쓰기