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

Last Updated on 12월 17, 2020 by 태랑(정현호)



2020/11/06 내용 업데이트


@ 설치 진행 환경
OS: Centos 7.8 
APACHE2.4.6 + TOMCAT9 + OpenJDK1.8

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



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









Apache 와 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 해서 사용할 것입니다.


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 설치



[root]# yum -y install tomcat-native








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 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

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 에 추가해 줍니다.





# Mod_JK 설정

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





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




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

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





## Tomcat 기동

[root]# systemctl start tomcat








## 방화벽 오픈

# 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 사용하여 Tomcat 과 연결



위에서 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 안내



“리눅스에 apache tomcat9 jdk yum 으로 설치 및 연동” 에 대한 2 댓글

  1. 핑백: yum(rpm)으로 APM연동 + Zend optimizer 3.3.9 설치 | | 작은 공간,하지만 꿈이있는

  2. 핑백: 유저별 단독톰켓(tomcat) 구성(다중 톰켓) | | 작은 공간,하지만 꿈이있는

답글 남기기