remagine

아파치 톰캣으로 프로젝트 관리하기 4 본문

UNIX,LINUX

아파치 톰캣으로 프로젝트 관리하기 4

remagine 2017. 8. 9. 18:45

아파치 톰캣으로 프로젝트 관리하기 4




1.  Centos에서 톰캣으로 프로젝트 띄우기


연동을 하기전에 톰캣부터 작동시키겠습니다. 복수의 프로젝트를 띄우기 위해서 webapp폴더에 war파일을 두지 않고 폴더를 각각 생성합니다.


[root@localhost vic]# ll tomcat

lrwxrwxrwx. 1 arthur arthur 20  8월  7 10:53 tomcat -> apache-tomcat-7.0.72


심볼릭 링크를 만들어 놓은 것을 확인합니다.


tomcat 폴더에 관리할 프로젝트마다 폴더를 생성합니다.

[root@localhost tomcat]# ll

합계 96

-rw-r--r--. 1 arthur arthur 56846  9월 14  2016 LICENSE

-rw-r--r--. 1 arthur arthur  1239  9월 14  2016 NOTICE

-rw-r--r--. 1 arthur arthur  8965  9월 14  2016 RELEASE-NOTES

-rw-r--r--. 1 arthur arthur 16195  9월 14  2016 RUNNING.txt

drwxrwxr-x. 7 arthur arthur    69  8월  7 11:37 admincp

drwxr-xr-x. 2 arthur arthur  4096  8월  8 10:30 bin

drwxr-xr-x. 2 arthur arthur   158  8월  7 18:56 conf

drwxrwxr-x. 7 arthur arthur    69  8월  7 19:12 ioffer

drwxr-xr-x. 2 arthur arthur  4096  8월  7 11:27 lib

drwxr-xr-x. 2 arthur arthur     6  9월 14  2016 logs

drwxr-xr-x. 2 arthur arthur    30  8월  7 10:52 temp

drwxr-xr-x. 2 arthur arthur     6  9월 14  2016 work


admincp 와 ioffer라는 폴더가 생성되었습니다.


먼저 admincp 프로젝트를 띄워보겠습니다.



기본 폴더구조에서 webapps, conf, logs, temp, work폴더만 생성해 줍니다.


bin, common, server, lib 폴더내용은 공유합니다.


webapps 폴더에 ROOT.war파일을 복사합니다. 


그리고 기존 conf파일을 admincp/conf 폴더로 복사합니다.


cp /home/vic/tomcat/conf /home/vic/tomcat/admincp/conf




server.xml 구조


<Server>

      |    

      +---<Service>

                  |

                  +---<Connector>

                  |

                  +---<Engine>

                              |

                              +---<DefaultContext>

                              |

                              +---<Realm>

                              |

                              +---<Logger>

                              |

                              +---<Host>

                                          |

                                          +---<Context>

                                          |

                                          +---<Valve>

                                          |

                                          +---<Realm>

                                          |

                                          +---<Logger>




server.xml은 위와 같은 계층구조로 이뤄져 있다. 모두 설정이 반드시 필요한 것은 아닌듯..




server.xml은 톰캣 서버에 주요 설정파일입니다. 


톰캣이 작동할 때 생성될 Container, 구성요소들을 정의해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
 
  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
 
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->
 
 
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->
 
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 
 
    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->
 
    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">
 
      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->
 
      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
 
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
 
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->
 
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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>
  </Service>
</Server>
 
cs





1.  Server : 기본으로 8005 포트사용


<Server port="8105" shutdown="SHUTDOWN">


8105포트로 SHUTDOWN 명령을 전달하면 TOMCAT을 종료한다는 의미입니다. 




Server 안에 여러 정의가 가능합니다.


  <GlobalNamingResources>


  <Resource ....... />


  </GlobalNamingResources>


Was가 연결할 DataBase의 정보를 담은 Tag 


Application의 web.xml에 mapping된 정보와 호환됩니다. 



 <!--APR library loader. Documentation at /docs/apr.html -->

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />


Listener,GlobalNamingResources 는 server의 하위 요소입니다.


Listener는 특정 이벤트를 리스닝하고 이벤트 발생시 응답하는 기능을 가지고 있습니다.


