System Engineering/Server(Web&WAS)

Server #3. Centos7 아파치(웹서버)와 Tomcat(WAS) 연동하기

ZunoXI 2020. 5. 21.

개요

Centos7Apache(Webserver)와 Tomcat(WAS) 연동하기

 

Webserver with WAS

우리가 일반적으로 웹화면을 구성할때 정적인 html, css를 처리하는 기능은웹서버만으로도 구현이 가능하다. 단, 비지니스 로직을 수행해야 하는 동적 페이지를 처리시에는WAS(Web ApplicationServer)라는것이 필요하다.

 

이 WAS라는것이 단독으로도 정적, 동적페이지 모두를 구현을 할 수 있으나 과도한 부하가 발생할 수 있어서 부하분산이 필요하다. 이와 별개로, 8080포트에는(WAS의 포트)에는방화벽을 설정하여 어플리케이션 로직에 직접적 접근을 방지 하는 등, 여러가지 이유로web server와 WAS를 연동하여 동시에 운영하는것이 합리적인 방법으로 여겨진다.

 

 

 


 

웹 서버와 WAS(Web Application Server)

 

웹 서버는 정적인 컨텐츠( html, css, js )를 제공하는 서버이다. (ex) Apache, Nginx)  반면, WAS는 웹서버의 정적 자원처리 역할뿐만아니라 DB 조회 혹은 비지니스 로직을 처리하는동적 컨텐츠도 구동이 가능한 서버이다. 일반적인 구조는웹서버가 앞단에와서 서버 혹은 도메인으로 넘어온 요청을 연동된 WAS 포트로(웹서버와 WAS가 같은 서버에 있는경우) 넘겨주게 구성되어있다.

 

 

이둘을 연동하는 이유가 뭘까. 좀더 자세히 알아보자면, 물론 WAS에도 웹서버의 기능이 있지만 종래의 WAS는 독립적인 웹서버보다 느린 처리속도를 갖고있었고, 이렇게 때문에 WAS로만 서비스할 경우 느린처리속도로 인한 서비스의 품질이 저하될 수 있다.

 

최근의 WAS들은 웹서버못지않게 속도향상이 되었으나 여전히 보안(포트개방)적인 문제나 웹서버에서만 설정할 수 있는부분들이 있기때문에 웹서버와 WAS를 연동하여 사용한다. 필자가 생각하는 대표적인 웹서버의 장점은 가상호스트(virtualhost)를 이용한 멀티도메인 설정이 간편하고, 사내에 APP서버가 위치하지만 보안상 서버를 외부에 노출할 수 없는경우 웹서버만 DMZ에 별도 분리함으로써 서비스만 외부 접근을 가능하게 하는 방법이 있다.

 

 

대표적인 상용 WAS

 

 

 

위와 같은 이유로 정적인 콘텐츠들은 WAS까지 가지않고 웹서버단에서 처리함으로 서비스의 속도를 높여 품질을 향상시킬 수 있다. 보통 아파치(웹서버)와 톰캣을 예로들어 웹서버와 WAS 연동 시 동작되는 방식은 다음과 같다.

 

1. 서비스를 사용하는 유저가 브라우저를 통해 아파치 웹서버에 요청

2. 아파치 웹서버는 이 요청이 톰캣에서 처리해야하는 요청인지 확인

3. 톰캣에서 처리해야하는 경우 톰캣의 AJP포트에 접속하여 요청건 전달

4. 톰캣은 웹서버로부터 요청을 전달받아 처리 후 다시 웹서버에 전달

5. 아파치 웹서버는 결과값을 사용자에게 전달

 

 

 

참고로 아파치와 아파치톰캣은 전혀다르다. 우리가 일반적으로 많이 듣게되는아파치는 Apache foundation에서 만든Apache Webserver이고,톰캣은 마찬가지로 Apache 재단에서 만든Apache Tomcat(WAS)이다. 필자는 처음에 이런 미들웨어들을 운영하며 헷갈렸던 기억이난다.

 

 

 

국산 상용 WAS JEUS

 

 

 

웹 서버와 WAS 연동

 

1. 웹서버 설치

필자의 작업환경에서의 주 언어는 JAVA이므로 WAS는 오픈소스인 아파치 톰캣을 사용한다. (사용 환경 : CentOS 7.5, Apache web server(httpd) 2.4.6, Tomcat 9.0.8)

 

CentOS환경에서는 apache가httpd(http 웹서버)로 명칭된다. (ubuntu에서는 apache라는 이름으로 사용) 여기서, httpd는 http웹서버를 구동할 수 있는 데몬이다.

 

해당 httpd 패키지를 먼저 설치한다. (설치 되어있는경우는 패스)

yum update 

yum install -y httpd 

httpd -version # 정상 설치 여부 확인

 

 

 

 

2. Tomcat 설치

 

필자가 설치한 최초 아파치버전은 2.4.6과 톰캣 9.0.35 버전이랑은 계속 ajp 통신오류가 났다.(원인미상..)

 

그래서 아래 포스팅을 참고하되 9버전대를 설치한다면9.0.8 버전으로 설치를 추천한다.

https://zunoxi.tistory.com/41

 

Server #1. centos7에 apache tomcat 설치

해당 포스팅은 다음 블로그에서 이전했습니다. zunoxi.github.io/infra/2020/04/21/infra-linux-installTomcat/ Server 1. centos7에 apache tomcat 설치 개요 centos7에 apache tomcat 설치 zunoxi.github.io 개..

zunoxi.tistory.com

 

 

3. tomcat-connector(mod_jk) 설치

 

