본문 바로가기

4.개발 및 운영 환경

아파치에서 여러 URL를 톰캣으로 연동하기

들어가기

직접 서버를 구성할 경우 아파치는 웹서버로 톰캣과 같이 연동하여 많이 사용된다. 이런 연동에 아파치 서버의 reverse proxy와 virtual host를 사용한 톰캣 연동을 많이 사용한다. 이를 사용한 톰캣 연동 방법을 간단하게 살펴볼려고 한다.

작성자: ospace114@empal.com, http://ospace.tistory.com/

환경구성

먼저 환경구성을 해보자. 아파치와 톰캣이 있다면 건너뛰어도 좋다. 리눅스 배포판인 경우는 내부 패키지 관리자에 의해서 쉽게 설치 가능하다. Windows 환경이라면 아래 링크에서 다운로드 받을 수 있다.

그리고 사용할 샘플 도메인이다. 자신에 맞게 사용하면 된다.

  • server1.test.com
  • server2.test.com

아래는 사용할 톰캣 주소이다. 사전에 톰캣을 구성해서 실행 상태로 두면 된다. 여기서 톰캣 구성하는 방법은 다루지 않는다.

이미 눈치채겠지만 server1은 localhost:2001로 연동되고 server2는 localhost:2002로 연동될 예정이다. 현재는 localhost으로 연동되는 테스트 목적 구성으로 보안에는 좋지 않다. 그렇기에 추후 실제 환경에 맞게 변경해야 한다.

VirtualHost로 여러 URL 매핑

먼저 VirtualHost을 사용한 URL 매핑 방법을 살펴보자. 기본 환경에서 자주 사용되는 설정 방법이다. 사용할 설정 파일은 "conf/extra/httpd-vhosts.conf"를 수정한다. 또는 "conf/httpd.conf"에서 "http-vhosts.conf"을 가져오는 부분이 주석처리되어 있을 수도 있다. 주석해제를 해줘야 한다. 어떤 경우는 이런 설정 파일 없이 "conf/httpd.conf"만 있을 수도 있다. 어차피 "http.conf"에 설정 들을 별도 파일로 분리해놓았기 때문에 "httpd.conf"에서 설정해도 된다.

# Virtual hosts
# Include conf/extra/httpd-vhosts.conf

사전에 NameVirtualHost를 설정해야 동작한다. 그리고 아래 VirtualHost을 설정해줘야 한다.

  • ServerName: 도메인 URL으로 설정
  • ServerAdmin: 관리자 연락 이메일 주소
  • DocumentRoot: 로딩할 문서 위치
  • ErrorLog: 에러 로그 저장위치
  • CustomLog: 접근 로그 저장 위치

아파치 구성 전에 임시로 테스트할 HTML 문서를 두 개 만들고 "${SRVROOT}/server1"과 "${SRVROOT}/server2"위치에 저장한다.

기본 80포트를 사용했다. 사용할 도메인이 두 개이기 때문에 두개 VirtualHost을 각각 설정한다. ServerName에 앞에 임시로 사용할 도메인 주소을 각각 입력한다. ServerAdmin은 지금은 중요하지 않기에 동일하게 설정해도 무방하다. 지금은 톰캣 동작만 확인하기 위한 부분이라 DocumentRoot로 로딩할 HTML 문서 위치를 지정한다. 그리고 로깅설정은 ErrorLog와 CustomLog을 별도 위치에 구성한다. 같이 있으면 서로 섞여서 구분하기 쉽지 않기 때문이다.

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName server1.test.com
    ServerAdmin admin@server1.test.com

    DocumentRoot "${SRVROOT}/server1/htdocs"

    ErrorLog logs/server1-error_log
    CustomLog logs/server1-access_log common
</VirtualHost>

<VirtualHost *:80>
    ServerName server2.test.com
    ServerAdmin admin@server2.test.com
    DocumentRoot "${SRVROOT}/server2/htdocs"

    ErrorLog logs/server2-error_log
    CustomLog logs/server2-access_log common
</VirtualHost>

아파치를 구동해서 각각 도메인 주소로 접속해보고 VirtualHost가 제대로 동작하는지 확인하다. 여기까지는 일반적인 아파치 설정이라 크게 어렵지 않다.

톰캣 연동

이제 톰캣과 연동해보자. 톰캣과 연동은 모듈을 사용해서 연동할 수 있다. 사용할 수 있는 모듈은 mod_jk와 mod_proxy로 두 개가 있다.

  • mod_jk: 외부 모듈로 별도 설치 필요
  • mod_proxy: 기본 제공 모듈

여기서는 기본으로 제공되는 mod_proxy을 사용하겠다. 그리고 추가로 mod_proxy_http 또는 mod_proxy_ajp가 필요하다. 해당 부분은 아파치에 없다면 삭제될 가능성이 높기에 새로 아파치를 다운받아서 사용하기를 추천한다.

