Window 환경에서 Local로 Apache 와 Tomcat을 연동하는 방법을 설명 하겠습니다. 해당 부분을 작성하는 이유는
리눅스 환경이 아닌 Window 환경에서 하는경우는 흔치 않기 떄문에 공부겸 작성 하게 되었습니다.
Apache 란?
정적인 데이터를 처리하는 웹서버로 흔히 클리언트가 HTML, JPG, RESOURCE 파일 같은 변하지 않는 파일을 요청하면 Apache는 해당 파일을 클라이언트에게 응답을 하는 소프트웨어입니다.
Tomcat 란?
Tomcat은 WAS(Web Application Server)로 불리며 동적인 데이터 즉 어떠한 요청에 따른 DB를 조회하고 계산하여 제공하는등 다양한 역할을 수행하는 소프트웨어입니다.
흔히 웹을 구성할 때 Apache + Tomcat을 결합하여 사용합니다 그 이유는 Tomcat은 주로 동적인 데이터를 처리 하기 때문에 많은 리소스를 필요로 하여 많은 요청이 들어오면 부하가 걸릴 수 있는 반면 Apache는 정적인 데이터를 전달함으로써 상대적으로 적은 리소스를 잡아 먹기 때문입니다. 이둘을 연동함으로써 정적인데이터를 요청했을 경우 Apache가 처리한 후 클라이언트에게 전달하고, 동적인 데이터를 요구하는 경우에는 Apache가 Tomcat에게 클라이언트의 요청을 전달하고 Tomcat이 요청에 따른 동적인 데이터를 만든 후 그것을 Apache에게 전달 Apaceh는 다시 클라이언트에게 전달함으로써 좀더 효율적으로 서버를 운영 할 수 있습습니다.
▶ 클리언트 요청 -> Apache -> Tomcat -> WebService ,DB -> Tomcat -> Apache -> 클라이언트
설명은 간단하게 끝내고 연동을 하는 작업을 수행하겠습니다.
Window Local 환경에서 Apache + Tomcat 연동
1. Apache 설치
자신의 운영체제에 맞는 Apache와 Tomcat과 연동에 필요한 mod_jk도 같이 설치 해주세요. 그이유는 아래에서 설명하 겠습니다. 링크는 아래에 있습니다.
www.apachelounge.com/download/
다운 받은 Apache파일을 압축해제 하면 아래와 같은 3개의 파일이 등장할 거에요. 이중에 저희는 Apache24를 사용할 거에요. 그러면 Apache24를 들어가주세요.
아피치 폴더중 저희는 아래의 bin, conf, htdocs, logs, modules를 중점으로 보시면 됩니다.
- bin : 아파치 실행관련 파일
- conf : 아파치 설정관련 파일
- htdocs : 정적인 파일
- logs : 아파치 관련 로그 파일
- modules : 모듈 관련 파일 (Tocat과 연동을 위한 모듈 포함)
그 후 아파치 관련 설정을 변경하기 위하여 conf 디렉토리로 이동 한 후 에디터로 httpd.conf를 열어줍니다.
2. 아피치 설정
▶ 아피치의 포트 설정을 하기 위한 단계로 저는 80포트를 사용하겠습니다 그래야 localhost:8080 처럼 요청을 하지않고 localhost라고 해도 아피치에 요청이 갈 수 있습니다.
▶ SeverName을 설정을 하기위한 단계로 저는 localhost를 사용하기 때문에 localhost로 지정했습니다. 상황에 따라 적절히 바꿔주시면 됩니다.
▶ 이부분은 아파치의 DoucumentRoot를 설정하는 단계입니다. 예로 톰켓에 요청을하면 htdocs에서 해당 파일을 찾게 됩니다. 저희는 지금 아무런 설정을 하지 않았으니 웹브라우저를 통해 localhost를 요청하면 htodcs/index.html을 찾아서 response 할것입니다. 저는 해당부분은 수정하지 않고 넘어 가겠습니다.
▶ 아래 Include conf/extra/httpd-vhosts.conf 부분의 주석을 해제 해 주세요. 해당 부분은 특정 request 요청이 왔을때 Proxy를 통하여 요청을 날릴 수 있게 설정하는 부분입니다. 해당 부분은 아래에서 설명하겠습니다.
▶ 아래의 mod_jk 모듈 설정을 추가
mod_jk 란?
mod_jk는 Apach와 Tomcat을 연동을 할때는 프로토콜을 이용합니다. 이때 사용하는 프로토콜은 AJP를 사용합니다.
Apach는 Tomcat에 요청하고자 할때는 이러한 AJP프로토콜은 통하여 요청을하고 그에 대한 Response를 받습니다. 이러한 연동을 도와
주는 모듈을 mod_jk라고 합니다.
아래 코드를 httpd.conf에 위의 정보를 삽입 해주세요. httpd.conf 에디터로 열고 하단에 삽입하시면 보기 편하실꺼에요.
#mod_jk 모듈 설정
LoadModule jk_module modules/mod_jk.so
JkworkersFile conf/workers.properties
JkMount /* worker1
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
이후 위에서 Apache와 함께 다운 받은 mod_jk에서 mod_js.so를 복사 하여 Apache24/modules에 붙여넣기 해주세요.
▶ 다음 아래처럼 프록시 설정을 위하여 아래 부분을 주석 해제 합니다. 프록시를 사용하는 이유는 어떤 특정 요청이 왔을때 내부서버에 특정포트, 특정 도메인으로 요청 하기 위함입니다. 예로 localhost:80 으로 요청을 했지만 톰켓은 해당요청이 들어오면 localhost:9999로 요청하게 됩니다.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
프록시 설정을 위해 Apache/conf/extra/httpd-vhosts.conf 파일을 에디터로 열어주세요
▶ 아래 부분은 프록시 설정으로 본인 프로젝트 맞게 변경하시면 됩니다.
- * : 모든 ip에 대하여
- 80 : 포트 80으로 접속한 것에 대하여
- SeverName : 도메인이 localhost/web 인 요청에 대하여
- ErrorLog : 발생한 에러는 해당 위치에 출력
- ProxyPass : /web 인것에 대하여, http://localhost:12123/web/으로 client로 요청을 보내고 응답을 받는다.
※ ex ) Request : localhost/web -> localhost:12123/web 으로 요청 하게됩니다.
<VirtualHost *:80>
ServerName localhost/web
ErrorLog logs/webtest.error.log
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
ProxyPass /web http://localhost:12123/web/ nocanon
ProxyPassReverse /web http://localhost:12123/web/
</VirtualHost>
Reverse Proxy를 사용하는 이유
클라이언트가 Web Service에 요청을 하면 Reverse Proxy 해당 요청을받고 해당하는 내부서버에 요청 후 그 결과 값을 응답 받습니다. 그냥 프록시를 사용하지않고 직접 해당 웹서버에 요청하게끔 해놓으면 해당 웹서버가 공격,해킹을 받았을때 중요 정보가 노출 될수 있기 때문입니다. 때문에 프록시서버를 두고 톰켓에서는 특정 포트(8080[웹서비스],8009[AJP프로토콜])만 열어두면 프록시 서버를 거쳐 요청하게 됨으로써 보안을 조금 더 신경 쓸 수 가 있기때문입니다.
▶ 이렇게 기본적인 설정이 끝나면 아파치를 실행 하겠습니다
명령프롬포트(관리자 권한실행) -> ${아파치 위치}\Apache24\bin 로 이동
1. httpd -k install (설치)
2. httpd -k start (시작)
3. httpd -k stop (중지)
4. httpd -k restart (재실행)
1 -> 2 을 진행 주시고 상황에 따라 3,4을 적절히 사용하세요.
이렇게 되면 아피치가 구동 될거에요 웹브라우저를 키고 localhost를 입력하면 아래와 같은 화면이 등장할것입니다. 이유는 위에 httpd.conf에서 설정한 DoucumentRoot파일의 위치가 htdocs로 되어있고 index.html 읽도록 초기 setting이 되어있어스 그렇습니다.
여기까지 진행 하셨으면 아파치에 대한 설정은 끝났습니다. 그러면 Tomcat에 대한 설정을 하도록 하겠습니다.
3. Tomcat 설치
↓ 아래의 링크에서 Tomcat을 설치 해주세요.
tomcat.apache.org/download-90.cgi
아래와 같이 자신의 운영체제에 맞는 Tomcat을 설치 하고 압축을 해제해주세요.
tomcat/conf/server.xml을 에디터로 열고 수정할 것입니다.
▶ 처음 port는 8080으로 설정되어 있지만 저는 12123으로 변경하겠습니다. 이 포트번호는 위에서 아파치 설정위해 수정한 httpd-vhosts.conf에서 프록시를 통해 요청할 포트번호(http://localhost:12123/web/)와 일치해야합니다. 그래야 아파치가 정상적으로 해당 톰켓의 포트로 요청할 수 있습니다.
▶ 아래 부분은 톰켓과 아파치 연동시 AJP프로토콜을 사용한다고 설명했는데 해당 내용을 톰켓에서 설정하는 부분입니다.
해당부분은 주석처리 되어있으니 주석을 해제 하시고, address , secreRequired만 맞게 변경 하시면 됩니다. 여기서 주의 할 것은 port번호를 아파치에서 AJP포트 설정한것과 동일 해야합니다.
▶ tomcat\webapps 밑에 테스트 할 프로젝트 넣어 주시면 되는데 저는 war파일을 넣어주도록 하겠습니다.
↓ war를 이용한 배포는 아래의 링크를 참조 해주세요
▶ 이후 톰켓을 실행 시키기위해 tomcat/bin/startup.bat을 실행하시면 톰켓이 구동되면서 해당 war파일 압축 해제 하고 해당 디렉토리를 컴파일 해서 서비스가 구동 될 것입니다.
▶ 이후 브라우저를 키고 해당 서비스를 요청하면 정상작동 하는 것을 볼 수 있습니다.
▶ 위의 요청 포트를 보면 12123으로 되어있습니다. 이것은 위의 톰켓 설정 할때 포트번호를 12123으로 설정했기때문입니다. 하지만 이것은 톰켓에 직접 요청하는 케이스이고 저희는 아파치를 통해 톰켓을 접근하려고 하기때문에 아파치에 요청을 하도록 해보겠습니다.
위에서 보시다시피 localhost/web/test/t1으로 요청했는데 결과 값을 동일 하게 나오는 것을 확인 할 수 있습니다.
※ 그 이유는 위에서 설명했지만 모든 80포트로 들어 오는 것은 Apache에서 받고 이후 설정한 프록시에 따라 localhost/web/test/t1으로 요청하면 내부적으로 localhost:12123/web/test/t1으로 요청하고 응답을 받기 때문입니다.
이렇게 Window 환경에서 Apaceh 와 Tomcat을 연동하는 작업을 수행 했습니다. 모두 즐거운 코딩하세요 ~