Back-end/DEV notes

톰캣 tomcat 구조 파악하기.

cheersHena 2019. 4. 28. 17:09
반응형

톰캣 구조 파악하기.


web 서버

http 프로토콜 기반으로 web client (browser) 로부터의 요청을 서비스하는 기능을 담당하는 프로그램. 

ex) apache ..

역할: html, image, xml 등에 대한 처리 담당 


web Application 서버

여러 web client의 요구를 web서버가 감당할수없는 기능을 구조적으로 web서버와 분리하기 위해 만들어진것으로 web application server(WAS) 라고 한다. 

ex) tomcat, weblogic, jeus, jboss.. 


웹서버와 와스 차이점

Web server와 WAS는 사용 목적이 다르다.

web 서버: html, 이미지 요청등 정적데이터 요청을 처리하는데 빠르다.

WAS : servlet , jsp 등 비즈니스 로직을 수행하는데 적합하다. 

그렇다고 WAS가 html,이미지 등의 요청을 처리하지 못한다는 말은 아니다. 다만 처리속도가 web서버에 비해 느리기 때문이다. 이렇게 서로 다른 강점을 합해서 사용하기 위해 web server 와 WAS를 연동하여 서비스를 하는것이 대부분이다.


tomcat

톰켓은 jsp환경을 포함하고 있는 servlet 컨테이너이다.

서블릿 컨테이너는 사용자 입장에서 서블릿을 유지하고 호출하여 실행하는 쉘이다.

톰켓은 크게 3가지 컨테이너로 구분한다.

1. Stand-alone servlet containers (tomcat의 기본모드)

 - 내장된 웹서버 기능 사용

 - 기능면에서 java web server의 부분인 servlet 컨테이너와 java 근간의 웹 서버 사용.

2. In-process servlet containers

 -  servlet컨테이너는 웹서버 플러그인와 java 컨테이너 구현 

 - 웹서버 플러그인은 웹서버 주소공간 내 JVM을 열고 그 안에서 java컨테이너가 실행되도록 한다.

 - 다중스레드의 단일 프로세스 서버에 적합하고 퍼포먼스도 좋지만 확장성에 한계가 있음.


3. Out-of-process servlet container

 - 웹서버 플러그인과 웹서버의 외부 JVM에서 실행하는 java컨테이너 구현

 - 웹서버 플러그인과 java 컨테이너 JVM은 몇몇 IPC(보통은 tcp/ip소켓)를 사용해서 통신

 - out of process엔진반응 시간은 in process만큼 좋지 않지만 out of process엔진은 확장성과 안정성면은 좋다.



Tomcat directory 구조 


tomcat - tomcat 루트 폴더 

 |

└ bin - tomcat 실행에 필요한 서버동장 제어 스크립트 및 실행파일 (binary) , 

└ common -웹어플리케이션에서 공통적으로 사용하는 클래스 파일

└ conf - 서버 전체 설정파일 폴더 (server.xml 등 )

└ logs - 예외 발생 사항 등의 로그 저장

└ server - 서버에서 사용하는 클래스 라이브러리 

└ temp - 임시 저장용 폴더 

└ webapps - 어플리케이션 루트 폴더 

└ work - jsp 파일을 서블릿 형태로 변환한 java 파일과 class파일 저장 


  ※ tomcat의 work 디렉토리는  maven의 target디렉토리와 같다고 보면된다. 

      webapps의 웹어플리케이션 접근할때 컴파일한 결과물은 모두 work디렉토리에 생성된다. 

ex)

 tomcat/work 디렉토리 안에 웹어플리케이션과 똑같은 이름의 jsp파일에 대한 컴파일 결과가 저장된다. 


 

※ maven / target


target: maven으로 빌드시 생기는 jar파일을 저장하는 것이 주 용도.
로컬 개발중에는 이클립스안에서 모든것이 이뤄지기 때문에 별로 중요하지 않지만
프로젝트 결과물인 jar / war 를 실서버에 반영할때는 target 이하의 jar/war를 배포하게 된다.
지워도 상관없음 - 메이븐 빌드시 다시생김. 그래서 커밋의 대상은 아님.. 