mod_proxy를 사용한 톰캣 연동

mod_proxy은 forward_proxy와 reverse_proxy를 사용한 방법이 있다.

  • forward proxy
    • 사용자가 특정 도메인 연결시 프록시 서버가 처리하는 방식
    • 캐싱을 사용한 성능향상과 정해진 사이트만 연결하도록 제한 가능
  • reverse proxy
    • 사용자가 특정 도메인 연결시 리버스 프록시 서버가 받아서 내부 서버로 전달하고 응답 데이터를 사용자에게 전달
    • 일반적으로 보안을 위한 DMZ 구성에 많이 사용
    • 일반적인 톰캣 연동할 경우는 reverse proxy 구성을 사용

어떻게 보면 forward proxy는 내부망 사용자가 불특정 외부 인터넷 연결에 사용하다고 볼 수 있고, reverse proxy는 불특정 외부에서 내부망 서버 연결에 사용한다고 보면 된다. 그렇기에 forward proxy은 사용자에 가깝고 reverse proxy는 서버에 가깝다고 볼 수 있다.
forward proxy와 reverse proxy가 동작 방식에는 크게 변화가 없다고 생각할 수 있다. 크게 다른 점은 forward proxy은 투명하게 동작하다고 보면 reverse proxy는 중간에 추가적인 처리를 한다. 즉, reverse proxy은 서버 앞에 있기 때문에 서버 응답에 대해 서버 주고를 원래 요청한 서버 주소로 변경된다.

사용할 아래 두 가지 모듈을 설정하자. 만약 주석되어있다면 주석을 해제한다.

  • modules/mod_proxy.so
  • modules/mod_proxy_http.so

conf/httpd.conf에 모듈설정할 수 있다. 아래 모듈이 추가되지 않았다면 추가해주고, 주석되어 있다면 해제해주면 된다.

(중략)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
(중략)

다음으로 Virtual Host에 reverse proxy에 대해 아래 추가 설정이 필요하다.

  • ProxyRequest Off
  • ProxyPreserveHost On
  • ProxyPass: 요청을 넘겨줄 톰캣 주소
  • PxoxyPassReverse 응답을 받을 톰캣 주소

이미 구성한 "conf/extra/httpd-vhosts.conf"에서 VirtualHost에 앞의 설정내용을 추가한다.

<VirtualHost *:80>
    ServerName server1.test.com
    (중략)
    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass /  http://127.0.0.1:2001
    ProxyPassReverse / http://127.0.0.1:2001
</VirtualHost>

<VirtualHost *:80>
    ServerName server2.test.com
    (중략)
    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass /  http://127.0.0.1:2002
    ProxyPassReverse / http://127.0.0.1:2002
</VirtualHost>

일반적인 프록시는 사용하지 않기에 ProxyRequests은 off로 하고 Reserve Proxy을 사용하기 때문에 ProxyPreserveHost은 On으로 해준다.
server1은 "http://127.0.0.1:2001"로 server2는 "http://127.0.0.1:2002"로 연동해준다. 나머지는 앞에 설정과 동일하다.

결론

아파치 서버를 이용해서 여러 URL을 한 서버에서 처리 가능하고 reverse proxy를 사용하여 톰캣으로 연동이 가능하다. 이를 활용하면 여러 도메인에 대해 한 시스템에서 테스트할 수도 있고, 보안을 위한 DMZ 구성도 할 수 있다. mod_jd 모듈로도 톰캣과 연동은 가능하다. 이 모듈은 AJP 프로토톨을 이용해 직접 톰캣으로 연동하는 방식으로 이전에 많이 사용했지만 여러모로 mod_proxy가 장점이 많이기에 mod_proxy을 사용했다.
부족한 글이지만 여러분에게 도움이 되었으면 하네요. ;) 모두 즐거운 코딩생활 되세요 ospace.

참조

[1] 아파치 웹 서버(apache httpd) 와 톰캣 연동하기 - tomcat connector(mod_jk) , reverse proxy(mod_proxy), https://www.lesstif.com/pages/viewpage.action?pageId=12943367
[2] 포워드 프록시(forward proxy) 리버스 프록시(reverse proxy) 의 차이, https://www.lesstif.com/pages/viewpage.action?pageId=21430345

반응형

'4.개발 및 운영 환경' 카테고리의 다른 글

무중단 배포 전략 3가지  (0) 2024.03.27
[nexus] Nexus로 Maven Repository 구성  (0) 2024.03.25
가상화 솔루션 Proxmox-VE 사용  (0) 2024.03.15
VisualVM 소개  (2) 2024.03.15
CTIP 소개  (0) 2023.12.28