다잇소


[IT/트랜드] Apache Tomcat 활용하기 ⑤ (Host와 Context 설정)

2017.07.30
 


 3. Web application 배포하기




3. Host와 Context 환경 설정 적용하기


이제 Web application의 directory 구조를 이해하고, Web application의 종류에 따라 배치도 이해 했습니다. Web application 자체는 Context 자체라고 했습니다. 우리가 Tomcat architecture에서 배운 가장 하위 수직 구조인 <Context> 설정에 따라, Web application container는 많은 변화를 줄 수 있습니다.  바로 상위 element인 <Host> 또한 직접적으로 Web application의 배포 환경에 영향을 미칩니다. Web application 배포에 어떻게 영향을 미치지는 알아 보도록 하겠습니다.


 


1) Host에 환경 설정하기


(1) appBase 변경


실제 운영을 하다 보면 Web application container의 기본 위치를 CATALINA_HOME/webapps아닌, 제 3의 위치가 될 수도 있습니다. 이러한 경우 <Host>의 속성인 appBase의 값을 실제로 Web Application container를 배포 할 위치로 지정하면, 효율적으로 관리 할 수 있습니다. appBase=”D:/Server/webapps/localhost”로 설정하여 보겠습니다. 지정하려는 directory를 만들어 줍니다.


여기에 이전에 작성했던 WebApp01.war을 D:/Server/webapps/localhost에 복사 해 넣습니다.










<Host name=“localhost”  appBase=D:/Server/webapps/localhost 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>



Tomcat를 기동하면 다음과 같이 directory WebApp01 생기는 것을 알 수 있습니다.


1501419259788


unpackWARs=”true” 설정이 되어, 해당 directory에 WebApp01.war은 WebApp01 directory에 압축이 풀립니다. false로 설정이 되면, WebApp01.war이 압축 상태에서 application이 호출이 됩니다.


Web browser 주소 창에 http://localhost/WebApp01/index.jsp을 입력합니다.


1501419259794


바뀐 appBase에서도 정상적으로 실행이 되고 있습니다. 그렇지만, autoDeploy와 deployOnStartup=”false”로 설정하면, WebApp01 directory도 생성되지 않고, WebApp01.war을 배포되지도 않습니다. 당연히 index.jsp도 호출이 불가능합니다. autoDeploy는 Tomcat이 구동 중에 deploy를 배포하는 것이고, deployOnStartup은 Tomcat이 기동 중에 배포를 하는 것 입니다. 둘 다 false로 설정하면 배포가 불가능하고, 둘 다 true로 한 경우는 2번 배포가 됩니다.


 


2) Context.xml 설정하기


Tomcat에 Web application container을 적재 할 때, context를 참고 합니다. 이 context는 두 번째 시간에 이야기 한 5 가지 수직 구조에서 가장 아래인 <Context>를 참고 합니다. 이 <Context> 정보는 4 곳에서 존재 할 수 있습니다. 일반적으로 context.xml은 다음과 같은 순서로 Tomcat은 찾아서, Web application container에 적용을 합니다.


server.xml에 <Context.xml> 참조하기 – 이 방법을 권장하지 않는 방법으로 설명을 생략하도록 하겠습니다.


CATALINA_HOME/conf/ENGINE_NAME/HOST_NAME/CONTEXT_PATH.xml 참조하기


<Host>의 속성이 xmlBase 값이 설정되지 않은 경우, 위치에 해당하는 file을 참조하게 됩니다. <Engine>의 name속성이 “Catalina“, <Host>의 name속성이 “localhost”이면, WebApp01의 context 설정 file의 위치는   “CATALINA_HOME/conf/Catalina/localhost/WebApp01.xml“이 됩니다. 이 방법이 가장 일반적인 방법입니다.


Web application WAR나 directory에 /META-INF/context.xml을 참조합니다.


마지막으로 CATALINA_HOME/conf/context.xml file를 참조하는 경우입니다. 이 경우는 다른 context file이 없는 경우 참조됩니다.


 


우리는 에 해당 방법에 대해서 설명하도록 하겠습니다. 예제는 WebApp03 context를 만들어 보도록 하겠습니다.


우선 CATALINA_HOME/conf/Catalina/localhost/WebApp03.xml을 다음과 같이 작성을 합니다.










<?xml version=‘1.0’ encoding=‘utf-8’?>


