본문 바로가기

Server

아파치 톰캣 연동

Apache HTTP 서버와 Tomcat 서버의 연동

Web Server인 Apache와 WAS 서버인 Tomcat 을 연동하는 방법에 대해 포스팅하겠습니다.

저는 Windows 7를 사용하였고, Apache는 2.2 버전, 톰캣은 7.0.8 버전을 사용하였습니다 (그리 중요하지 않습니다)

연동하기 앞서, 간단한 개념부터 살펴보도록 하겠습니다.


Apache, Tomcat 연동의 이유

Tomcat은 WAS 서버이지만 Web 서버의 기능도 갖추고 있는 WAS 서버입니다.

그러나 톰캣의 Web 서버 기능은 아파치보다 느린 속도처리를 보였고, 이로 인해

정적인 페이지는 Apache가 처리하고, 동적인 페이지를 Tomcat이 처리함으로써 부하를 분산하는 이유에서 Apache와 Tomcat을 연동하였습니다.


그러나 이는 옛날 얘기이고.. 지금은 Tomcat이 많이 발전해 Tomcat 내의 Web 서버가 아파치에 절대 뒤쳐지지

않을만큼의 역할을 수행합니다.

그럼에도 불구하고 아직도 Apache와 Tomcat을 연동하여 사용하는 이유는, 아파치 내에서만 설정할 수 있는 부분이라던가

아파치에서 제공하는 유용한 모듈들을 톰캣에서 사용할 수 없기 때문입니다.


AJP, mod_jk

아파치와 톰캣이 연동하기 위해선 AJP를 통해 서로 통신을 하여야 합니다.

AJP란 아파치가 웹서버와 외부 서비스(톰캣 등)과 연동하기 위해 정한 규약(프로토콜) 입니다. 현재 1.3까지 나와있습니다.

아파치는 이를 사용하여 80포트로 들어오는 요청은 자신이 받고, 이 요청중 서블릿을 필요로 하는 요청은 톰캣에 접속하여 처리합니다.

우리는 아파치 톰캣 연동을 위해 mod_jk 라는 모듈을 사용할건데, 이는 AJP 프로토콜을 사용하여 톰캣과 연동하기 위해 만들어진 모듈입니다.

mod_jk는 톰캣의 일부로 배포되지만, 아파치 웹서버에 설치하여야 합니다.


처리 플로우

1)아파치 웹서버의 httpd.conf 에 톰캣 연동을 위한 설정을 추가하고 톰캣에서 처리할 요청을 지정함.

2)사용자의 브라우저는 아파치 웹서버(보통 80포트)에 접속해 요청

3)아파치 웹서버는 사용자의 요청이 톰캣에서 처리하도록 지정된 요청인지 확인. 요청을 톰캣에서 처리해야 하는 경우 

  아파치 웹서버는 톰캣의 AJP포트(보통 8009포트)에 접속해 요청을 전달

4)톰캣은 아파치 웹서버로부터 요청을 받아 처리한 후, 처리 결과를 아파치 웹서버에 되돌려줌

5)아파치 웹서버는 톰캣으로부터 받은 처리 결과를 사용자에게 전송


이제 필요한 mod_jk 모듈을 다운받으러 가실까요.

톰캣 홈페이지의 tomcat-connector 부분에서 구할 수 있습니다.

http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/

