Rocky Linux - Apache tomcat 설치

    아파치 톰캣(Apache Tomcat)

    공식 홈페이지 : https://tomcat.apache.org/

    아파치 소프트웨어 재단에서 개발한 웹 애플리케이션 서버(Web Application Server)입니다. 우리나라에서는 약자인 WAS 서버라고 많이 얘기합니다. 톰캣은 자체 HTTP를 내장하여 웹서버로서도 이용이 가능하지만 WAS특성상 효율이 좋지 못하므로 거의 필수로 아파치(Apache)의 HTTP와 같은 웹(WEB) 서버와 연동하여 사용하게 됩니다. 검색을 좀 해보셨다면 흔히 WEB서버(정적인 페이지 처리), WAS 서버(동적인 페이지 처리)라는 말을 많이 들었을 텐데요. WEB서버는 정적인 의미 그대로 서버에 있는 데이터 정보를 요청에 따라 전달만 하면 되기 때문에 빠르고 구성이 간단하지만, 한정된 서비스에서만 이용이 가능합니다. 반면 동적인 서비스는 다양한 정보를 조합 및 연동(데이터베이스)하여 유동성이 있는 서비스 제공이 가능합니다. 다만, 사용량이 많거나 요청할 데이터가 많아지는 만큼 요청 속도가 느려질 수 있습니다. 그래서 대부분이 애플리케이션 개발 서버를 구축할 경우 WEB/WAS서버를 연동하여 같이 운영하게 됩니다.

    테스트 환경

    [root@localhost ~]# cat /etc/rocky-release
    Rocky Linux release 8.4 (Green Obsidian)

     

    [root@localhost ~]# dnf update  (개발서버로 이용할 경우 보안을 위해 미리 최신 패키지 업데이트 하기)

     

    [root@localhost ~]# cat /etc/selinux/config | grep SELINUX
    # SELINUX= can take one of these three values:
    SELINUX=disabled  (빠른 테스트를 위해 비활성화, OS 재시작 필요)

     

    ※ Apache tomcat을 실행하기 위해서는 필수적으로 OpenJDK 자바(JAVA) 플랫폼이 필수로 설치가 되어 있어야 하며, 록키 리눅스에는 기본 패키지에 설치가 되어 있습니다.

    [root@localhost ~]# java -version
    openjdk version "1.8.0_302"
    OpenJDK Runtime Environment (build 1.8.0_302-b08)
    OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)

     

    OpenJDK 공식 홈페이지 : https://openjdk.java.net/


    STEP01 → OpenJDK 설치

    ※ OpenJDK가 이미 설치되어 있거나 설치된 1.8 버전을 그대로 사용할 경우는 STEP02으로 바로 진행

    [root@localhost ~]# dnf list java*  (설치 가능한 패키지 확인)

     

    여기서는 최신 버전을 설치하도록 하겠습니다.

    [root@localhost ~]# dnf install java-11-openjdk.x86_64

     

     

    STEP02 → 자바(JAVA) 패키지가 2개 이상 설치 되어 있을 경우 변경 방법

    [root@localhost ~]# update-alternatives --config java

    2 개의 프로그램이 'java'를 제공합니다.

    선택    명령 (* 표시가 기본 사용 설정)

    -----------------------------------------------
    *+ 1     java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/jre/bin/java)
        2     java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.12.0.7-0.el8_4.x86_64/bin/java)
    현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오: 2 (2번 입력 후 엔터)

    [root@localhost ~]# java -version  (변경된 JAVA 확인)
    openjdk version "11.0.12" 2021-07-20 LTS
    OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)

     

    STEP03 → 보안을 위해 별도의 계정 및 그룹 만들기

    [root@localhost ~]# groupadd tomcat  (tomcat 그룹 만들기)

     

    [root@localhost ~]# mkdir /opt/tomcat  (apache tomcat을 설치할 폴더 미리 만들기)

     

    [root@localhost ~]# useradd -s /bin/nologin -g tomcat -d /opt/tomcat tomcat  (계정 생성 및 경로 지정)

    useradd: 경고: 홈디렉터리가 이미 있습니다.  (정상 메시지)
    skel 디렉터리에서 파일을 복사하지 않습니다.  (정상 메시지)

     

    [root@localhost ~]# cat /etc/passwd |grep tomcat  (계정 생성 및 경로 확인)
    tomcat:x:1000:1000::/opt/tomcat:/bin/nologin

     

    STEP04 → Apache tomcat 다운 및 압축 해제

    공식 홈페이지 : https://tomcat.apache.org/download-10.cgi

    Wget을 이용하여 서버에 다운(인터넷이 불가한 환경은 파일 받은 후 서버에 직접 SFTP 업로드)

    [root@localhost ~]# wget https://mirror.navercorp.com/apache/tomcat/tomcat-10/v10.0.10/bin/apache-tomcat-10.0.10.tar.gz

    ※ 미러 사이트는 인터넷 접속 환경에 따라 달라질 수 있으므로 꼭 사이트 링크 주소를 확인하시기 바랍니다.

     

    [root@localhost ~]# ll | grep tomcat  (다운 파일 확인)
    -rw-r--r--  1 root root 11865907  7월 30 06:08 apache-tomcat-10.0.10.tar.gz

    다음과 같이 명령어를 이용하면 MV(이동)명령어를 사용할 필요 없이 해당 경로에 바로 압축 해제

    [root@localhost ~]# tar -zxvf apache-tomcat-10.0.10.tar.gz -C /opt/tomcat --strip-components=1

     

    [root@localhost ~]# ls /opt/tomcat  (압축 해제 파일 확인)
    BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  temp  webapps  work

     

    STEP05 → 권한 설정

    [root@localhost ~]# chown -R tomcat: /opt/tomcat  (권한 변경)

     

    [root@localhost ~]# ls -al /opt/ | grep tomcat  (권한 변경 확인)
    drwxr-xr-x   9 tomcat tomcat 4096  8월 17 02:39 tomcat

    /bin 경로의 스크립트 실행하기 위한 권한 설정(+x)

    [root@localhost ~]# sh -c 'chmod +x /opt/tomcat/bin/*.sh'

     

    [root@localhost ~]# ls -al /opt/tomcat/bin | grep ".sh"  (변경 확인)

     

    STEP06 → 아파치 톰캣 실행 및 중지(테스트)

    [root@localhost ~]# /opt/tomcat/bin/startup.sh  (시작)
    Using CATALINA_BASE:   /opt/tomcat
    Using CATALINA_HOME:   /opt/tomcat
    Using CATALINA_TMPDIR: /opt/tomcat/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:
    Tomcat started.

    [root@localhost ~]# tail -f /opt/tomcat/logs/catalina.out  (카탈리나 실시간 로그 확인)

    17-Aug-2021 03:39:21.558 정보 [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
    17-Aug-2021 03:39:21.579 정보 [main] org.apache.catalina.startup.Catalina.start 서버가 [847] 밀리초 내에 시작되었습니다.  (마지막 메시지 정상 실행 패턴)

    [root@localhost ~]# ps -ef |grep tomcat  (프로세스 실행 확인)

    [root@localhost ~]# /opt/tomcat/bin/shutdown.sh  (중지)

    Using CATALINA_BASE:   /opt/tomcat
    Using CATALINA_HOME:   /opt/tomcat
    Using CATALINA_TMPDIR: /opt/tomcat/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
    Using CATALINA_OPTS:
    NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

     

    STEP07 → 웹 접속을 위한 방화벽 허용

    [root@localhost ~]# netstat -nlp  |grep java  (포트 확인)
    tcp6       0      0 127.0.0.1:8005               :::*               LISTEN      31770/java
    tcp6       0      0 :::8080 (톰캣 기본 포트)   :::*               LISTEN      31770/java

     

    [root@localhost ~]# firewall-cmd --zone=public --permanent --add-port=8080/tcp  (포트 허용 추가)
    success
    [root@localhost ~]# firewall-cmd --reload  (실시간 적용)
    success

    [root@localhost ~]# firewall-cmd --list-all | grep ports  (추가 확인)
      ports: 8080/tcp

     

     

    STEP08 → 웹 접속 확인

    본인 PC 브라우저 URL 입력 http://서버IP:8080


    추가 내용 → Apache tomcat 실행 파일 만들기

    일일이 유저 권한을 변경하여 톰캣을 실행하는 불편함을 없애기 위해 [tomcat.service] 등록하기

     

    ※ NANO 편집기를 이용

    [root@localhost ~]# dnf install nano -y  (패키지 없을 경우 설치)

     

    [root@localhost ~]# nano /etc/systemd/system/tomcat.service

    편집기 상태에서 아래 코드 복사 붙여 넣기

    [Unit]
    Description=Tomcat webs servlet container
    After=network.target

    [Service]
    Type=forking

    User=tomcat
    Group=tomcat

    Environment="JAVA_HOME=/usr/lib/jvm/jre"
    Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"

    Environment="CATALINA_BASE=/opt/tomcat"
    Environment="CATALINA_HOME=/opt/tomcat"
    Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
    Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

    ExecStart=/opt/tomcat/bin/startup.sh
    ExecStop=/opt/tomcat/bin/shutdown.sh

    [Install]
    WantedBy=multi-user.target

     

    붙여 넣기 한 후 [Ctrl+X] 저장, [Y] 입력 후 [Enter Key] ▼ 하단 스크린샷 참고

     

    예외 상황

    [root@localhost ~]# systemctl start tomcat  (systemctl 서비스 시작)
    Job for tomcat.service failed because the control process exited with error code.
    See "systemctl status tomcat.service" and "journalctl -xe" for details.  (시작 실패)

    [root@localhost ~]# systemctl status tomcat.service  (상태 확인)
    ● tomcat.service - Tomcat webs servlet container
       Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
       Active: failed (Result: exit-code) since Tue 2021-08-17 07:05:55 EDT; 2s ago
      Process: 32136 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=1/FAILURE)

     8월 17 07:05:55 localhost.localdomain systemd[1]: Starting Tomcat webs servlet container...
     8월 17 07:05:55 localhost.localdomain startup.sh[32136]: touch: cannot touch '/opt/tomcat/logs/catalina.out': 허가 거부  (실패 사유)

     

    원인 : 처음에 테스트로 ROOT 권한으로 실행하여 /logs 경로에 ROOT 권한으로 로그파일 생성, Service실행파일은 별도의 tomcat유저 권한으로 실행하려고 하다 보니 발생한 문제로 권한 수정하면 됩니다.

    [root@localhost ~]# chown -R tomcat: /opt/tomcat  (권한 수정)

     

    [root@localhost ~]# systemctl start(stop) tomcat  (systemctl 서비스 시작/중지)

     

    [root@localhost ~]# systemctl enable --now tomcat  (자동 시작 등록)

    Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /etc/systemd/system/tomcat.service.

    [root@localhost logs]# systemctl status tomcat  (구동 상태 확인)
    ● tomcat.service - Tomcat webs servlet container
       Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
       Active: active (running) since Tue 2021-08-17 07:29:32 EDT; 54s ago
     Main PID: 32184 (java)
        Tasks: 19 (limit: 11221)
       Memory: 135.7M
       CGroup: /system.slice/tomcat.service
               └─32184 /usr/lib/jvm/jre/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava>

     8월 17 07:29:32 localhost.localdomain systemd[1]: Starting Tomcat webs servlet container...
     8월 17 07:29:32 localhost.localdomain systemd[1]: Started Tomcat webs servlet container.

    [root@localhost logs]# ps -ef |grep tomcat  (프로세스 확인)

     

    마치며

    최근 JAVA로 개발된 솔루션을 많이 접하게 되어 Apache tomcat설치 방법을 알아보았습니다. 개발 관련은 전무하지만 어떻게 설치하고 실행하는지에 대한 흐름 정도는 알고 있으면 운영에 도움이 된다고 생각합니다. 다음에는 아파치 HTTP와 연동하여 처리하는 방법을 추가로 알아보도록 하겠습니다.

    Designed by JB FACTORY