리눅스에 apache tomcat9 jdk yum 으로 설치 및 연동

Share

Last Updated on 1월 20, 2024 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 apache 와 tomcat 9 버전 그리고 jdk 를 yum(패키지 시스템) 으로 설치하는 내용에 대해서 확인해보도록 하겠습니다. 

내용 업데이트 : 2020/11/06
설치 진행 환경
 - OS: Centos 7.8
 - APACHE2.4.6 + TOMCAT9 + OpenJDK1.8

Tomcat은 바이너리 파일을 이용하며 그 외에는 yum 으로 패키지 설치를 진행하도록 하겠습니다

[참고] Ubuntu18.04 환경에 Nginx + Tomcat 9 설치 연동은 아래 포스팅을 참조하시면 됩니다.

          

Tomcat 연동 Connect 종류

Apache 와 Tomcat의 연동시 사용되는 connector 에는 mod_jserv, JK, JK2, mod_webapp, mod_proxy, mod_proxy_ajp 등이 있습니다.

자세한 내막은 알 수 없지만 jserv 와 mod_webapp 는 오래전부터 외면 받아온 것 같고 JK2 는 개발자들의 흥미 부족을 이유로 개발이 중단되었습니다.
 
그래서 지금 사용 가능한 방법은 3가지입니다.
mod_jk , mod_proxy , mod_proxy_ajp
 

보통 예전부터 많이 사용해온 방식은 mod_jk 이고 다른 방법은 mod_proxy를 사용하여 reverse proxy 로 사용하는 방법이 있으며,
그리고 mod_proxy_ajp 를 통해 ajp Protocol 을 reverse proxy 로 사용하는 방법 이렇게 3가지를 사용할 수 있습니다.


mod_jk는 별도의 모듈을 apache 에 추가하여 사용해야 하지만 mod_proxy 와 mod_proxy_ajp는 Apache의 기본 모듈인 mod_proxy.so, mod_proxy_http.so, mod_proxy_ajp.so 을 사용하게 됩니다.

mod_proxy 와 mod_proxy_ajp 는 reverse proxy 로써 ProxyPassMatch, ProxyPassReverse,  ProxyPass 를 사용하여 Backend 와 통신하게 됩니다.


ajp 프로토콜 사용시
ProxyPassMatch ^/(.*\.jsp)$ ajp://localhost:8009/$1
  * proxy 를 사용하더라도 ajp 를 사용함으로 tomcat 에서 ajp 포트를 오픈 해야 합니다.

mod_proxy - http사용시
ProxyPassMatch ^/(.*\.jsp)$ http://localhost:15359/$1
  * tomcat 에서 ajp 포트를 오픈 하지 않아도 됩니다.

mod_jk , mod_proxy, mod_proxy_ajp 3가지 연동 방식 모두 설명하도록 하겠습니다.

* 모든 작업은 root 로 진행하였습니다. 
       

Apache 설치

[root]# yum -y install epel-release
[root]# yum clean all

[root]# yum -y install httpd httpd-devel \
apr apr-util apr-devel
 apr-util-devel \
gcc gcc-c++ pcre-devel apr-util-openssl \
apr-util libnghttp2 libnghttp2-devel \
expat-devel libxml2-devel
          

Tomcat Connect 설치(Mod_JK)

[참고] mod_proxy /mod_proxy_ajp 사용하여 Tomcat 과 연결 내용은 아래쪽에 있습니다
mod_proxy /mod_proxy_ajp 사용하시려면 Mod_JK 설치는 생략하여도 됩니다.

Tomcat Connect 는 바이너리 된 버전은 최신 버전은 없어서 Compile 해서 사용할 것입니다.

[root]# wget http://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz

[root]# tar zxvf tomcat-connectors-1.2.48-src.tar.gz

[root]# cd tomcat-connectors-1.2.48-src/native


압축을 푼 폴더 아래 native 폴더로 이동해서 ./buildconf.sh 를 실행합니다.

[root]# cd tomcat-connectors-1.2.48-src/native

[root]# ./buildconf.sh


설치를 계속 진행합니다.

[root]# ./configure --with-apxs=/usr/bin/apxs

[root]# make && make install


build가 완료되었다면 apache의 module 디렉토리에 mod_jk.so 파일이 있는지 확인합니다.