<Context docBase=“D:/Server/webapps/localhost/WebApp01” reloadable=“true” privileged=“true”>


</Context>



위 설정에서 관심 있게 볼 부분은 “docBase=“D:/Server/webapps/localhost/WebApp01”” 입니다. WebApp03.xml명이 하는 것은 path 속성 값이 /WebApp03이라는 것입니다. 이 뜻은 Web browser 주소 창에서 http://localhost/WebApp03/~으로 입력해야 한다는 뜻입니다. 다시 docBase 속성은 단순히 “WebApp01″이 아닌 “D:/Server/webapps/localhost/WebApp01“로 절대 경로 설정하였습니다. 이 경로에서 Web application를 찾겠다는 의미입니다.


index.jsp을 다음과 같이 작성을 하고 D:/Server/webapps/localhost/WebApp01에 저장합니다.










<%@ page contentType=“text/html;charset=utf-8” %>


<%@ page import=“java.util.Calendar” %>


<html>


<head>


<title>WebApp01 예제</title>


<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>


</head>


<body>


<div class=“content”>


<b>Hello Java Web Application World!!!</b>


<p><%= “Host “ + request.getServerName() %> 현재 시간은 <%=Calendar.getInstance().getTime()%> 입니다.</p>


<p>Context Path => <%= request.getContextPath() %> 입니다.</p>


<p>Context Real Path => <%= request.getRealPath(“.”) %> 입니다.</p>


</div>


</body>


</html>



Web Browser에서 http://localhost/WebApp03/index.jsp을 입력을 합니다.


1501419259805


위 결과를 보면, 접근 한 Context의 Path는 /WebApp03이고, 실제로 index.jsp file이 서버에 있는 위치는 “ D:\Server\webapps\localhost\WebApp01“는 것을 알 수 있습니다.


 


(1) Context Path의 변경


WebApp03.xml에 <Context>의 path 속성 값을 “/WebApp02″로 추가 하여도 실제로는 context path가 변경 되지 않습니다. 즉 여전히, 에서 http://localhost/WebApp03/~로 호출하여야 합니다. path 속성 값이 적용하려면, <Context>의 내용을 server.xml에 다음과 같이 설정하면 변경 한 값이 적용이 가능합니다.










<Host name=“localhost” appBase=“webapps” unpackWARs=“true” autoDeploy=“true”>


 <Context path=“/WebApp02” docBase=“D:/Server/webapps/localhost/WebApp01” reloadable=“true” privileged=“true”/>


</Host>



그러나, 이 방법은 권장하는 방법이 아닙니다. 오히려, 간단하게 WebApp03.xml를 WebApp02.xml로 file 명을 변경하면 됩니다. 이제 http://localhost/WebApp02/index.jsp”로 주소 창에 입력하도록 하겠습니다.


1501419259813
Context Path값이 “/WebApp02″로 바뀐 것을 알 수 습니다.


 


(2) Root Context인 ” 의 설정


Root Path는 domain(http://hostname)만을 Web browser 창에 입력을 하면 동작을 해야 하는 Web application container라고 보시면 됩니다. Tomcat에서 Root context를 만드는 방법은 WebApp02.xml의 이름을 ROOT.xml로 변경을 합니다. 다음은 server.xml의 <Host>의 appBase 속성 값을 변경하도록 하겠습니다. appBase 값을 “webapps2″로 설정을 합니다.










<Host name=“localhost” appBase=“webapps2 unpackWARs=“true” autoDeploy=“true”>


 <Context path=“/WebApp02” docBase=“D:/Server/webapps/localhost/WebApp01” reloadable=“true” privileged=“true”/>


</Host>



이제 다시 Tomcat를 기동하도록 하겠습니다.


이제 http://localhost/index.jsp이라고 Web browser의 주소 창에 입력 하도록 하겠습니다.


1501419259819


결과에서 볼 수 있듯이 Context Path 값이 “”인 것을 알 수 있습니다. ROOT.xml이라는 이름은 Tomcat에서 특별히 Root path라고 약속을 하였습니다.


 


(3) docBase의 변경


실제로 배포 할 시에는 CATALINA_HOME 아래 directory에 배포 하기 보다는 별도 application 공간에 배포를 합니다. 이럴 경우 간단하게 docBase의 속성 값을 변경하여 주면 가능합니다. 다시 server.xml에 <Host>에 appBase값을 webapps로 변경을 합니다. 그리고, ROOT.xml WebApp02.xml로 변경을 합니다.


“D:/Server/webapps/localhost/WebApp01” 값을 “D:/Server/webapps/localhost/WebApp02 으로 변경하겠습니다. 물론 기존의 directory명도 같이 변경하여 주시기 바랍니다.


1501419259825


Context Real Path의 값이 변경이 D:/Server/webapps/localhost/WebApp02“로 되는 것을 할 수 있습니다.


 


(4) reloadable의 역할


현재 기본적으로 <Context>의 reloadable값이 “true”로 설정이 되어 있습니다. 3 번째에서 Servlet 배치에 관한 설명을 하였습니다. 우선 Tomcat를 기동하여, http://localhost/WebApp02/HelloServletWorld을 주소 창에 입력하여 접근이 가능합니다. 이제 Tomcat이 기동 된 상태에서 다음과 같이 HelloServletWorld.java을 변경하겠습니다.










package person.bk.tomcat.example01;


 



 


public class HelloServletWorld extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


..


out.println(“<b>Hello Servlet World has changed!</b>”);



}


}



