본문 바로가기
WEB|WAS

Apache - Tomcat 연동 (물리적 분리 - 외부망 : WEB, 내부망 : WAS)

by 개폰지밥 2021. 12. 23.
반응형

오늘은 Apache - tomcat을 연동해보도록 하겠습니다.

이 글에서는 외부망에는 WEB서버, 내부망에는 WAS 서버로 물리적으로 WEB, WAS 서버가 분리되어있다고 가정하고 서술했습니다.

만약 WEB WAS 서버가 물리적으로 분리되어있지 않다고 하면 방화벽을 따로 Open 할필요도 없고, WAS 서버의 IP 주소 대신 localhost라고 적으시면 됩니다.

 

1. Apache tomcat 연동 (폐쇄망, 인터넷 X)

1.1.  WEB- WAS 분리 이유

WEB, WAS 분리 (Apache와 Tomcat 분리)

Apache (웹 서버) 는 static한 파일 (js, img, css) 등 변동이 없는 파일을 서비스하기 위해 사용되어 왔다. Tomcat (웹 어플리케이션 서버, 이하 WAS) 는 사용자의 요청 등에 따라 유동적인 서비스를 제공하기 위해 사용한다.

WEB은 static 파일 서비스에 유리하고, WAS는 동적인 서비스를 제공하는데 유리하다.

참고 : https://www.kyulabs.app/4788c645-3281-489d-b11b-a1787936eb62

 

1.2.  WAS(Tomcat) 설치 완료

Apache와 tomcat을 연동하려면 Tomcat이 설치 되어있어야 한다.

Tomcat 설치하는 방법 참고 : https://seul96.tistory.com/251

 

centos7 tomcat8 install

l VirtualBox 에러 기존에 스냅샷 해놓은 centos7 가져오다가 생긴 에러 Implementation of the USB 2.0 controller not found! => 에러 해결 USB Disable 시켜줌. l Tomcat 설치 - 설치 wget https://mirror.ap..

seul96.tistory.com

 

1.3.  WEB(Apache) 설치 완료

Apache와 tomcat을 연동하려면 Apache가 설치 되어있어야 한다.

Apache 설치하는 방법 참고 : https://seul96.tistory.com/346

 

[CentOS7] Apache 설치 (폐쇄망, 인터넷X, Local yum repo)

폐쇄망이면서 인터넷은 안되고 Local yum repo만 구성되어있는 환경을 구성하고 Apache를 설치했습니다. Local yum repo 설치 방법은 아래를 참고 해주세요. https://seul96.tistory.com/343 [CentOS 7.8] local y..

seul96.tistory.com

 

1.4.  Tomcat -Connectors(mod_jk) 설치

1.4.1.  의존 라이브러리 설치

yum install gcc gcc-c++ httpd-devel

 

1.4.1.  Tomcat_connectors(mod_jk) 설치

1.4.1.1.  JK 1.2.48 Source Release tar.gz 설치 및 업로드

https://tomcat.apache.org/download-connectors.cgi

 

1.4.1.2.  JK 1.2.48 Source Release tar.gz 압축해제

tar -zxvf tomcat-connectors-1.2.48-src.tar.gz

 

1.4.1.3.  컴파일 및 설치

cd tomcat-connectors-1.2.48-src/native/
ls /usr/bin/apxs --bin에 없으면 sbin 경로도 확인
./configure --with-apxs=/usr/bin/apxs
make
make install

 

1.4.1.1.  mod_jk.so 설치 확인

ls /etc/httpd/modules/mod_jk.so

 

1.4.1.2.  selinux 해제

chcon -u system_u -r object_r -t httpd_modules_t /etc/httpd/modules/mod_jk.so
setenforce 0

 

1.5.  Apache 설정

1.5.1.  workers.properties