[root]# ls -al /usr/lib64/httpd/modules/mod_jk.so
-rwxr-xr-x. 1 root root 1565872 Oct 5 03:08 /usr/lib64/httpd/modules/mod_jk.so

       

Tomcat Native 설치

Tomcat Native 는 패키지 설치 방법(yum or rpm, deb) 과 Source Code 를 이용하여 컴파일 하는 방식, 2가지가 있습니다.

포스팅에서는 yum(패키지) 으로 설치를 진행하도록 하겠습니다.

[root]# yum -y install tomcat-native

yum 으로 설치시 경로는 /usr/lib64/ 디렉토리에 라이브러리가 위치하게 됩니다.


[root]# rpm -ql tomcat-native-1.2.23-1.el7.x86_64
/usr/lib64/libtcnative-1.so
/usr/lib64/libtcnative-1.so.0
/usr/lib64/libtcnative-1.so.0.2.23
< ... 중략 ... >

*  패키지명(버전)은 다를 수 있습니다.
       

Java JDK 설치

JDK는 개발된 어플리케이션이나 Tomcat 버전에 따라서 사용하면 됩니다.

Tomcat9 버전을 설치할 것임으로 저는 1.8 을 설치하도록 하겠습니다.


Tomcat 버전 별 Java 버전은 아래 링크를 확인 해보시면 됩니다.


# Apache Tomcat Versions Match Java Version


# 1.6
[root]# yum -y install java-1.6.0-openjdk java-1.6.0-openjdk-devel

# 1.7
[root]# yum -y install java-1.7.0-openjdk java-1.7.0-openjdk-devel

# 1.8
[root]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

# 11
[root]# yum -y install java-11-openjdk java-11-openjdk-devel


[root]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)


환경변수 추가

[root]# vi .bash_profile

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64

export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin


환경변수 적용

[root]# source .bash_profile
       

Tomcat 설치

유저 생성
[root]# groupadd tomcat
[root]# useradd -g tomcat -s /sbin/nologin tomcat


Tomcat 버전은 사용하고자 하는 버전을 선택하시면 됩니다.

Tomcat 9 버전 다운로드(JDK 1.8이상 )
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.zip


Tomcat 8 버전 다운로드
https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.58/bin/apache-tomcat-8.5.58.zip


포스팅에서는 9버전을 설치하였습니다.

[root]# cd /usr/local

[root]# wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.zip

[root]# unzip apache-tomcat-9.0.38.zip



심볼릭 링크 설정
[root]# cd /usr/local/
[root]# ln -s apache-tomcat-9.0.38 tomcat
-> 심볼릭 링크는 경로의 단일화를 위해 한 것으로 필수는 아닙니다
-> 심볼릭 링크 대신 mv 로 직접 디렉토리 명을 변경하여도 됩니다.


Ownership 변경과 파일의 실행 권한 부여
[root]# cd /usr/local/
[root]# chown -R tomcat:tomcat apache-tomcat-9.0.38


[root]# cd /usr/local/tomcat/bin
[root]# chmod 755 *.sh
          

Mod_JK 설정

[참고] mod_proxy /mod_proxy_ajp 사용하여 Tomcat 과 연결하여 사용하시려면 mod_jk 설정 과정은 생략하여도 됩니다.

mod_proxy /mod_proxy_ajp  연결은 아래쪽에 내용이 있습니다


먼저 기본 설정 파일인 httpd.conf 파일내에 Include 문이 있는지 확인합니다.

[root]# grep -i "Include" httpd.conf | grep -v "#"
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf

없다면 없는 문장을 httpd.conf 에 추가해 줍니다.


1. mod_jk.conf 파일 생성 및 내용 입력


[root]# vi /etc/httpd/conf.d/mod_jk.conf

     -> mod_jk.conf 을 생성하면서 내용 추가


LoadModule jk_module modules/mod_jk.so

<IfModule mod_jk.c>
JkWorkersFile conf.d/workers.properties
JkMountFile conf.d/jkmount.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
   # The mod_jk log level, can be debug, info, warn error or trace.
   # The default value is info.

JkShmFile run/mod_jk.shm
JkLogLevel error
JkLogStampFormat "[%y %m %d %H:%M:%S]"
    # <== 로그 포맷에 사용할 시간 형식을 지정

</IfModule>



2. workers.properties 파일 생성

[root]# vi /etc/httpd/conf.d/workers.properties
   --> 파일이 없다면 workers.properties 파일을 생성하면서 내용 입력