compile 후에 다시 HelloServletWorld.class을 WEB-INF/classes에 복사합니다. 잠시 후에 다시 Web browser에서 실행 후 보면 다음과 같은 결과를 볼 수 있습니다.


1501419259831


Tomcat의 재기동 없이, 재배포한 HelloServletWorld.java가 반영이 된 것을 알 수 있습니다. 이는 reloadable 값이 “true”일 경우, WEB-INF/classes와 WEB-INF/lib에 있는 모든 값의 변경을 주기적으로 확인하면서, 변경이 있는 새롭게 적재를 합니다. 즉 이는 성능에 많은 저하를 가져 옵니다.


 


이제 다시 reloadable값을 false 설정을 합니다. <Host>의 autoDeploy 속성 값이 “true”이므로, Tomcat를 다시 기동하지 않아도, Context의 변경 값을 다시 읽어 적재합니다.


이번에 다시 HelloServletWorld.java 원상태로 변경하고, class file을 다시 배포합니다. 이제 Web browser에서 몇 번을 실행해도 이전 상태로 돌아가지 않습니다.


 


<Host>의 autoDeploy 값과 <Context>의 reloadable의 성능에 큰 영향을 줍니다. 운영 시에는 반드시 두 개의 값을 false로 설정 후에 운영하여야 합니다.


<WatchedResource>의 활용


개발 시에는 <Host>의 autoDeploy와 <Context>의 reloadable가 true로 설정하여, 바로 바로 변경 결과를 확인 할 수 있습니다. <Context>의 하위 원소인 <WatchedResource>가 설정이 되면, 해당하는 file의 변경이 있을 다시 적재하여 줍니다. WebApp02.xml 다음과 설정하도록 하겠습니다.










<?xml version=‘1.0’ encoding=‘utf-8’?>


<Context docBase=“D:/Server/webapps/localhost/WebApp01” reloadable=“true” privileged=“true”>


<WatchedResource>WEB-INF/web.xml</WatchedResource>


</Context>



WEB-INF/web.xml의 변경 여부를 감시하도록 하였습니다.


Tomcat 재기동이 필요하지 않습니다. http://localhost/WebApp02/HelloServletWorld을 주소 창에 입력하여 정상적으로 동작하는 지 확인합니다.


이제 D:/Server/webapps/localhost/WebApp01/WEB-INF/web.xml 을 다음과 같이 변경하겠습니다.










<?xml version=“1.0” encoding=“UTF-8”?>


<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance” xmlns=http://java.sun.com/xml/ns/javaee” xsi:schemaLocation=http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd” version=“3.0”>



  <servlet-mapping>


    <servlet-name>HelloServletWorld</servlet-name>


    <url-pattern>/HelloServletWorld3</url-pattern>


  </servlet-mapping>



</web-app>



다시 같은 URI로 확인을 하면 다음과 같이 오류 화면을 볼 수 있습니다.


1501419259843


주소 창에 http://localhost/WebApp02/HelloServletWorld3라고 입력을 해 보겠습니다.


1501419259849


새롭게 주소가 변경 된 것을 볼 수 있습니다.




 




설정된 프로필 사진이 없습니다.
| Wise리더
관심분야 IT,여행,맛집

카테고리 레이어 닫기