그래서 타겟이하 소스를 변경해도 어차피 빌드하면서 삭제되고 새로운 target이 생성된다.. ;; 



* 표준 구조


web application(web root) - 루트폴더

            |

            |------------------WEB-INF- 웹어플리케이션 설정 및 참조 클래스 파일

            |                           |  

            |                          ├-------------------classes - java class 파일 

            |                           |---------------------lib - jar라이브러리 
            |                          └--------------------web.xml 
            |
            |-----------------META-INF 
            |                            └--------------------context.xml 
            |
           └--------------- html / jsp              




- 웹어플리케이션 보관소 생성을 용이하게 하기 위헤서 웹 어플리케이션의 실행파일들(즉, 웹 어플리케이션 실행시 톰켓이 사용하는 파일들) 을 WAR 형식에서 요구하는것과 같은 구성으로 정리하는게 편하다. 


- *.html , *.jsp 등 : 웹어플리케이션에서 클라이언트 브라우저로 전송되는 html과 jsp페이지와 다른 파일들 (예를들면 자바스크립트 , 스타일시트, 이미지 등..) 대규모 어플리케이션에서 이 파일들을 서브 디렉토리 체계로 나누어 놓을 수 있다. (그러나 규모가 작은 어플은 보통 하나의 디렉토리에서 관리)


- /WEB-INF/web.xml : 웹 어플리케이션의 배치 설명자 Web Application Deployment Descriptor 

 서블릿과 웹어플리케이션 구성하는 다른 컴포넌트들을 설명하고, 각종 초기화 파라메터들과 서버 기능을 활용하기 위한 컨테이너가 관리하는 보안 제한 구역을 지정하는 xml 파일. 


- /WEB-INF/classes/ : 웹 어플리케이션에서 사용하는 모든 자바파일 및 관련 자원.

 서블릿과 비서블릿 클래스 파일들이며 jar형태로 묶여있지 않는 상태다. 패키지가 선언된 클래스라면 /WEB-INF/classes를 기준으로 패키지의 디렉토리를 만들어 구성하면 된다.

 예를들어, 클래스명이 com.mypackage.myServlet 이라면 파일의 저장경로는 /WEB-INF/classes/com/mypackage/myServlet.class 가 된다. 


- /WEB-INF/lib/ : 웹어플리케이션에서 사용하는 자바클래스파일을 포함하는 Jar파일. 외부 클래스 라이브러리나 JDBC driver 등이 있다. 


- 톰캣을 어플리케이션에 설치할 때, WEB-INF/classes/ 에 있는 클래스들과 WEB-INF/lib/ 디렉토리에 있는  jar파일에 있는 모든 클래스들은 같은 웹 어플리케이션에서 사용하는 모든 클래스가 접근 가능하도록 되어있다. 

  따라서 이 디렉토리 안에 모든 라이브러리 클래스들을 넣으면 웹어플리케이션의 설치가 가능하며 시스템 클래스패스에 대한 조정이 필요없다.




톰캣 환경설정(server.xml)


-tomcat에서 주요한 환경설정 파일.

-컴포턴트에 대한 초기 설정 제공

- tomcat에 대한 구조 지정

- server.xml구조 및 계층적 엘리먼트


상위에 속성은 자동적으로 하위의 요소에 계승된다. 예를들어 <host>의 구성요소 <logger>의 속성은 아무것도 지정하지 않은 경우 <Engine>의 구성요소 <logger>의 설정이 사용된다. 변경이 필요한 경우에는 <host>의 구성요소 <logger>에 별도 설정을 함으로써 상위설정을 덮어쓸수 있다.


<server>

    | 

   └----<service>

               |

              ├---<connector>

               |

              └---<engine>

                         |

                        ├---<DefaultContext>

                        ├---<Realm>

                        ├---<logger>

                        └---<host>

                                  |

                                 ├---<Context>

                                 ├---<Value>

                                 ├---<Realm>  

                                 └---<logger>


