톰캣과 아파치를 사용하는 이유에 대해서
잘 설명해둔 글을 발견했다!
나처럼 익숙하지 않은 개발자라면 한번쯤 읽어보면 좋을것 같다.
톰캣과 아파치를 같이 사용하는 이유는 무엇일까?
톰캣은 HTTP 서버 기능을 내장하고 있고 Java NIO 를 사용하는 커넥터를 구현하는 등 전보다 많은 성능 향상이 이루어졌지만 톰캣 단독으로 사용보다는 아파치 웹 서버등 별도의 웹 서버와 연계하여 사용하고 있다.
이렇게 사용하는 이유는 여러 가지가 있지만 주요 이유는 다음과 같다.
정적 컨텐츠 서비스 효율이 뛰어남
일반적으로는 웹 서버가 이미지 파일이나 동영상등 정적 컨텐츠를 제공하는데 더 성능이 뛰어난 것으로 알려져 있다.
주의할 점은 특정 상황(톰캣에 APR native 와 sendFile 사용등)에서는 톰캣이 정적 컨텐츠 처리도 더 빠른 경우도 있으므로 Apache Benchmark 나 jMeter 등의 성능 측정 도구로 직접 서비스 사이트를 측정해 볼 필요가 있다.
연한 클러스터링
하드웨어 기반의 부하 분산 장비(L4)가 없어도 아파치 웹 서버와 연계하여 사용하면 여러 대의 아파치 웹 서버와 톰캣을 클러스터로 손쉽게 구성하여 유연하게 서비스할 수 있다. 아파치 웹서버의 톰캣 연계 모듈은 특정 톰캣 인스턴스가 응답이 없으면 클러스터에서 제외하고 서비스하므로 한 대의 서버에 장애가 생겨도 정상적으로 서비스가 가능하다.
모듈 기반의 확장성
아파치 웹 서버는 다양한 모듈이 제공되므로 서버의 기능을 확장할 수 있으며 mod_headers, mod_rewrite 등의 다양한 모듈을 사용하면 유연한 서비스 제공이 가능하다.
가상 호스트(Virtual Host)
톰캣도 Host 구문으로 가상 호스트를 사용할 수 있지만 아파치 웹 서버보다는 설정과 관리가 번거롭다.
아파치 웹 서버를 사용하면 하나의 서버에 여러 개의 가상 호스트를 설정하여 가상 호스트별로
(예: app1.example.com,app2.example.com) 톰캣에서 처리하고 특정 확장자(.php)나 가상 호스트는(예:wordpress.example.com) 는 PHP 기반의 서비스를 제공하도록 설정할 수 있다.
보안
웹 서버가 필요한 가장 중요한 이유중 하나이다.
먼저 권한 부분을 보자. 유닉스의 설계상 1024 이하의 포트를 사용하려면 루트 사용자여야 가능하다. 그러므로 톰캣을 루트 사용자로 구동해야 하며 이는 보안상 많은 문제를 야기할 수 있다. 그렇다고 1024 이후의 포트를 사용하면 클라이언트들은 서비스 URL과 서비스 포트 번호를 외워야 하는 어려움이 있다.
아파치 웹 서버는 루트로 구동해도 자식 프로세스를 fork 한후에 apache 그룹과 계정으로 전환한다.
톰캣은 특성상 MySQL, 오라클, MariaDB 등 DB 서버와 같이 사용하게 되며 DB 서버에는 기업의 중요한 정보가 보관되므로 외부에서 연결할 수 없게 격리된 내부 네트워크 환경을 사용한다.
웹 서버는 외부에 서비스를 제공해야 하므로 DMZ 라고 불리우는 외부망과 내부망 사이에 위치해야 하며 톰캣을 웹 서버로 사용한다면 DMZ 의 톰캣에서 DB 서버로 바로 연결을 허용해야 하므로 2차 방화벽이 존재해도 의미가 없다.
이런 구성에서는 WAS 가 해킹당하면 WAS 에 있는 DB 서버 설정을 보면 DB 서버의 연결 정보를 알수 있고 연결이 가능하므로 데이타까지 유출될수 있다.

톰캣 단독 사용
아파치 웹 서버를 DMZ 영역에 두고 서비스하면 위와 같은 우려가 없어진다. 웹 서버는 오로지 톰캣에만 연결할 수 있으므로 웹 서버가 해킹당해도 DB 서버까지 침입하기가 힘들다.
SELinux 까지 사용한다면 아파치 웹 서버는 오로지 8080, 8009 포트만 접근할 수 있으므로 톰캣에 서비스 용도외에는 연결 자체가 불가능해지므로 웹 서버가 공격받아도 2차 피해를 최소화할 수 있다.

