Cent OS Apache와 Tomcat 연동

Apache와 Tomcat 연동

Tomcat도 단독으로 서비스를 할 수 있으나 보편적으로 Apache와 연동하여 사용하는 경우가 많습니다. 그 이유는 아래와 같습니다.

  • 정적컨텐츠의 서비스 속도(이미지 동영상의 경우 Apache가 빠름)
  • 여러 대의 Apache와 Tomcat서버의 클러스터링 구성
  • Apache 웹서버의 다양한 모듈 확장
  • 보안 강화

연동 방식은 mod_jk, mod_proxy, mod_prox_ajp 세가지 방식이 존재한다고 합니다만, 이중에서 mod_jk 방식을 살펴 보겠습니다.대체적으로 보통 mod_jk로 연동하는 경우가 많고, 나머지 2가지에 비해 URL 또는 컨텐츠별 설정이 쉽다고 합니다.

1. mod_jk설치

  • mod_jk를 설치 하려면 gcc, gcc-c++, httpd-devel 세가지 패키지가 설치되어 있어야 합니다.
  • 아래 명령어를 입력하여 3가지 패키지를 모두 설치합니다.
1
$ yum install gcc gcc-c++ httpd-devel

http://tomcat.apache.org/download-connectors.cgi 링크 위치 주소로 방문하여 최신 다운로드 파일 링크를 확인 합니다.

Cent OS Apache Tomcat 연동1

  • 화면 중간에 보시면 tar.gz파일의 링크가 있습니다. 우클릭하여 링크 주소 복사 를 통해 링크를 카피합니다.
  • 다운로드 받을 디렉토리 위치로 이동한 후 파일을 아래의 명령어로 다운로드 받습니다.
1
2
3
$ wget -c {{링크카피주소}}

$ wgwt -c http://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.46-src.tar.gz

Cent OS Apache Tomcat 연동2

  • 다운로드 받은 파일의 확장자가 tar.gz입니다. 이는 압축파일이며, 압축파일을 해제하기 위해 아래의 명령어를 실행합니다.
1
$ tar zxvf tomcat-connector*
  • 압축이 풀리며 디렉토리가 생성된 것을 확인할 수 있습니다.

Cent OS Apache Tomcat 연동3

  • 생성된 디렉토리 안에 native디렉토리로 들어갑니다.

Cent OS Apache Tomcat 연동4

  • Makefile을 생성하기 위해 아래 명령어를 실행합니다.
  • 옵션 내용은 Apache확장기능 설치를 도와주는 유틸리티의 경로입니다.
  • 기본 설치 경로는 /usr/bin 입니다.
  • 혹, 경로에 찾을수 없다는 에러가 발생하신다면 /usr/sbin 의 경로도 한번 살펴보시기 바랍니다.
1
$ ./configure --with-apxs=/usr/bin/apxs

Cent OS Apache Tomcat 연동5

  • make명령어로 컴파일을 실행합니다.
1
$ make
  • 컴파일 완료후 install 합니다.
1
$ make install

참고로 다음과 같은 명령어를 사용해서 컴파일과 install 을 동시에 실행할 수도 있습니다.

1
$ make && make install
  • install 후 /etc/httpd/modules/ 경로의 파일 안에 mod_jk.so 파일이 생성되어있음을 확인할 수 있습니다.

Cent OS Apache Tomcat 연동6

  • Selinux의 보안관련 설정을 변경해주어야 하는데요, 아래의 명령어를 실행합니다.
1
$ chcon -u system_u -r object_r -t httpd_modules_t /etc/httpd/modules/mod_jk.so

2. Apache 설정

  • Apache의 설정은 /etc/httpd/conf/httpd.conf 파일인데 vi 에디터로 오픈합니다.
  • vi에디터 창에서 / 를 누르고 LoadModule 단어를 검색 키워드로 찾아(엔터후 n버튼을 누르면 다음찾기가 됩니다.) 그 아래쪽에 다음의 내용을 추가합니다.

httpd.conf 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf

LoadModule jk_module modules/mod_jk.so // 추가

...
  • Apache의 가상 호스트 /etc/httpd/conf/extra/httpd-vhosts.conf 파일도 아래 코드를 추가 합니다.
  • httpd-vhosts.conf 파일은 httpd.conf 에 가상호스트 include 설정이 되어 있어야 합니다.

httpd-vhosts.conf 파일

1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
ServerName localhost

# 확장자 jsp, json, xml, do를 가진 경로는 woker worker1 으로 연결하는 구문입니다.
JkMount /*.jsp worker1
JkMount /*.do worker1
JkMount /*.json worker1
JkMount /*.xml worker1
</VirtualHost>

Cent OS Apache Tomcat 연동7

  • 화면에 보시면 conf.modules.d 경로가 include가 된 것을 볼 수 있습니다.
  • /etc/httpd/conf.modules.d 경로에 진입하여 vi mod_jk.conf 를 실행하여 새로운 설정파일을 오픈 합니다.
1
$ vi /etc/httpd/conf.modules.d/mod_jk.conf
1
2
3
4
5
6
7
8
9
10
11
12
<IfModule mod_jk.c>
# 워커 설정파일 위치
JkWorkersFile conf/workers_jk.properties
# 공유 메모리파일 위치 반드시 Selinux 보안때문에 run에 위치 필수
JkShmFile run/mod_jk.shm
# log 위치
JkLogFile logs/mod_jk.log
# 로그레벨 설정
JkLogLevel info
# 로그 포맷에 사용할 시간 형식을 지정한다.
JkLogStampFormat "[%y %m %d %H:%M:%S]"
</IfModule>

Cent OS Apache Tomcat 연동8

  • vi 에디터에서 :wq 로 저장하고 빠져 나옵니다.
  • 이제 mod_jk.conf 파일에서 설정한 워커 설정 파일을 만들 차례 입니다.
  • 설정한 경로가 /etc/httpd/conf/workers_jk.properties 입니다.
  • vi 로 해당경로 를 오픈하여 파일을 생성합니다.
1
$ vi /etc/httpd/conf/workers_jk.properties
1
2
3
4
5
6
worker.list=worker1

worker.tomcat.port=8009
worker.tomcat.host=localhost
worker.tomcat.type=ajp13
worker.tomcat.lbfactor=1
  • port를 8009로 설정함은 tomcat의 server.xml설정에 기인합니다. 확인은 아래에서 가능합니다.
1
$ vi /usr/share/tomcat/conf/server.xml

tomcat 은 기본 URIEncoding 이 ISO-8859-1 이므로 한글이 깨지므로 모든 커넥터 설정에 URIEncoding="UTF-8" 을 추가해야 합니다.

1
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>

Cent OS Apache Tomcat 연동9

  • /etc/httpd/conf/extra/httpd-vhosts.conf 파일을 열어 Apache와 Tomcat Document 위치를 맞추어줍니다.
  • 이부분을 맞추어 주지 않으면 jsp 파일은 보이지만 이미지와 CSS가 로드 되지 않습니다.
  • httpd-vhosts.conf 파일을 오픈하여 DocumentRoot 구문에 Tomcat의 문서 경로로 변경해줍니다.
  • /usr/share/tomcat/webapps/ROOT 입니다.
1
$ vi /etc/httpd/conf/extra/httpd-vhosts.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<VirtualHost *:80>
ServerAdmin seungwoon@gmail.com
DocumentRoot /usr/share/tomcat/webapps/ # // 추가
ServerName localhost

# // 추가
<Directory "/usr/share/tomcat/webapps/ROOT/">
AllowOverride none
Require all granted
</Directory>

# 확장자 jsp, json, xml, do를 가진 경로는 woker tomcat으로 연결하는 구문입니다.
JkMount /*.jsp worker1
JkMount /*.do worker1
JkMount /*.xml worker1
JkMount /*.json worker1
</VirtualHost>
  • /etc/httpd/conf/httpd.conf 파일을 열어 기본 인덱스 설정에 index.jsp 를 추가 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
# // 변경 전
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

# 변경 후
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>
  • 마지막으로 아랫부분의 SELinux 설정을 해줍니다.
1
$ chcon -R --type=httpd_sys_rw_content_t /usr/share/tomcat/webapps/ROOT

만약 위 명령어 실행 시 에러가 발생하면 setenforce 0 명령어로 SELinux 임시 해제 후 SELinux 설정을 한 후 setenforce 1 명령어로 SELinux 실행 합니다.

1
2
3
$ setenforce 0 // SELinux 끄기
$ chcon -R --type=httpd_sys_rw_content_t /usr/share/tomcat/webapps/ROOT
$ setenforce 1 // SELinux 켜기
  • 아파치를 재시작 합니다.
1
$ systemctl restart httpd
  • 톰캣을 재시작 합니다.
1
$ systemctl restart tomcat
  • 이제 결과를 확인 하기 위하여 http:///index.jsp로 접속합니다.
  • 8080포트 없이 진입했는데 Tomcat화면이 나오시면 성공입니다.

Cent OS Apache Tomcat 연동10

그러면 보시는 바와 같이 톰캣 페이지가 응답이 되지만, CSS, image 등이 제외된 상태로 HTML 문서만 응답이 됩니다.

Cent OS Apache Tomcat 연동11

그 이유는 아파치 환경 설정에서 tomcat connection 에서 설정한 JkMount 옵션 때문입니다.
.jsp 파일만 worker가 처리하도록 보냈기 때문에, 정적 파일들은 아파치에서 응답해야 합니다.
하지만 아파치에는 톰캣 페이지에서 제공해야 하는 정적 파일들이 없기 때문에 톰캣에서 받아온 HTML 문서만 응답할 수 밖에 없습니다.

이로 미루어 보아, worker를 통해 아파치가 톰캣으로부터 jsp파일만 가져온 것을 확인할 수 있습니다.
즉, 아파치와 톰캣이 연동된 것입니다.

간단한 애플리케이션이 있다면 worker를 수정해서 80포트로 접근했을 때 애플리케이션을 응답할 수 있도록 설정할 수 있습니다.
Tomcat Manager에서 웹 애플리케이션을 deploy 했을 때, 그 이름을 example 이라고 하겠습니다.
그러면 JkMount를 다음과 같이 수정해서 웹 애플리케이션이 아파치와 연동되서 실행될 수 있습니다

1
$ vi /etc/httpd/conf/extra/httpd-vhosts.conf

Tomcat connection 부분의 JkMount를 아래와 같이 수정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerAdmin example@gmail.com
DocumentRoot /usr/share/tomcat/webapps/
ServerName localhost

<Directory "/usr/share/tomcat/webapps/ROOT/">
AllowOverride none
Require all granted
</Directory>

JkMount /example/* worker1 # // 수정
</VirtualHost>

다시 아파치를 재시작 합니다.

1
$ systemctl restart httpd

브라우저에서 http:///example/~~ )에 접속해봅니다.

만약에 리소스 파일 계속 접근이 안된다면 /usr/share/tomcat/webapps/ROOT 디렉토리의 파일권한을 755로 변경 해줍니다.

Tomcat ROOT 디렉토리로 변경

/usr/share/tomcat/conf/server.xml 파일에서 아래 처럼 변경 후 톰캣 재시작을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
# // 변경 전
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
...
</Host>

# 변경 후
<Host name="localhost" appBase="/home/www"
unpackWARs="false" autoDeploy="false">
<Context path="/" docBase="." reloadable="false" />
...
</Host>

WAR 파일 수동 압축 풀기

1
$ jar xvf <war파일이름>.war 입력

:8080포트 차단하기

  • vi 에디터로 /usr/share/tomcat/conf/server.xml 파일을 오픈 합니다.
  • Connector port가 8080 으로 되어 있는데 이부분을 80 으로 변경하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...

<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
<!-- // 변경 전 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

<!-- // 변경 후 -->
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

...

참조

공유하기