workers.tomcat_home=/usr/local/tomcat

workers.java_home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64

worker.list=worker1

worker.worker1.port=8009

worker.worker1.host=127.0.0.1
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
worker.worker1.connect_timeout=10000
worker.worker1.retries=2
worker.worker1.retry_interval=1


3. jkmount.properties 파일 생성

[root]# vi /etc/httpd/conf.d/jkmount.properties
   --> jkmount.properties 파일을 생성하면서 내용 입력

JkMount /*.jsp worker1
JkMount /*.do worker1
JkMount /*.json worker1
JkMount /*.xml worker1
JkMount /servlet/* worker1
JkMount /manager/* worker1
JkMount /ROOT/* worker1
JkMount /host-manager/* worker1

[참고]workers.properties안의  worker1 은 식별자입니다.
다른 식별자, worker2, ajp-worker 등 아이피 와 포트를 달리하여 더 추가할 수 있습니다.

Tomcat 을 여러 대 사용하거나 웹 호스팅 과 같은 환경에서 사용할 수 있습니다.

호스팅 과 같은 환경에서 유저별로 Tomcat을 사용 하는 등 여러가지 목적으로 사용할 수 있습니다


이렇게 파일을 생성하면 Incude 문에 의해 생성한 mod_jk.conf 파일은 apache 가 기동 되거나 reload 되면서 적용되게 됩니다.

-->  IncludeOptional conf.d/*.conf
          

Apache 설정 변경

MPM 방식으로 변경

[root]# vi /etc/httpd/conf.modules.d/00-mpm.conf

# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-> 주석으로 변경

LoadModule mpm_event_module modules/mod_mpm_event.so

-> 주석해제


httpd.conf 파일 수정 

[root]# vi /etc/httpd/conf/httpd.conf

ServerName www.example.com:80
-> 주석 해제


<IfModule dir_module>
DirectoryIndex index.jsp index.html

</IfModule>
    ---> index.jsp 추가


[참고]Virtual Host 를 사용 할 경우
아래와 같이 virtuahost 내에 jkmount.properties 파일을 include 해서 사용하면 됩니다.


<VirtualHost *:80>
ServerAdmin admin@h2code.cf
DocumentRoot "/var/www/html/webapps/ROOT"
ServerName wp.h2code.cf
ServerAlias wp.h2code.cf
ErrorLog "logs/wp.h2code.cf-error_log"
CustomLog "logs/wp.h2code.cf-access_log" combined
loglevel notice

<Directory "/var/www/html/webapps/ROOT">
AllowOverride ALL
Options MultiViews FollowSymLinks
DirectoryIndex index.jsp index.html index.htm
<RequireAll>
Require all granted
</RequireAll>
</Directory>

IncludeOptional conf.d/jkmount.properties

</VirtualHost>


Virtualhost 에 대한 추가 내용은 아래 포스팅을 참조하시면 됩니다.

              

Tomcat 설정

server.xml 수정
[root]# vi /usr/local/tomcat/conf/server.xml

* 아래 8080 포트의 주석처리는 선택 사항입니다.
* ajp 를 사용하여 8009를 사용할 때에는 8080 포트는 disable 로 설정하기도 합니다.
* 주석 처리는 선택 사항이며 mod_proxy 테스트를 위해 일단은 주석처리는 하지 않겠습니다.


<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />


AJP 수정
 - 아래는 Default 로 설정된 내역이며 주석으로 되어 있습니다.
 - 이 부분은 그대로 두시고 아래쪽에 별도로 다시 내용을 추가하도록 하겠습니다.

<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->


아래와 내용으로 AJP 내용을 추가 하도록 하겠습니다.

<Connector address="0.0.0.0" port="8009" maxHttpHeaderSize="8192" tomcatAuthentication="false"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" secretRequired="false"
enableLookups="false" acceptCount="100" redirectPort="8443"
connectionTimeout="20000" disableUploadTimeout="true" protocol="AJP/1.3" />


address 절은 "(쌍따옴표) 가 필요하며 apache와 서버를 분리하여 별도로 사용하려고 할 때는
외부에서 접속이 가능하도록 address 절에 ip 나 0.0.0.0 으로 입력하면 됩니다.
           

Tomcat 서비스 설정

1. 파일생성

[root]# vi /usr/lib/systemd/system/tomcat.service


2. 내용 입력


[Unit]

Description=tomcat
After=network.target syslog.target


[Service]
Type=forking
Environment="CATALINA_HOME=/usr/local/tomcat"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

[참고] tomcat.service 에서 User 와 Group 은 지정한 일반 OS 유저로 Tomcat 을 구동 하기 위해서의 설정입니다.


3. 서비스 활성화


[root]# systemctl daemon-reload

[root]# systemctl enable tomcat


## htdocs 경로 변경
[root]# mv /var/www/html /var/www/html.ori
[root]# ln -s /usr/local/tomcat/webapps/ROOT /var/www/html


4. Tomcat 기동

톰켓을 기동하기 전에 apache를 재기동 혹은 reload 합니다.

[root]# systemctl stop httpd
[root]# systemctl start httpd

Tomcat 기동

[root]# systemctl start tomcat


5. 방화벽 오픈

# 80 포트 추가

firewall-cmd --permanent --add-port=80/tcp

# 80 포트 삭제
firewall-cmd --permanent --remove-port=80/tcp

# 정책 재반영 및 확인
firewall-cmd --reload;firewall-cmd --list-all


접속 후 웹페이지가 정상적으로 표시되는지 확인합니다.


            

Tomcat Library 및 Connector 확인

위에서 설치를 진행하는 과정에서 yum 으로 Tomcat Natitve 를 설치하였습니다.
설치를 한 이유는 Java Connector 종류가 아래처럼 있고 미 설치시 APR Warning이 발생하기 때문에 위에서 설치를 진행했었습니다.

Tomcat 사용할 수 있는 HTTP Connector는 9.0, 10.0 기준 3개로 기재되어 있습니다.




Tomcat 사용할 수 있는 AJP Connector 도 9.0, 10.0 기준 3개로 사이트 에서는 확인됩니다.


HTTP/AJP 둘 다 Library 미설치시 BIO 가 기본으로 동작하는 걸 로그상에서 확인할 수 있습니다.




8.0 까지의 문서에서는 아래와 같이 4개로 표기되었습니다.


          


정리하면 Native Library를 이용한 APR 방식이 성능에 더 좋다고 알려져 있습니다

그리고 Native Library 미설치시 아래와 같은 warning 메세지도 Tomcat 기동시 마다 확인되게 됩니다

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:


warning 메세지를 정리하고 추가적인 개선을 위해 Tomcat Native 를 설치 및 catalina.sh 에 설정이 완료된 상태입니다.



Tomcat 이 기동된 후 catalina.out 로그를 통해서 현재 Tomcat이 기동 된 Connector Library 를 확인해봐야 합니다


[root]# cd /usr/local/tomcat/logs
[root]# grep -ai Native catalina.out

Loaded Apache Tomcat Native library [1.2.23] using APR version [1.7.0]
-> 설치한 1.2.23 버전이 정상적으로 load 됨이 확인됩니다.


Tomcat Library 가 정상적으로 load 되었음에도 아래처럼 NIO Connector로 구동 되는 경우가 있을 수 있습니다.

Tomcat Library 인식되었으면 보통 자동적으로 APR Connector 로 동작을 하게 되지만 그렇지 않을 경우도 있긴 합니다


[root]# cd /usr/local/tomcat/logs
[root]# grep -ai http catalina.out
Starting ProtocolHandler ["http-nio-8080"]


[root]# grep -ai ajp catalina.out
Starting ProtocolHandler ["ajp-nio-0:0:0:0:0:0:0:1-8009"]


이럴 때는 server.xml 에 명시적으로 apr를 기록해주면 사용할 수 있습니다.

위에서 설정한 8008 / 8009 ajp 포트에 대해서 아래 처럼 protocol 을 수정하면 됩니다.

[root]# cd /usr/local/tomcat/conf
[root]# vi server.xml


<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />


<Connector address="0.0.0.0" port="8009" maxHttpHeaderSize="8192" tomcatAuthentication="false"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" secretRequired="false"
enableLookups="false" acceptCount="100" redirectPort="8443"
connectionTimeout="20000" disableUploadTimeout="true"
protocol="org.apache.coyote.ajp.AjpAprProtocol"  />


http 와 ajp 를 모두 수정하였다면 tomcat 을 재시작 합니다.
[root]# systemctl restart tomcat



로그 확인

[root]# cd /usr/local/tomcat/logs
[root]# grep -ai http catalina.out
Starting ProtocolHandler ["http-apr-8080"]


[root]# grep -ai ajp catalina.out
Starting ProtocolHandler ["ajp-apr-0:0:0:0:0:0:0:1-8009"]

--> 2개 모두 apr 로 동작 되는 것을 확인할 수 있습니다.
             

mod_proxy / mod_proxy_ajp 사용

위에서 Apache 와 Tomcat이 정상적으로 연결된 환경에서 proxy 사용을 설명하겠습니다.

virtualhost 에 대한 추가 내용은 아래 포스팅을 참조해보시면 됩니다.


mod_proxy 와 mod_proxy_ajp 차이는 

- 접속을 http(8080) 포트로 할 것인지
- 톰켓의 ajp(8009) 프로토콜 포트로 접속할 지의

차이 입니다.




설정 파일 2개를 만들겠습니다.

[root]# cd /etc/httpd/conf.d


[root]# vi mod_proxy_tomcat.properties

# 내용을 아래와 같이 생성하겠습니다.

RewriteEngine on
ProxyErrorOverride on
Timeout 600
ProxyTimeout 600
ProxyRequests Off
ProxyPreserveHost On

ProxyPass /article/ http://localhost:8080/article/
ProxyPass /servlet/ http://localhost:8080/servlet/
ProxyPass /alice-upload/ http://localhost:8080/alice-upload/
ProxyPass /uploadManager/ http://localhost:8080/uploadManager/
ProxyPass /downManager/ http://localhost:8080/downManager/
ProxyPassMatch ^/.*\.(jsp|do)$ http://localhost:8080



[root]# vi mod_proxy_ajp.properties

# 내용을 아래와 같이 생성 하겠습니다.

RewriteEngine on
ProxyErrorOverride on
Timeout 600
ProxyTimeout 600
ProxyRequests Off
ProxyPreserveHost On

ProxyPass /article/ ajp://localhost:8009/article/
ProxyPass /servlet/ ajp://localhost:8009/servlet/
ProxyPass /alice-upload/ ajp://localhost:8009/alice-upload/
ProxyPass /uploadManager/ ajp://localhost:8009/uploadManager/
ProxyPass /downManager/ ajp://localhost:8009/downManager/
ProxyPassMatch ^/.*\.(jsp|do)$ ajp://localhost:8009/



# virtualhost 내에서 include 하여 사용

<VirtualHost *:80>
ServerAdmin admin@h2code.cf
DocumentRoot "/var/www/html/webapps/ROOT"
ServerName wp.h2code.cf
ServerAlias wp.h2code.cf
ErrorLog "logs/wp.h2code.cf-error_log"
CustomLog "logs/wp.h2code.cf-access_log" combined
loglevel notice

<Directory "/var/www/html/webapps/ROOT">
AllowOverride ALL
Options MultiViews FollowSymLinks
DirectoryIndex index.jsp index.html index.htm
<RequireAll>
Require all granted
</RequireAll>
</Directory>

#IncludeOptional conf.d/jkmount.properties

#IncludeOptional conf.d/mod_proxy_ajp.properties

IncludeOptional conf.d/mod_proxy_tomcat.properties


</VirtualHost>

IncludeOptional 을 통해 별도로 생성해둔 properties 파일을 교체하면서 사용하시면 됩니다.
mod_proxy(http) 로 tomcat 과 연결하기 위해서는 8080 포트가 오픈이 되어있어야 합니다.



[참조] virtualhost 를 사용하지 않을 경우

<Directory "/var/www/html">  <-- 위에 ajp/proxy 의 properties 파일을 include 하면 됩니다.


예시)

IncludeOptional conf.d/mod_proxy_ajp.properties    <====
# Further relax access to the default document root:
<Directory "/var/www/html">

or

IncludeOptional conf.d/mod_proxy_tomcat.properties    <====

# Further relax access to the default document root:
<Directory "/var/www/html">




연관된 다른 글

Apache 에 무료 SSL 발급 설정 및 HTTP/2 적용

MySQL 5.7 설치

무료 도메인 발급 사용하기 - freenom.com

CentOS 에 Yum으로 Apache+PHP-FPM+MySQL 설치 및 연동 설정

CentOS 8 지원 종료 및 정책 변경 안내 새로운 Rocky Linux 안내



7
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x