1) server elements

 - tomcat서버 구성요소의 정의. 기본값은 <server port = "8005" shutdown="shutdown"> : port 8005를 감시하고 shutdown명령어를 접수하도록 설정되어있다. 서버에서는 복수의 서비스를 관련지을수 있다.


2) service elements

 -tomcat service의 구성요소 정의. <service>는 뒤에 기술할 <Engine>과 그것에 관련된 모든 <connector>를 그룹과 한것이다. 기본값은 <service name ="Catalina">

 -> 속성 - name : catalina라는 이름으로 서비스가 정의되어있고 에러로그 및 관리툴은 이 이름으로 식별한다.

 - 하나의 서버에 복수의 서비스를 정의하는 경우 다른 name속성을 기입해야한다.

 -<service>는 하나의 <engine>과 하나이상의 <connector>를 관련짓는것이 가능하다. 서버와 엔진의 관계는 1:1이다.


3) Engine elements

  - <engine>은 servlet 컨테이너의 인스턴스를 표시하며, <connector>로부터 보내진 요구를 처리한다.

  -기본값은 <Engine name="Catalina" defaultHost = "localhost">

  -> 속성 - name : <Engine>의 이름을 표시하며, 에러로그 및 관리툴은 이 이름으로 엔진을 식별한다.

             - defaultHost: server.xml에 정의되어있지 않은 <host>요구가 있을 경우 발송되는 가상 호스트 지정.

 -<engine>에는 하나 이상의 <host>가 관련지어져 있다. 


4) connect elements

  -요구를 엔진에 건네주는 역할을 하는것이 커넥터다. 서비스는 하나이상의 커넥터를 갖는다. 사용하는 http 또는 http/ssl등 여러가지 방법으로 엔진에 요구를 보낸다. 이것들의 접속요건의 처리는 커넥터구성요소에 맡겨진다. 각 프로토콜에 대해 복수의 커넷터를 갖는 것으로써 어떤 접속에서 요구가 와도 엔진이 동일하게 처리를 하고 커넥터에게 응답한다.


5) Realm elements

 -보안위해 role명과 사용자명, 비밀번호의 맵핑을 외부 DB로부터 가져오는 장치이다. tomcat은 UserDatabase, Memory, JDBC, JNDI등 몇개의 <Realm>을 가지고 있다.


6) Logger elements

 - 로그파일의 작성방법 설정. <logger> 는 server.xml 구조에서 보듯이 <engine>레벨에서 설정할 수 있다. 

 

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

prefix="server-log." suffix=".txt"

timestamp="true"/>


위 예제는 tomcat 의 FileLogger클래스를 사용, prefix, suffix, timestamp속성에서 로그 파일명을 정의한다. 이 경우 로그파일은 [server-log.2019_04.txt] 와 같은 형식으로 $catalina_home/log 디렉토리에 출력된다. 


7) host elements

 - <engine>에 관련된 가상호스트를 정의한다. 

 -기본값은 


<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">

가상호스트명을 localhost로 설정하고 appBase속성에서 어플리케이션이 탑재되어있는 디렉토리를 webapps로 설정하고 있다. 별도록 unpackWARs에서 war파일을 실행할 것인지 여부를 , autoDeploy속성에서는 톰켓이 기동중에 웹어플리케이션을 배치한 경우에 자동으로 읽어들일지 여부를 설정한다.


8) value elements

 - tomcat특유의 기능.<value>는 상위 구성요소로써의 필터처리를 담당한다.

 - <engine>, <host>, <context>와 관련짓는 것이 가능하다.  



서블릿 환경설정 - web.xml

 

1) catalina(tomcat설치폴더)/conf/web.xml


2) invoker이용하여 모든 서블릿을 호출할 수 있는 서블릿 지정.


<servlet>

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


  <servlet-class>

    org.apache.catalina.servlet.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>


3) servlet사용할 수 있도록 환경설정하고 servlet을 URL상에서 접근할수 있도록 경로명 지정


<servlet-mapping>

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

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

</servlet-mapping>








반응형