workers.properties란? 연동할 tomcat 정보(host, port, lbfactor(작업할당량 등)

vi /etc/httpd/conf/workers.properties
worker.list=tomcat
worker.tomcat.port=8009
worker.tomcat.host=192.168.56.101
worker.tomcat.type=ajp13
worker.tomcat.lbfactor=1

 

worker.tomcat.host에는 톰캣 서버의 IP를 입력하시면 됩니다.

만약 동일한 서버(가상서버, PC)에 Tomcat이 같이 있다면 localhost라고 적어도 됩니다.

worker.tomcat.host=localhost

 

1.5.1.  httpd.conf 설정

httpd.conf란? 연동할 톰캣의 정보를 가진 properties 파일을 생성했으면 아파치가 실행할 때 참조하는 httpd.conf파일에 이를 명시

vi /etc/httpd/conf/httpd.conf

1.5.1.1.  mod.jk 관련 설정 추가

Include conf.modules.d/*.conf 아래에 넣기

################################### mod_jk ######################################
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkShmFile run/mod_jk.shm
JkLogFile logs/mod_jk.log
<VirtualHost *:80>
 ServerName localhost
  # 확장자 jsp, json, xml, do를 가진 경로는 woker tomcat으로 연결하는 구문입니다.
  JkMount /*.jsp tomcat
  JkMount /*.json tomcat
  JkMount /*.xml tomcat
  JkMount /*.do tomcat
  JkMount /*.jspx tomcat
</VirtualHost>
################################### mod_jk ######################################

 

★에러가 생기면 로그 파일을 봐야하므로 Log 파일 위치를 잘 기억해야 합니다. -> JkLogFile logs/mod_jk.log저는 jspx도 넘겨줘야 하기 때문에 추가했습니다.

 

1.5.1.2.  DocumentRoot, Directory 명시

(참고)

- DocumentRoot: 웹 문서가 있는 경로 지정

- Directory: 모든 웹문서들이 어떤 서비스와 기능을 허용/거부 할 것인지 설정

나의 웹 문서의 위치는 /var/www/html 이다.

그렇기 때문에 httpd.conf에서 DocumentRoot와 Directory가 /var/www/html로 잘 설정 되어있는지 확인해줬다.

DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

 

1.6.  Tomcat 설정

1.6.1.  AJP 포트 허용

- vi $TOMCAT_HOME/server.xml (주석해제 및 추가)
<Connector protocol="AJP/1.3"
               address="0.0.0.0"
               port="8009"
               redirectPort="8443" secretRequired="false"/>

 

1.6.1.1.  WEB, WAS 8009 Port 방화벽 해제

web, was 서버 모두 8009 port 개방

단 하나의 서버에 둘다 설치 되어있으면 개방할 필요 x

firewall-cmd --permanent --zone=public --add-port=8009/tcp
firewall-cmd –reload

 

1.7.  Selinux 해제

setenforce 0

 

1.8.  Tomcat – Apache 연동 확인

WEB 서버에서 8080포트 없이 Tomcat 화면이 나오면 성공

http://localhost/index.jsp

curl http://localhost/index.jsp 로도 확인가능 -- 단 내부망 인터넷 x면 확인 불가능

# 가상머신이 아니라 local PC에서 접속하고 싶으면 방화벽 해제

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd –reload

 

1.8.1.  최종 방화벽 확인

1.8.1.1.  WEB 서버 방화벽

firewall-cmd --list-ports

-  8009/tcp : tomcat – apache 연동 prot

-  443/tcp : ssl (https)

-  22:ssh

 

1.8.1.2.  WAS 서버 방화벽

firewall-cmd --list-ports

(참고) 방화벽 사용법

[root@localhost ~]# firewall-cmd --help

1.9.  Apache 모듈 resource Upload

1.9.1.  DocumentRoot 찾는 방법

WEB서버의 DocumentRoot에 resource파일들을 업로드 한다.

# DocumentRoot 찾는 2가지 방법
1) cat /etc/httpd/conf/httpd.conf | grep ^DocumentRoot
DocumentRoot "/var/www/html"

2) vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"

 

1.9.1.  Resource 파일 업로드

# DocumentRoot로 이동
cd /var/www/html
# Resource upload 폴더 생성
mkdir MagicFIDO2Admin
# 이동
cd MagicFIDO2Admin/
# tomcat에 있는 resource DocumentRoot로 복사
cp -rf /home/magicfido/MagicFIDO/tomcat9/webapps/MagicFIDO2Admin/resources .
# 권한부여
chmod -R 755 MagicFIDO2Admin/ chmod -R 755 MagicFIDO2Server/

 

1.9.1.1.  (참고) Resource file이란?

Resource 파일은 images나 js같은 정적인 것들을 이야기한다.

정적인 resource file을 WEB서버에 올림으로써 Tomcat의 과부화를 막을 수 있고, 이것이 Tomcat과 WEB서버를 분리하는 주된 이유중 하나이다.

만약 Apache와 Tomcat을 연동했는데.. resource 파일을 web 서버의 DocumentRoot에 올리지 않으면 아래와 같이 image 파일등 정적인 resource등을 못불러 오게된다.

반면 web 서버에 resource 파일을 넣으면 정적 파일도 잘 불러오게 된다.

 

1.10.  (참고) <IfModule dir_module>이란?

httpd.conf에서 아래와 같은 옵션을 볼 수 있다.

<IfModule dir_module>
    DirectoryIndex index.jsp
</IfModule>

아래와 같이 명시해주면, 클라이언트 요청이 왔을 때 파일명을 지정하지 않아도 아래와 같이 지정한 파일로 안내해준다.

 

1.11.  에러 모음

에러 1)

httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain.

12월 07 22:28:28 localhost.localdomain httpd[11063]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message

 

에러 1해결)

vi /etc/httpd/conf/httpd.conf

ServerName localhost
systemctl start httpd

 

 

에러 2)

[root@localhost httpd]# tail -f error_log
[Wed Dec 08 02:28:18.608381 2021] [jk:warn] [pid 2764] No JkShmFile defined in httpd.conf. Using default /etc/httpd/logs/jk-runtime-status
[Wed Dec 08 02:28:18.608522 2021] [jk:emerg] [pid 2764] Initializing shm:/etc/httpd/logs/jk-runtime-status.2764 errno=13. Unable to start due to shared memory failure.
[Wed Dec 08 02:28:18.608528 2021] [jk:emerg] [pid 2764] Initializing shm:/etc/httpd/logs/jk-runtime-status.2764 errno=13. Unable to start due to shared memory failure.
[Wed Dec 08 02:29:12.732377 2021] [core:notice] [pid 2800] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Wed Dec 08 02:29:12.733047 2021] [suexec:notice] [pid 2800] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Wed Dec 08 02:29:12.733071 2021] [jk:warn] [pid 2800] No JkLogFile defined in httpd.conf. Using default /etc/httpd/logs/mod_jk.log
[Wed Dec 08 02:29:12.733091 2021] [jk:warn] [pid 2800] No JkLogFile defined in httpd.conf. Using default /etc/httpd/logs/mod_jk.log
[Wed Dec 08 02:29:12.733106 2021] [jk:warn] [pid 2800] No JkShmFile defined in httpd.conf. Using default /etc/httpd/logs/jk-runtime-status
[Wed Dec 08 02:29:12.733195 2021] [jk:emerg] [pid 2800] Initializing shm:/etc/httpd/logs/jk-runtime-status.2800 errno=13. Unable to start due to shared memory failure.
[Wed Dec 08 02:29:12.733197 2021] [jk:emerg] [pid 2800] Initializing shm:/etc/httpd/logs/jk-runtime-status.2800 errno=13. Unable to start due to shared memory failure.

 

에러 해결

chcon -u system_u -r object_r -t httpd_modules_t /etc/httpd/modules/mod_jk.so

setenforce 0

httpd.conf에 mod_jks.so, log 파일등 명시
LoadModule jk_module modules/mod_jk.so
JkShmFile run/mod_jk.shm
JkLogFile logs/mod_jk.log

 

에러 3) 500에러

에러 해결

# WEB, WAS 8009 포트 열기

firewall-cmd --permanent --zone=public --add-port=8009/tcp
firewall-cmd –reload

 

에러 4) 톰캣 에러

Caused by: java.lang.IllegalArgumentException: AJP 연결자는 secretRequired="true"로 구성되었으나 보안 속성이 널 또는 ""입니다. 이 조합은 유효하지 않습니다.
                at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:270)
                at org.apache.catalina.connector.Connector.startInternal(Connector.java:1071)
                ... 12 more
08-Dec-2021 03:14:39.607 정보 [main] org.apache.catalina.startup.Catalina.start 서버가 [22356] 밀리초 내에 시작되었습니다.

-> SSL 인증서를 사용하지 않겠다는 뜻이다.

 

에러 5)

[Wed Dec 08 03:26:34.171 2021] [5254:139937913129088] [info] jk_handler::mod_jk.c (2999): Could not find a worker for worker name=tomcat

 

에러 해결)

vi /etc/httpd/conf/httpd.conf
JkWorkersFile conf/workers.properties

 

# 재시작
systemctl httpd restart

 

1.12.  (참고) WEB-WAS 서버 분리 (가상머신 복제)

WEB 서버와 WAS 서버가 물리적으로 분리 되어있는 것을 구현하기 위해

WEB, WAS 서버가 설치 되어있는 서버를 복제해서, WAS 서버는 WAS만 start해놓고, WEB 서버는 WEB만 start해서 테스트를 진행함.

다음에는 SSL를 설치해서 SSL을 입혀보도록 하겠습니다!!

 

☞ 더 많은 인프라 구축 방법(폐쇄망)을 보고 싶으면 아래 링크를 클릭해주세요.

2021.12.13 - [Linux] - CentOS 7.8 설치 및 putty 접속 (원하는 버전 설치 링크 포함)

2021.12.14 - [Linux] - [CentOS 7.8] local yum repository 구성 (폐쇄망x, 인터넷x)

2021.12.17 - [DATABASE/DB install & upgrade] - CentOS7 Mysql5.7 install (폐쇄망, internet X)

2021.12.22 - [WEB|WAS] - [CentOS7] Apache 설치 (폐쇄망, 인터넷X, Local yum repo)

2021.12.23 - [WEB|WAS] - Apache - Tomcat 연동 (물리적 분리 - 외부망 : WEB, 내부망 : WAS)

2021.12.24 - [Security] - [CentOS7] SSL 설치 및 SSL 적용

2022.01.27 - [WEB|WAS] - Apache, Tomcat tuning

2022.03.16 - [DATABASE] - Mysql, MariaDB PASSWORD Lifetime 설정(만료기간)

반응형

댓글