[백업][가리사니] 톰켓 버추얼 호스팅 + server.xml 설정
java, tomcat

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

서론

예전에 작성한 강의 스프링 4 입문강의 : 6. 리눅스 서버에 배포을 다시보다가 버추얼 호스팅에 대한 설명이 너무 부실한 것을 보고 보충을 하다.. 주제를 이탈하는 것 같아 별도의 강의로 작성하기로 했습니다. 스프링 4 입문강의 : 6. 리눅스 서버에 배포

버추얼 호스팅이란?

예를들어 어떤 호스팅 회사가 100여개의 사이트를 운영중이라고 한다면, 해당 갯수만큼의 서버 혹은 VM(가상운영체제)이 필요할 것입니다. 물론 100여개의 사이트가 모두 엄청난 접속량을 가지고 있다면 오히려 100개이상의 서버가 필요하겠지만, 일반적으로 소수의 사이트에 트래픽이 몰리며 나머지 서버들은 기본자원(운영체제 구동을위한)이 대부분임으로 상당한 자원이 낭비될 것 입니다. 이때 해결책은 바로 버추얼 호스팅입니다. 버추얼 호스팅은 하나의 웹 서버안에 다수의 어플리케이션(여기서는 주로 사이트)을 돌려 하드웨어나 운영체제가 소모하는 기본자원의 소모량을 줄이는 방법입니다. 더 쉽게 설명하면 한대의 컴퓨터로 여러개의 가상 운영체제를 가동하면 -> 버추얼 머신

  • 한대의 물리적 컴퓨터로 큰 자원을 소모하지 않는 여러개의 운영체제를 돌린다면 전기요금 같은 물리적 자원에서 이득을 얻는다. 한대의 컴퓨터 하나의 운영체제 하나의 웹서버로 여러개의 웹호스트를 가동하면 -> 버추얼 호스트
  • 버추얼 머신같은 경우도 각 가상머신마다 운영체제를 가동시키기위한 기본자원이 소모됨으로 버추얼 호스팅을 하면 더 효율적입니다. (물론 붙어있는 유저들은 운영체제가 아닌 하나의 호스트만 가지고 있음으로 자유도가 줄어듭니다.) 톰켓을 비롯한 거의 모든 웹서버는 버추얼 호스트를 지원합니다.

톰켓 버추얼 호스팅 설정하기

톰켓폴더/conf 로가게되면 아래와 같은 설정파일들이 있습니다. (일부 생략) context.xml : 컨텍스트 설정 (공통) server.xml : 서버 설정 tomcat-users.xml : 톰켓 접근 기능 유저/권한 설정 web.xml : 웹 설정 (공통) server.xml 을 오픈합니다. 크게 가 있습니다. Service, Connector : 서비스 단위, 연결설정 // 서비스 단위를 여러개 만들고 Connector 를 통해 80포트 / 8080포트 / 443(SSL/TSL)등 여러개의 포트를 열어 서비스할 수 있습니다. Engine : Connector과 마찬가지로 Service 아래 단위로 Connector설정이 반영되고 하위 객체입니다. Host : 처음 1개만 설정되어있을 겁니다. 이것이 각 호스트입니다. 아마 처음 상태라면 다음과 같이 설정되어있을 것입니다.

<Engine name="Catalina" defaultHost="localhost">
	...
	<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
		<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	</Host>
	...
</Engine>

