본문 바로가기

Service & Daemon

톰캣 설치 후 설정시 문제 발생 조치

1) 서블릿이 접근이 안되는 경우


/conf/web.xml 파일에서 invoker 서블릿의 매핑이 막혀있습니다.


<!-- The "invoker" servlet, which executes anonymous servlet classes -->

<!-- that have not been defined in a web.xml file. Traditionally, this -->

<!-- servlet is mapped to URL pattern "/servlet/*", but you can map it -->

<!-- to other patterns as well. The extra path info portion of such a -->

<!-- request must be the fully qualified class name of a Java class that -->

<!-- implements Servlet (or extends HttpServlet), or the servlet name -->

<!-- of an existing servlet definition. This servlet supports the -->

<!-- following initialization parameters (default values are in square -->

<!-- brackets): -->

<!-- -->

<!-- debug Debugging detail level for messages logged -->

<!-- by this servlet. [0] -->


<!--

<servlet>

<servlet-name>invoker</servlet-name>

<servlet-class>

org.apache.catalina.servlets.InvokerServlet

</servlet-class>

<init-param>

<param-name>debug</param-name>

<param-value>0</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

-->

...... 중략 .........


<!-- The mapping for the invoker servlet -->

<!--

<servlet-mapping>

<servlet-name>invoker</servlet-name>