2. Service : 기본적으로 Catalina라는 name의 서비스가 정의 되 있습니다.  한개의 서버에는 복수의 서비스가 정의될 수 있고, 한개의 서비스는 한개의 Engine과 여러개의 Connector를 가질 수 있습니다. 이 서비스의 name 값을 가지고 에러로그 및 관리툴을 관리합니다.



<Service name="Catalina">


3. Engine : 


<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1">



 Engine은 Tomcat 위에 구동된 Servlet Container 객체 하나를 말합니다. 기본적으로 Connector를 통해 전달된 요구를 처리하는 Java 구현체라고 생각하면 될 듯 합니다. 

name 속성은 이름을 뜻하고, 에러 로그 및 관리툴은 이 이름으로 Engine을 식별하니다.

defaultHost는 Virtual Host, Http request의 host값이 mapping이 된 것이 없을때 기본으로 연결시키는 주소입니다.

jvmRoute는 로드밸런싱을 구현할 때 , 한개의 톰캣에서 여러개의 프로젝트를 돌릴때 쓰는 것 같습니다.


4. Connector 


커넥터는 클라이언트의 요구를 Engine에 전달하는 기능을 합니다. 커넥터는 복수가 준비 될 수 있습니다.

https 8443

http 8080

ajp 8009 


톰캣에는 3가지 커넥터가 있습니다. 




    <!-- A "Connector" using the shared thread pool-->

    <Connector executor="tomcatThreadPool"

               port="8080" protocol="HTTP/1.1"

  server="Server"

               maxPostSize="-1"

               maxKeepAliveRequests="2000"

               connectionTimeout="30000"

               enableLookups="false"

               useBodyEncodingForURI="true"

               acceptCount="2000"

               redirectPort="8443" />

   


커넥터 설정은 클라이언트에서 요청 url의 포트를 가지고 Connector를 정해줍니다. 위 설정에 보면 redirectPort = 8443 이 설정되어있습니다. SSL 요청이 들어오면 8443 포트로 요청을 넘기겠다는 것입니다. 포트 사이즈는 -1로 잡아 차단되어있네요



5. Host



      <!-- Define the default virtual host

           Note: XML Schema validation will not work with Xerces 2.2.

       -->

      <Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true"

            xmlValidation="false" xmlNamespaceAware="false">




VirtualHost를 의미합니다. Http1.1에서 추가된 Host 내용을 통해 어떤 name의 VirtualHost로 연결할 질 결정합니다. 

기본적으로 localhost가 디폴트입니다.



6. Context


웹 어플리케이션을 의미합니다.

Context 태그가 없다면, webapps 폴더안에 ROOT.war 파일을 기준으로 ROOT폴더에 어플리케이션을 배포합니다.


7. Valve



Tomcat Valve

tomcat 4 에 도입됐는데, tomcat의 container level 에서 http request, response 의 pre-processing 을 가능하게 해주는 기술이다.

valve 들은 java class 의 instance 를 특정 Catalina container 와 연관되게 해준다.

configured valve class 는 container 로 오는 모든 request 에 preprocessor 처럼 동작한다.

이 설정(configuration)은 named-class 가 각각의 request 에 대한 pre-processor로 동작하게 해주는데, 이 named-class 를 valve 라 부른다.

org.apache.catalina.Valve interface 를 상속받아서 만든다. 좀 더 구현을 쉽게 하게 하기 위해서 org.apache.catalina.valves.ValveBase 라는 abstract class 도 지원한다.

Valve 는 어느 Catalina container(Engine, Host, Context  같은)에도 묶을 수 있다. Context 에 묶으면 특정 web application 에만 관여하는 valve 가 되는 것이고, Host 에 묶으면 특정 host 로 오는 모든 web application 에 관여하는 valve 가 되는 식이다.


http://i5on9i.blogspot.kr/2014/07/tomcat-valve-servlet-filter.html


요청하는 파이프라인 사이에 추가되어 특별한 처리를 수행하는 컴포넌트입니다. 마치 인터셉터같이 요청과 응답사이에 전처리를 실행할 수 있게 합니다. 


 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  

             prefix="ioffer_access_log." suffix=".log" pattern="combined" resolveHosts="false"/>


이런식으로 Valve를 두게 되면 logger를 특정할 수 있게 됩니다. 



























Comments