웹서버와 톰캣 연계
연계 방식
크게 mod_jk 와 mod_proxy 두 개의 연계 방식이 있다.두 가지 방식 모두 장단점이 있으며 환경이나 필요 여부에 따라 골라서 선택하면 된다.
먼저 특징을 정리한 다음 표를 보자
| mod_jk |
|
| mod_proxy |
|
mod_jk 와 mod_proxy 비교
mod_proxy는 톰캣의 HTTP 커넥터와 연계되며 아파치에 기본 탑재된 모듈이므로 별도의 설치가 필요없고 HTTP 프락시 이므로 WAS 의 종류에 구애받지 않는 장정이 있으며 mod_jk 보다는 설정이 간편한 편이다.
mod_jk 는 톰캣의 AJP 커넥터와 연계되는 모듈로 톰캣 전용 바이너리 프로토콜인 AJP 를 사용하므로 mod_proxy 보다 속도가 빠른 편이다.
하지만 설정이 mod_proxy 보다 어렵고 별도의 모듈을 컴파일해서 설치해야 하며 톰캣 전용 프로토콜이므로 WAS 가 다른 제품으로 변경되면 사용이 불가능하다.
다음 장에서 다룰 sonatype nexus 의 경우 jetty 라는 WAS 를 내장하고 있으므로 mod_jk 로 연계할 수 없으며 mod_proxy 를 사용해야 한다.
아파치의 모듈과 톰캣의 커넥터와 연결 관계는 아래의 그림과 같으며 보통 하나의 연결 방식을 사용하므로 사용하지 않는 아파치 모듈과 톰캣의 커넥터는 주석 처리하여도 정상 동작에는 문제가 없다.

mod_proxy 연계
mod_proxy 는 아파치 웹서버에 기본 포함되어 있는 모듈로 포워드 프락시(Forward proxy)와 리버스 프락시(Reverse proxy) 역할을 수행하는 모듈이다.
두가지 방식의 프락시에 대해서 간단하게 살펴 보도록 하자.
포워드 프락시
포워드 프락시는 그림처럼 사용자가 특정 사이트(example.com)에 연결시 사용자 PC 가 직접 연결하는게 아니라 포워드 프록시 서버가 요청을 받아서 사이트에 연결하고 그 결과를 클라이언트에 전달(forward) 해 준다.
포워드 프록시는 대개 캐슁 기능이 있으므로 자주 사용되는 컨텐츠라면 월등한 성능 향상을 가져올 수 있으며 사용자는 정해진 사이트만 연결할수 있는등 웹 사용 환경을 제한할수 있으므로 기업 환경등에서 많이 사용한다

리버스 프락시
클라이언트가 example.com 웹 서버에 데이타를 요청하면 Reverse Proxy는 이 요청을 받아서 내부 서버에서 데이타를 받은후에 이 데이타를 클라이언트에 전달하게 된다.
보통 기업의 네트워크 환경은 DMZ 라고 하는 내부 네트워크와 외부 네트워크 사이에 위치하는 구간이 존재하며 이 구간에는 메일 서버, 웹 서버, FTP 서버등 외부 서비스를 제공하는 서버가 위치하게 된다.
WAS 나 DB 는 내부망에 위치하므로 DMZ 에 위치시키면 보안에 매우 취약해 지므로 프락시 서버를 두고 프락시가 내부 서비스와 통신해서 결과를 클라이언트에게 제공하는 방식으로 서비스를 하게 된다.
이런 방식으로 동작할 때 리버스 프락시라고 한다.
리버스 프락시는 HTTP 방식으로 WAS 와 연결하므로 WAS 종류가 무엇이든 상관없이 웹 서버와 연계 할 수 있다.

참조. ( 이 글은 아래 링크에서 스크랩한 글입니다. )
'프로그래밍' 카테고리의 다른 글
| 이중화 된 서버 구조와 설명 (0) | 2020.09.14 |
|---|---|
| Window) Oracle Table Space 설정 방법 (0) | 2020.09.14 |
| 단축 URL ( URL Shortener ) 원리와 사용법 (0) | 2020.08.20 |
| File Download (0) | 2020.08.17 |
| IP 개념 정리! (0) | 2020.08.13 |