web-server와 tomcat을 연동시키기 위해tomcat-connector를 설치해준다.

 

 

(1) 의존성 주입

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

 

(2) 압축 풀기 및 폴더 이동

tar xvf tomcat-connectors-1.2.46-src.tar.gz

mv tomcat-connectors-1.2.46-src/ /usr/local/src

cd /usr/local/src/tomcat-connectors-1.2.46-src/native/

 

(3) 빌드

빌드 전 먼저 해당 유틸들이 설치 되어있는지 확인

yum -y install gcc gcc-c++ httpd-devel

 

이제 빌드를 해본다. (위치는 cd /usr/local/src/tomcat-connectors-1.2.46-src/native/)

 

./buildconf.sh

 

 

./configure --with-apxs=/usr/bin/apxs

 

 

make make install

 

(4) mod_jk 파일

ls /etc/httpd/modules/ | grep mod_jk

 

 

4. 기타 설정 파일 수정

 

(1) httpd.conf 파일 수정

vi /etc/httpd/conf/httpd.conf

 

httpd.conf파일 안에 다음 내용을 추가 (가상호스트 추가)

 

<VirtualHost *:80>
    DocumentRoot "/u01/zunoxi"  # 기본페이지 루트
    ServerName zuno.com # 도메인 지정
    ErrorLog "logs/zuno.com-error.log"
    CustomLog "logs/zuno.com-access.log" common
    JkMount /* tomcat # 해당 포트 혹은 도메인으로 요청이 들어왔을때 연결할 톰캣 마운트
</VirtualHost>

 

이때가상호스트(VirtualHost)설정 및ServerName을 별도 설정하면 경우는 하나의 서버에서 여러개의 톰캣을 구동시킬 시, 포트번호가아닌 도메인 네임으로 각 톰캣에 접근 할 수 있게하는 기능을 한다.

 

또한, 여기서 JkMount /* 라는 설정은 웹서버로 들어오는 url의 요청을 WAS에게 전달하겠다는 의미이다. 이렇게 설정을 하면 정적인콘텐츠와 동적인 콘텐츠를 나눠서 부하분산을 시키는 의미가 없어질 수 있어 잘 고려해서 설정해야한다.

 

 

해당 파일에 아래의 내용도 추가 (주석처리 되어있다면 주석해제)

LoadModule jk_module modules/mod_jk.so

 

(2) workers.properties 파일 수정

vi /etc/httpd/conf/workers.properties

 

위 httpd.conf 파일의 가상호스트 설정에JkMount/* tomcat 부분에서 tomcat이라는 이름으로 마운트 설정을 했기에 workers.properties에는 위 처럼 설정해주면 된다.

 

8009 포트설정은 웹서버에서Ajp 통신포트로 8009로 연결되어 요청을 톰캣으로 보내주는 역할을 한다.

 

 

(3) mod_jk.conf 파일 수정

vi /etc/httpd/conf.modules.d/mod_jk.conf

(파일이 없을수도 있다. 그냥 만들면 된다)

 

<IfModule jk_module>
    JkWorkersFile conf.d/workers.properties  # workers.properties를 읽어 들이겠다는 뜻 
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkLogFile logs/mod_jk.log
    JkLogLevel info
    JkShmFile run/mod_jk.shm
</IfModule>

 

※ 해당과정에서 처음에는 아래와 같은 에러가 났다.

 

\[Tue May 19 16:09:13.388 2020\] \[20094:140649420454016\] \[error\] extension\_fix::jk\_uri\_worker\_map.c (580): Could not find worker with name 'tomcat' in uri map post processing.

\[Tue May 19 16:09:13.416 2020\] \[20094:140649420454016\] \[info\] init\_jk::mod\_jk.c (3591): mod\_jk/1.2.46 initialized

\[Tue May 19 16:09:13.416 2020\] \[20094:140649420454016\] \[error\] extension\_fix::jk\_uri\_worker\_map.c (580): Could not find worker with name 'tomcat' in uri map post processing.

\[Tue May 19 16:09:27.945 2020\] \[20098:140649420454016\] \[info\] jk\_handler::mod\_jk.c (2999): Could not find a worker for worker name=tomcat

\[Tue May 19 16:09:28.282 2020\] \[20096:140649420454016\] \[info\] jk\_handler::mod\_jk.c (2999): Could not find a worker for worker name=tomcat

 

이는 mod_jk.conf에 최초 설정시

 

<IfModule mod_jk.c>

JkWorkersFile conf/workers.properties

JkShmFile run/mod_jk.shm

JkLogFile logs/mod_jk.log

JkLogLevel info

JkLogStampFormat “[%y %m %d %H:%M:%S] “

<IfMoudule mod_jk.c>

라고 설정했기 때문이다….<IfModule jk_module> 라고 설정하는 것이 맞다.

 

 

5. httpd 재기동 및 정상 접속 확인

 

systemctl stop httpd.service 

systemctl start httpd.service

여기서 정상적으로 연결되고 이런식으로 ip(포트번호 없이) 혹은 domain으로 접속했을때, 톰캣의 웹페이지로 바로 접속이 된다면 성공이다. 필자는 호스트에 도메인을 지정해놔서 도메인으로 들어가는것으로 확인했다.

 

참고 : C:\Windows\System32\drivers\etc 에 hosts 파일에 특정 ip의 도메인을 등록하고 테스트해 볼 수있다.

 

 

위 사진 처럼 웹서버와 WAS가 정상적으로 연동되어 있는것을 알수 있다.

 

★ 다음 포스팅에서는 SSL 인증으로 HTTPS 보안서버를 구축해볼 예정 :)

반응형

댓글