<url-pattern>/servlet/*</url-pattern>

</servlet-mapping>

-->


위의 두곳의 매핑을 풀어 줍니다.


그리고 dtd에 의거하여

security-constraint 엘리먼트를 /conf/web.xml 파일의 welcome-file-list 엘리먼트 아래쪽에 추가 합니다.


<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>


<security-constraint>

<display-name>Default Servlet</display-name>

<web-resource-collection>

<web-resource-name>Disallowed Location</web-resource-name>

<!-- Define the context-relative URL(s) to be protected -->

<url-pattern>/servlet/org.apache.catalina.servlets.DefaultServlet/*</url-pattern>

<!-- If you list http methods, only those methods are protected -->

<http-method>DELETE</http-method>

<http-method>GET</http-method>

<http-method>POST</http-method>

<http-method>PUT</http-method>

</web-resource-collection>

<auth-constraint>

<!-- Anyone with one of the listed roles may access this area -->

<role-name>tomcat</role-name>

<role-name>role1</role-name>

</auth-constraint>

</security-constraint>


</web-app>


그후에 톰캣을 재시동하시고 테스트해보면 됩니다.


2) ROOT directory 변경


현재 apache 홈 디렉토리는 "/var/www/html"이고 톰캣의 홈은 "/usr/local/share/jakarta-tomcat-5.0.24/webapps/ROOT" 입니다.


이제 홈을 "/home/www"로 바꾸어 보겠습니다.


먼저 아파치에서는 DocumentRoot와 Directory를 바꾸어 줍니다.

DocumentRoot "/home/www"

<Directory "/home/www">


톰캣에서는


먼저 /home/www 밑에 WEB-INF폴더를 만들고 /var/www/html/WEB-INF 밑에 있는 web.xml 파일을 복사해 옵니다. 그리고 WEB-INF/classes를 만듭니다.


다음 conf/server.xml 파일에서


<Logger className="org.apache.catalina.logger.FileLogger"

directory="logs" prefix="localhost_log." suffix=".txt"

timestamp="true"/>


<!-- Define properties for each web application. This is only needed

if you want to set non-default properties, or have web application

document roots in places other than the virtual host's appBase

directory. -->

////// 추가 할 부분입니다.

<!-- Tomcat Root Context -->

<!--

<Context path="" docBase="ROOT" debug="0"/>

-->


<Context path="" docBase="/home/www" debug="0" reloadable="true"/>


<!-- Tomcat examples Context -->

<Context path="/examples" docBase="/usr/local/share/jakarta-tomcat-5.0.24/webapps/jsp-examples" debug="0" reloadable="true" crossContext="true">

</Context>

////////////// 여기 까지

</Host>


그런 다음 톰캣을 재시동합니다.


ROOT를 바꾸는 설정을 마칩니다.


여기서 reloadable="true" 라는 속성은 servlet이 변경되었을 경우 이 Context전체를 다시 읽겠느냐는 옵션입니다. 개발 중에는 "true"를 하시고 개발완료후에는 "false"를 하시는 것이 좋습니다.


3) 톰캣에서 컨덱스트의 추가


톰캣에서 컨텍스트를 추가 했다고 해서 아파치에서 자동으로 인식해 주신 않습니다.


그러므로 서로 연결해주어야 합니다.


/home/test 라는 디렉토리에 /test라는 컨텍스트를 연결하겠습니다.


먼저 /home/test 라는 디렉토리 밑에 WEB-INF/classes 라는 폴더를 만들고 web.xml이라는 파일을 WEB-INF 폴더에 복사를 합니다.


톰캣의 server.xml 에서


<Context path="/test" docBase="/home/test" debug="0" reloadable="true" crossContext="true">

</Context>


를 추가 해줍니다.


아파치에서 conf/httpd.conf 에서 Alias와 디렉토리 설정을 추가 해줍니다.


또한 디렉토리 설정에서 WEB-INF 디렉토리를 액세스 못하게 만들어 줄 필요가 있습니다.


Alias /test/ "/home/test/"


<Directory "/home/test">

Options Indexes MultiViews

AllowOverride None

Order allow,deny

Allow from all

</Directory>


# WEB-INF 접근을 못하게 막음

<Directory "/home/test/WEB-INF">

Order allow,deny

Deny from all

</Directory>


workers2.properties 에서


[uri:/test/*.jsp]

worker=ajp13:localhost:8009


[uri:/test/servlet/*]

worker=ajp13:localhost:8009


그리고 /home/test/WEB-INF/web.xml 파일에서


<security-constraint>

<display-name>Default Servlet</display-name>

<web-resource-collection>

<web-resource-name>Disallowed Location</web-resource-name>

<!-- Define the context-relative URL(s) to be protected -->

<url-pattern>/servlet/org.apache.catalina.servlets.DefaultServlet/*</url-pattern>

<!-- If you list http methods, only those methods are protected -->

<http-method>DELETE</http-method>

<http-method>GET</http-method>

<http-method>POST</http-method>

<http-method>PUT</http-method>

</web-resource-collection>

<auth-constraint>

<!-- Anyone with one of the listed roles may access this area -->

<role-name>tomcat</role-name>

<role-name>role1</role-name>

</auth-constraint>

</security-constraint>


를 추가 해줍니다.


4) 가상 호스트 설정


가상 호스트를 연결할 폴더를 만든다음에


아파치에서 가상호스트 셋팅을 합니다.


톰캣에서 conf/server.xml 파일에서

</Host> 다음에 줄에 새로운 <Host> ............. </Host> 를 추가해 줍니다.


............ 생략 ..............................

</Host>


<Host name="test1.or.kr" debug="0"

appBase="/home/vhost/testhome" unpackWARs="true">

<Context path=""

docBase="ROOT"

reloadable="true"/>

<Alias>www.test1.or.kr</Alias>

</Host>


<Host name="test2.com" >

<Context path=""

docBase="/home/vhost/testhome2"

reloadable="true"/>

<Alias>www.test2.com</Alias>

</Host>


Host 태그의 appBase 속성은 웹 어플리케이션(Context)들의 기준 디렉토리가 됩니다. Context에 있는 docBase가 상대경로일 경우 기준위치 된다는 뜻이죠.


예를 들면 ycpa.or.kr 의 ROOT Context의 루트디렉토리는 /home/vhost/testhome/ROOT 가 됩니다. unpackWARs 의 속성값이 "true" 일 경우 appBase 에서 정한 디렉토리에 WAR 파일이 있을 경우 Tomcat 이 자동으로 이 웹 어플리케이션의 압축을 풀고 Context를 설정하게 됩니다. 자동배치(auto deployment) 라고도 합니다.


<Alias> 태그는 apache의 ServerAlias 와 같은 역할을 합니다. 여러개의 Alias 를 걸어줄 경우, 태그를 나란히 여러 번 사용하면 됩니다.