여기서도 구하실 수 있습니다.(참고로 http://archive.apache.org 는 아파치 관련 파일들이 많이 있으니 자주 애용하시면 좋습니다.)

근데 위의 경로에서는 Apache 2.2 기준으로 64비트 관련한 모듈이 없더군요 ㅠ.ㅠ

그래서 경로를 하나 더 올리겠습니다. ㅠㅠ

http://www.apachelounge.com/download/win64/

여기서는 아파치 2.2, 2.4 버전과 그에 해당하는 모듈들을 전부 다운받을 수 있습니다. 유용한 사이트입니다.

이렇게 경로를 많이 올리는 이유는 자신의 아파치 버젼과, 비트와, 컴파일 버전(VC10, VC11 등) 에 따라 각각

mod_jk.so 파일이 다 다르기 때문입니다.. 자신의 아파치 버전에 맞지 않는 mod_jk.so 파일을 로딩할 경우 아파치가 실행되지 않으니

잘 찾아보시고 자신에게 맞는 mod_jk 모듈을 다운받으시기 바랍니다.

파일을 다운로드 받으셨으면 압축을 풀고 mod_jk.so 파일을 Apache 폴더 내 modules 폴더안에 복사해 넣습니다.



이제 설정파일을 수정해 보겠습니다.

톰캣을 건드리지 않으셨다면 AJP 포트는 8009번일테지만, 확인한번 해보고 가는것도 나쁘지 않지요~

톰캣의 server.xml 파일을 열어서 아래의 구문이 있는가 확인해 줍시다.

server.xml

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

주석처리 되어있으면 해제해주시고.. 확인되었으니 이제 톰캣에서는 건드릴 것이 없습니다.

아파치 쪽 설정으로 넘어가죠.


먼저, 연동할 톰캣의 목록을 적어줄 workers.properties 파일을 하나 만듭니다.

그리고 아래와 같이 작성해줍니다.

workers.properties

worker.list=worker1

worker.worker1.type=ajp13

worker.worker1.host=localhost

worker.worker1.port=8009

worker.list는 사용할 woker(톰캣) 인스턴스들의 리스트입니다. 이름은 임의로 지정해주시면 되고,

아래에서 worker.woker이름.속성=값 의 형태로 정의해 주시면 됩니다.

저희는 ajp13 프로토콜을 사용하며, host는 localhost이며, 포트는 8009(아까 확인하셨죠?)를 사용합니다.


그리고 만약 톰캣을 여러개 사용할 경우 아래와 같이 해주시면 됩니다.

workers.properties

worker.list=worker1,worker2 // 이름은 임의로 설정


worker.worker1.type=ajp13

worker.worker1.host=localhost

worker.worker1.port=8009

#worker.worker1.lbfactor=1


worker.worker2.type=ajp13

worker.worker2.host=localhost

worker.worker2.port=8010 // 포트만 바꿔주시면 됩니다. 사용할 두번째 톰캣의 server.xml 파일을 수정하셔야 됩니다.(위에서 보여드린 부분)

#worker.worker2.lbfactor=2

여기서 주석처리되었지만 추가된 부분이 있는데, worker.worker명.lbfactor 라는 구문입니다.

이는 작업할당량 비율이라고 보시면됩니다. worker1:worker2 = 1:2 의 비율로 작업을 처리한다고 보시면 됩니다.


이제 연동할 톰캣의 정보를 가진 properties 파일을 생성하였으니, 아파치가 실행할 때 참조하는 httpd.conf 파일에 이를 명시해줘야합니다.

httpd.conf

LoadModule jk_module modules/mod_jk.so    // 모듈 위치


JkWorkersFile conf/workers.properties    // workers.properties 파일 위치

JkLogFile logs/mod_jk.log    // 로그파일 위치

JkLogLevel info    // 로그 레벨


JkMount /* worker1

LoadModule 구문을 추가하여 아까 추가한 mod_jk.so 파일의 위치를 명시하고,

JkWorkerFile 구문으로 worker 프로퍼티 파일의 위치를 적어줍니다.

log 관련 부분은 로그파일의 위치와 로그레벨을 명시합니다. (로그의 형태도 지정할 수 있습니다.)

이외에도 구문을 추가하여 설정하실 수 있으니 구글신에게 물어보시면 됩니다.

그리고 마지막으로 중요한 JkMount 구문입니다.

JkMount 뒤에 오는 /* 는 모든 url의 요청을 의미합니다. 

즉, 모든 url의 요청에서 서블릿 관련 처리가 필요하다면 workers.properties 파일에 명시된 worker1로 넘기겠다는 의미가 됩니다.

/* 외에도 /*.jsp, /*.php 등등 적어주실 수 있습니다. 그리고 톰캣을 여러대 추가하셨다면 worker1 대신에 

worker2, worker3 등을 작성해 다른 톰캣으로 넘기셔도 되지요.


끝났습니다..

설정은 굉장히 간단합니다. 이제 확인한번 해보도록 하죠.

아파치의 포트는 80, 톰캣의 포트는 8080입니다. 두 서버를 연동하였기 때문에

http://localhost 를 입력하였을때 톰캣 웹루트의 index.jsp가 떠야 합니다.

아파치 띄우시고, 톰캣 띄우시고 주소창에 localhost 입력해보도록 하죠.


연동이 잘 되네요~~ 수고하셨습니다.


아, 그리고 참고로

httpd.conf에 VirtualHost 설정이 되어있으니 연동이 되지 않더군요..

VirtualHost 구문을 해제해주세요.


이상 포스팅을 마치겠습니다. 감사합니다.

'Server' 카테고리의 다른 글

Tomcat에 프로젝트 배포하기  (0) 2016.09.02
JBOSS 시스템 프로퍼티 설정  (0) 2016.08.17
아파치 설정파일 구문 검사  (0) 2015.05.06
아파치 VirtualHost 설정  (8) 2015.05.05
톰캣 메모리 설정  (0) 2015.04.13