출처: http://ryudaewan.springnote.com/pages/610881
왜 Apache HTTP Server와 Tomcat을 연동하는가?
Apache Tomcat(이하 Tomcat)은 아마도 가장 널리 알려진 JSP / Servlet Engine일 것입니다. JSP / Servlet 명세에 대한 참조 구현물(Referencial Implementation, 흔히 줄여서 RI라고도 하죠) 역할도 하고 있으며, 실 업무에서도 꽤 씁니다(왕년에 Naver Blog를 쓸 때 한번은 Java Exception Trace log가 Web Browser에 표시된 것을 본 적이 있었습니다. 그 덕에 Naver Blog가 Tomcat을 쓴다는 것을 알았죠).
그러나 실전에서는 web server와 tomcat 같은 JSP/Servlet Engine 둘을 연동해서 쓰지, tomcat만 쓰지는 않습니다. 그 이유는 아래와 같습니다.
성능 상의 이유
JSP/Servlet Engine 상에서 동작하는 Servlet이나 JSP라는, (동일한 HTTP Request를 보내도 매 번 그 결과가 다를 수 있는) 동적인 HTTP Response를 생성해 보내는 것들입니다. 그에 비해 단순한 HTML 문서, image, CSS(Cascading Style Sheet), Javascript file은 거의 변할 일는 (동일한 HTTP Request를 보내면 그 결과가 늘 같은) 정적 contents입니다. 이런 정적 contents는 통상적으로 Web Server가 JSP/Servlet Engine보다 더 빠르게 service합니다.
감이 오시나요? 결국 정적 content는 정적 contents 처리에 강한 Web Server가 처리하고, 동적 contents는 JSP/Servlet Engine이 맡는 것입니다. 일단 HTTP Request를 Web Server가 먼저 받아보고 정적 contents를 요구하면 자신이 처리하고, 동적 contents request라면 이 request를 JSP/Servlet Engine에게 넘기죠. 아니면 특정 URL pattern이 들어오면 JSP/Servlet Engine으로 넘기는 방법도 있습니다. 결국 이렇게 하면 부수적으로 동적 contents 생성하느라 바쁜 JSP/Servlet Engine에 부하를 덜 줄 수 있고 정적 contents service하느라 귀중한 JVM Heap을 아낄 수 있는 이점도 누릴 수 있습니다.
보안 상의 이유
보통 JSP/Servlet Engine은 중요한 업무 절차에 대한 구현을 가지고 있게 마련입니다. 단순한 image, CSS 같은 정적 contents를 담은 Web Server보다 더 안전해야 보호해야 한다는 뜻이 됩니다. 보통 어떤 기업 같은 조직의 network를 구성할 경우 외부 network와 조직의 network를 방화벽(firewall)으로 단절시키고 방화벽에 규칙(rule)을 등록, IP packet이 제한적으로만 그 방화벽을 넘다들 수 있도록 합니다. 안전성이 더 높아야 하는 server들이 있는 network zone는 여기에 한 번 더 방화벽을 칩니다. 그리고 이 두 방화벽 사이의 network zone을 DMZ라고 합니다.
이렇게 Web Server와 JSP/Servlet Engine을 따로따로 쓰면 DMZ에 덜 중요한 data를 가진 web server를 놓고 이중 방화벽 뒤에 있는 network zone에 JSP/Servlet Engine을 놓음으로써 높은 보안성을 획득하면서도 외부에 동적 contents를 제공할 수 있게 됩니다.
가용성 상의 이유
web server도 하나, JSP/Servlet Engine도 하나라면 둘 중 하나만 죽으면 정상적인 service가 불가능합니다. 따라서 절대 멈추면 안되는 service(세계화가 되면서 이런 요구 사항은 더 늘었습니다. 지구 상 어딘가는 늘 업무 시간이니까요)를 담당하는 web server, JSP/Servlet Engine은 두 개 이상을 가동하는 이중화를 적용합니다.
web server가 어떤 HTTP Request를 받아 이를 JSP/Servlet Engine으로 넘기려 할 때 그 JSP/Servlet Engine이 이중화가 되어 있다면 web server는 이 request를 좀 한가한 JSP/Servlet Engine에 넘긴다던지 할 수 있습니다(물론 실제로는 간단하게는 round robin부터 시작해서 이에 대한 여러가지 방법이 있습니다). 내지는 JSP/Servlet Engine 중 하나가 비정상적으로 종료한 상태이면 현재 살아 있는 JSP/Servlet Engine에게 이 request 처리를 위임, 전반적인 service 중단을 막을 수 있습니다.
준비물
-
Apache Tomcat
- Apache Tomcat : Apache Tomcat 대표 site. Tomcat을 내려받으려면 가야 하는 곳.
-
Apache HTTP Server
- Apache HTTP Server : Apache HTTP Server 대표 site.
- Apache Lounge : Windows용 Apache HTTP Server 정보가 풍부함. Windows용 Apache HTTP Server는 여기에서 받을 것을 추천!
-
mod_jk
- Apache Tomcat : Apache Tomcat 대표 site. mod_jk도 여기서 받을 수 있습니다(이 site에서는 mod_jk를 'Apache Connector'라고 부릅니다).
작업 절차
Apache와 Tomcat을 연동하기 위해서는 보통 mod_jk나 proxy_ajp 를 사용하는 두가지 방법이 있습니다.
회사에서는 mod_jk를 주로 사용합니다. 실제로 아직은 mod_jk 방법을 권장하고 있기는 합니다. 이유는 다양한 옵션이 있다는 것이죠. 하지만 mod_jk의 다양한 옵션을 사용해서 튜닝을 하는 경우가 아니라면 제가 볼때는 비슷합니다.
- Windows에서 mod_jk를 이용해서 Apache, Tomcat 연동하기 - Windows에서 mod_jk를 이용해서 Apache, Tomcat 연동하기
- Linux에서 mod_jk를 이용해서 Apache, Tomcat 연동하기 - Linux에서 mod_jk를 이용해서 Apache, Tomcat 연동하기
- Windows에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기 - Windows에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기
- Linux에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기 - Linux에서 proxy모듈을 이용해서 Apache, Tomcat 연동하기
방법간에 차이가 크지 않지만 아무래도 방법과 OS간의 차이가 조금씩은 있어서 정리해둡니다.
mod_jk와 proxy_ajp방식의 성능차를 비교했던 자료가 있었는데 개인적인 실수로 지워져 버려 올리지 못하는건 아쉽네요. ^^
간단한 구성
간단한 구성이란, 개발이나 가벼운 Web Service 운영을 목적으로 하나의 Apache HTTP Server + 하나의 Tomcat 연동 구성을 하는 것입니다. 이 작업에 대한 구체적 작업 절차는 [tomcat]apache, tomcat 연동하기 글에서 잘 설명하고 있습니다(Windows / Linux에서 mod_jk로 Apache와 Tomcat 연동하는 것을 proxy_module과 같이 설치할 경우와 아닌 경우 모두 설명하고 있습니다).
고가용성을 위한 구성
Naver Blog와 같이 사용자가 많다거나 장애 등을 감내할 수 있는(Fault Tolerant) Web Service를 구성하려면 위 간단한 구성으로는 어렵고 여러 개의 Apache HTTP Server + 여러 개의 Tomcat 연동 구성을 해야 합니다. 이렇게 해야 일부 Apache HTTP Server나 Tomcat이 죽어도 나머지들이 request를 처리할 수 있지요. 이러한 특성을 고가용성(High Availability)이라 하는데 이 고가용성은 위와 같은 단순한 설정만으로는 얻기 어렵습니다. 이런 고가용성 설정은 '아파치와 톰캣을 활용한 대용량 웹서비스 운영'이란 글에서 잘 설명하고 있습니다.
참고 문헌
-
Tomcat 6.0.13 + Apache 2.2.4 + MySQL 5.0.45 + WindowsXP
: 연동 절차를 설명해 놓은 또 하나의 글
-
The Apache Tomcat Connector - Web Server HowTo
: mod_jk로 Apache HTTP Server 2.2와 Tomcat 6을 연동하는 설명서(영문).
예시
- Apache HTTPD 2.2 설정 file : mod_jk로 Apache HTTP Server 2.2와 Tomcat 6을 연동시킨 결과로 나온 Apache Web Server 2.2 설정 file.
- Apache Tomcat 6 설정 file : mod_jk로 Apache HTTP Server 2.2와 Tomcat 6을 연동시킨 결과로 나온 Apache Tomcat 6 설정 file.
- mod_jk.conf : 실제 mod_jk 설정 정보를 담은 mod_jk 설정 file.
'IT_etc > 유용한 전산 지식들..' 카테고리의 다른 글
[펌] 텍스트 파일에서 Line Feed (LF)와 Carriage Return (CR) 이란? (0) | 2009.06.21 |
---|---|
[펌] XP Service Pack 3 internet Explorer 정식 아이콘 복원하기 (0) | 2009.05.20 |
바이트 오더 (Byte Order) (0) | 2009.03.05 |
[펌] 프로그래밍 스타일 (1) ~ (8) (0) | 2008.12.18 |
한글 & 엑셀 단축키 (0) | 2008.08.01 |