Engine

  • defaultHost : Host[name]과 일치하지 않는 호스트로 접속시 기본값으로 대처할 호스트입니다.
  • 예를들어 127.0.0.1 로 접속한 경우 아래 Host[name]에는 localhost 밖에 없어 일치하는 것이 없지만 기본값 localhost를 보고 localhost로 할당하게 됩니다. Host
  • 참고 : https://tomcat.apache.org/tomcat-9.0-doc/config/host.html
  • name : 호스트 이름입니다. 예를들어서 도메인이름 gs.saro.me 로 접속한경우 Host[name]이 gs.saro.me 인것을 찾고 없으면 위 설명처럼 Engine[defaultHost]의 값으로 접속합니다.
  • appBase : 기본 경로입니다. 예를들어 webapps 라면 [톰켓기본경로/webapps] 를 기본으로 접속하게됩니다.
  • unpackWARs (war 파일 자동언팩), autoDeploy(자동 디플로이) : https://tomcat.apache.org/tomcat-9.0-doc/config/host.html#Automatic_Application_Deployment Valve
  • 참고 : https://tomcat.apache.org/tomcat-9.0-doc/config/valve.html
  • 각 호스트 접속시 영향을 주는 것들이라고 보면됩니다.
  • RemoteAddrValve 같이 IP 필터같은 필터 역활을 하는 것도있고 종류도 다양합니다.
  • 현재 강의와는 연관이 적다보니 궁금하신분들은 위 참고사항을 읽어보시기 바랍니다. 그렇다면 127.0.0.1 과 localhost 시에 서로 다른 사이트가 설정되도록 해보겠습니다. (로그밸브는 생략하도록 하겠습니다.)
<Engine name="Catalina" defaultHost="localhost">
	...
	<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
	</Host>

	<Host name="127.0.0.1" appBase="myHosts/ip" unpackWARs="true" autoDeploy="true">
	</Host>
	...
</Engine>

이렇게 된경우 아래와 같이 동작하게 됩니다. localhost 로 접속한경우 : 톰켓경로/webapps/ROOT 실행 : 톰켓기본페이지 127.0.0.1 로 접속한경우 : 톰켓경로/myHosts/ip/ROOT 실행 : 기본적으로 폴더는 생성해주셔야합니다. 톰켓을 재시작하면 정상적으로 위와같이 작동할 것 입니다. 하지만 ip의 경우 maven deploy 가 작동하지 않습니다. 이유는 manager가 설정되지 않아서 입니다.

  • 어떤 강의들 보면 webapps 에서 manager를 복사하라는 말이있는데... 권장하는 방법이 아닙니다.
  1. 톰켓폴더/conf/엔진이름<기본값:Catalina>/127.0.0.1/ 폴더로 이동합니다.
  2. manager.xml 을 아래와 같이 작성합니다. (톰켓에서 권장하는 기본값 : 호스트매니저로 생성할경우 이 파일을 자동으로 생성해준다.)
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="${catalina.home}/webapps/manager" privileged="true" antiResourceLocking="false" >
</Context>
  1. 톰켓을 재시작합니다. 이제 http://127.0.0.1 로도 maven deploy 가 작동하게 됩니다.
  • ${catalina.home}/webapps/manager} 을 대신해서 열어주기 때문. 이렇게 버추얼 호스팅은 완료되었습니다.!!

부록 : 왜 ROOT 폴더인가? + Context

톰켓 manager를 웹이나 maven을 통해서 이용해 보셨다면 ROOT 로 deploy 할 경우 메인으로 작동하는 것을 볼수 있습니다. 이유는 아래와 같이 host 아래 Context 값을 넣지 않을 경우 기본값으로 아래와 같이 잡히기 때문입니다.

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
	<!-- context를 생략하면 아래와 같은 기본값이 할당된다 -->
	<Context docBase="ROOT" path="/" />
</Host>

Context[docBase] : Host[webapps]/Context[docBase] 값이 기본 접근 폴더이다. (index.html의 폴더같은 기본 폴더라고 보시면됩니다.) Context[path] : docBase의 할당위치 즉 톰켓폴더/webapps/ROOT 를 해당 호스트의 / 에 할당한다는 뜻입니다.

  • http://localhost/ : 톰켓폴더/webapps/ROOT/인덱스페이지 또한 Host/Context 많은 옵션들을 쓸 수 있는데 벌써 알아차린 사람도 있겠지만 톰켓폴더/conf/context.xml 의 호스트별 설정입니다. 즉 톰켓폴더/conf/context.xml 가 범용설정이라면 Host/Context 는 단독설정이며 우선값이 더 높습니다.

또한 Context는 Host 태그안이 아닌 docBase 내에서도 설정할 수 있습니다.... Host[copyXML]="true" Host[deployXML]="true" 상태에서 /META-INF/context.xml 에도 사용할 수 있습니다.

추신

작성하다보니 설명병에 걸려서.. 엄청 길어졌네요.. 문서 분리하길 잘했... 하하하.....