안녕하세요. 

요즘 많이들 사용하고 계시는 미들웨어 오픈소스 RedHat 계열인 JBOSS와 커뮤니티 버전인 wildfly 가 있습니다.

예전에는 JBoss-EAP 와 JBoss 커뮤니티 버전으로 나뉘었었는데, 

REDHAT 에서 JBoss-EAP 상용버전과 명칭이 헷갈려서 Wildfly 이름으로 변경됐습니다.

그때가 아마.. 2016년도쯤..이였던걸로 기억이 나네요

 

오픈소스를 소개해드린 만큼 WildFly Cluster 방식에 대해 구성하는 방식을 설명드리겠습니다.

우선 기본적으로 WildFly 가 설치되있다는 기준하에 설명을 진행하겠습니다.

 

Wildfly 를 서로 다른장비에서 cluster 하려고 하면 크게 두가지 방식이 있습니다.

standalone-ha 방식과 domain 방식이 존재합니다.

 

위 방식의 차이는 메뉴얼에 자세히 나와있으니 방식에 대한 설명은 건너띄고.. standalone-ha 를 사용해서 domain 모드보다 심플하게 관리하고 싶을때

UDP방식의 멀티캐스트 방식이 아닌 TCPPING 방식으로 cluster을 하는 방법에 대해 정리하겠습니다.

http://docs.wildfly.org/14/High_Availability_Guide.html#JGroups_Subsystem

 

standalone-ha 방식에 대해 정리 (TCPPING) 

wildfly 14버전의 jgroup 메뉴얼에는 TCPPING 방식에 대해 정의되있지 않습니다.

하지만, 기존 버전에는 설정 지원이 됐었고 번거롭게 UDP방식의 멀티캐스트 방식이 아닌 심플하게 서버대 서버로 TCP통신을 해서 간단하게 cluster을 하고 싶을때 사용하면 좋은 방식입니다.

 

1. standalone-ha 로 구성합니다.

  • 파일 : standalone-ha.xml
  • 내용 : 붉은색 표시된 부분을 추가해주시고 기존  불필요한 UDP부분은 삭제하시면 됩니다. 
             추가로 port-offset은 0으로 구성했으며, 0값일때 사용되는 TCP 7600 port을 그대로 사용했습니다. 
             충돌날경우 사용환경에 맞게 변경해서 사용하세요.
1,2번 서버 공통 TCP로 변경한다.


         <subsystem xmlns="urn:jboss:domain:jgroups:6.0">
            <channels default="ee">
                <channel name="ee" stack="tcp" cluster="ejb"/>
            </channels>
            <stacks>
                <stack name="tcp">
                    <transport type="TCP" socket-binding="jgroups-tcp"/>
                    <socket-discovery-protocol type="TCPPING" socket-bindings="jgroups-test1 jgroups-test2" />
                    <protocol type="MERGE3"/>
                    <protocol type="FD_SOCK"/>
                    <protocol type="FD_ALL"/>
                    <protocol type="VERIFY_SUSPECT"/>
                    <protocol type="pbcast.NAKACK2"/>
                    <protocol type="UNICAST3"/>
                    <protocol type="pbcast.STABLE"/>
                    <protocol type="pbcast.GMS"/>
                    <protocol type="MFC"/>
                    <protocol type="FRAG2"/>
                </stack>
            </stacks>
        </subsystem>

 

 

1,2 번 서버 공통 any 추가해주고 ip만 변경


     <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:127.0.0.1}"/>
        </interface>
        <interface name="private">
            <inet-address value="${jboss.bind.address.private:127.0.0.1}"/>
        </interface>
          <interface name="any">    // 임의로 any2 이름 생성
              <inet-address value="10.10.10.1"/>    //  1번 서버의 경우 10.10.10.1 IP사용,
          //   2번 서버일 경우 10.10.10.2 고정 IP를 사용
          </interface>


    </interfaces>
1,2번 서버 공통으로 아래 변경사항을 추가합니다


<socket-binding-group name="standard-sockets" default-interface="any" >
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>
        <socket-binding name="http" port="${jboss.http.port:8080}"/>
        <socket-binding name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="jgroups-tcp" interface="any" port="7600"/>       
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>


        <!-- other configuration here -->
        <outbound-socket-binding name="jgroups-test1">
            <remote-destination host="10.10.10.1" port="7600"/>
        </outbound-socket-binding>
        <outbound-socket-binding name="jgroups-test2">
            <remote-destination host="10.10.10.2" port="7600"/>
        </outbound-socket-binding>
    </socket-binding-group>

 



keycloak 에서 session cluster 을 사용하고자 할 경우 wildfly 와는 좀 다릅니다.
<cache-container name="keycloak"> 명시되있기에 해당 부분에서 owners 를 연결하는 서버 수 만큼 적어줘야 하며,
서로 다른 서버의 session 경우를 하고 자 할 경우 서버 수 만큼 서로의 세션을 복제해야 하므로 owners 를 정해줘야 합니다
 
        <subsystem xmlns="urn:jboss:domain:infinispan:7.0">
            <cache-container name="keycloak">
                <transport lock-timeout="60000"/>
                <local-cache name="realms">
                    <object-memory size="10000"/>
                </local-cache>
                <local-cache name="users">
                    <object-memory size="10000"/>
                </local-cache>
                <distributed-cache name="sessions" owners="2"/>
                <distributed-cache name="authenticationSessions" owners="2"/>
                <distributed-cache name="offlineSessions" owners="2"/>
                <distributed-cache name="clientSessions" owners="2"/>
                <distributed-cache name="offlineClientSessions" owners="2"/>
                <distributed-cache name="loginFailures" owners="2"/>
                <local-cache name="authorization">
                    <object-memory size="10000"/>
                </local-cache>
                <replicated-cache name="work"/>
                <local-cache name="keys">
                    <object-memory size="1000"/>
                    <expiration max-idle="3600000"/>
                </local-cache>
                <distributed-cache name="actionTokens" owners="2">
                    <object-memory size="-1"/>
                    <expiration max-idle="-1" interval="300000"/>
                </distributed-cache>
            </cache-container>

2. 기동스크립트 옵션 추가 

  • 옵션 추가 :  export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp"
    udp -> tcpping 로 변경했으나, 좀 더 명확한 작업을 위해 tcp  명시
  • 옵션 추가 :  export JAVA_OPTS=" $JAVA_OPTS -Djboss.as.management.blocking.timeout=3600"
  •  ERROR 내용 : Lost data because of graceful leaver pSso2_prd_sso_keycloak_1 에러 발생시 아래 옵션을 추가합니다.
      왜 추가하는지는 메뉴얼 참고해주세요.
      전 해결책만 제시해드리겠습니다.

10:53:25,396 INFO  [org.infinispan.CLUSTER] (remote-thread--p9-t3) [Context=keycloak-server.war] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11
10:53:25,407 INFO  [org.infinispan.CLUSTER] (remote-thread--p7-t2) [Context=client-mappings] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11
10:53:25,407 INFO  [org.infinispan.CLUSTER] (remote-thread--p9-t3) [Context=default-server] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11
10:53:25,424 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=sessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1
10:53:25,424 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=sessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,445 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=clientSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1
10:53:25,445 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=loginFailures] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1
10:53:25,446 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=loginFailures] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,446 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=clientSessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,449 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=actionTokens] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,461 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=work] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,462 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=offlineSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1
10:53:25,462 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=offlineSessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12
10:53:25,464 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=offlineClientSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1
10:53:25,464 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=authenticationSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1



3. <distributable/> 설정 추가

session 공유를 위해서 배포할 war에 WEB-INF/web.xml 설정에 <distributable/>을 추가합니다.
keycloak 경우는 별도 안해도 위에 설정한 jboss:domain:infinispan 부분에 추가되있어서 괜찮습니다.

<web-app>
....
<distributable/>
</web-app> 

4. Session Cluster Log 확인

cluster 성공 및 session cluster 잘 됐는지 로그를 확인합니다

session cluster 을 구성한뒤, 1번 서버를 내리고 2번서버에 세션연결이 잘되는지 테스트 해보고..
또 반대로 2번 서버 내리고 1번서버 기동시 세션이 잘 유지되는지 확인해야 합니다.
2개의 서버중 한대를 다운했을때 wildfly 서버 로그에는 아래와 같이 After merge 된 로그가 나와야지 정상 작동 된 겁니다. 
아래 로그 내용은 2대의 keycloak 를 wildfly 14버전으로 구성한뒤 각 서버를 shutdown 했을때 정상적으로 세션클러스터링이 된 것을 설명한 로그입니다.




11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t54) [Context=sessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=authenticationSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t29) [Context=offlineClientSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,960 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t54) [Context=clientSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,965 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=work] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,967 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=offlineSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,968 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=loginFailures] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:26,969 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=actionTokens] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:27,051 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]
11:07:27,051 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster
11:07:27,053 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]
11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster
11:07:27,054 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p23-t29) [Context=keycloak-server.war] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:27,054 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p23-t2) [Context=default-server] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]
11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster
11:07:27,057 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p24-t1) [Context=client-mappings] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12
11:07:49,987 INFO  [stdout] (default task-1) 20190219 11:07:49 [NONE] LoadJarBytes scouter.http 13520 bytes

끝으로.. 

이번 테스트는 keycloak 에 삽입된 wildfly 14 (최신버전)을 사용하여 cluster 구성해봤습니다.

 

UDP 방식이 아닌 TCPPING 방식으로 구현하다 보니 wildfly 14버전 메뉴얼에 없는 내용을 추가해야 했고, 

기존버전을 참고해서 any 사용 이나 owner=2등 

메뉴얼에는 없지만, 구성을 해야 하는 부분이 있어 난이도가 좀 있었습니다만, 참고하셔서 성공하시길 바랍니다.

 

 

  •  

각 화면별 이미지로 올려드립니다.

클릭하면 크게 보실수 있으시니 프린터로 출력해서 사용하세요

 

 

 

 

각 화면별 이미지로 올려드립니다.

클릭하면 크게 보실수 있으시니 프린터로 출력해서 사용하세요

 

 

 

 

 

 

안녕하세요.  

첫 시간으로 미들웨어 아키텍처 설계를 할때 가장 많이 사용되는 3-TIER 방식에 대해 설명드리고, 

3-tire을 설계할때 필요한 WEB, WAS 이중화 방식에 대해 정의해보겠습니다.

 

"미들웨어(middleware)는 응용 소프트웨어가 운영 체제로부터 제공받는 서비스 이외에 추가적으로 이용할 수 있는 서비스를 제공하는 컴퓨터 소프트웨어이다"

https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4 

 

 

1. 3-Tier 이란?

 

  • Client: 사용자
  • Web Server: Client의 요청을 처리하는 첫 관문이며, Static 이미지나, was로 전달해주는 역활을 주로 합니다. 
  • WAS: Web Application Server 애플리케이션을 처리합니다.
  • DB: 데이터베이스

 

 

 

2. 미들웨어의 종류

미들웨어의 종류는 아주 많습니다.

여기서 미들웨어의 역사 공부를 하고자 하는 것이 아니므로 오픈소스로 자주 사용하는 것들만 나열하겠습니다.

요즘은 Apache 보다도 Nginx 를 Proxy활용용도로 더 자주 사용하는 추세입니다.

 

  • WEB : Apache, Nginx
  • WAS : Tomcat, JBoss-eap, Wildfly, SpringBoot

 

 

3. 미들웨어 이중화란?

미들웨어를 구성할때 리스크를 줄이고 서비스의 안전성, 확대성, 고성능을 위해서 일반적으로 이중화 작업을 진행합니다.

위에 명시해드린 3-tier 방식에서 (WEB, WAS) 이중화를 진행하는 방식은 이중화 구성에 대해 가장 간편한 방법 입니다

 

 

4. Apache(1대) & Tomcat(2대) 로드밸런싱 설정

apache 다운로드 : https://httpd.apache.org/download.cgi

apache 메뉴얼 : https://httpd.apache.org/docs/2.4/

 

 

샘플) Apache 1대 & Tomcat 2대

- 아래 샘플은 Apache 1대에 Tomcat 2대를 연결한 구성입니다.

- 이것 또한 미들웨어 이중화에 해당하는 구조이나 Tomcat & Tomcat 간 Cluster 구성설정은 추가되지 않았습니다.

-  Apache (WEB) 서버의 로드밸런서라 보시면 됩니다.



(1) <APACHE_HOME>/conf/httpd.conf
# Include mod_jk's specific configuration file
Include conf/mod-jk.conf
파일의 맨 끝에 위와 같이 mod-jk.conf 를 include 하는 것을 추가


(2) <APACHE_HOME>/conf/mod-jk.conf
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so

# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"

# Mount your applications
JkMount /test-jboss/* loadbalancer    <-- 안넣어도 무관

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm

# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
웹 어플리케이션의 context-root 가 /text-jboss 이기 때문에 JkMount 에 설정하였습니다.


(3) <APACHE_HOME>/conf/uriworkermap.properties
# Simple worker configuration file

# Mount the Servlet context to the ajp13 worker
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer
/=loadbalancer
/*=loadbalancer
/*=loadbalancer   웹 어플리케이션의 context-root 로 마운트 포인트를 설정합니다.


(4) <APACHE_HOME>/conf/workers.properties
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,jkstatus

# Define Node1
worker.cluster1.port=8009
worker.cluster1.host=10.10.10.1
worker.cluster1.type=ajp13
worker.cluster1.cachesize=10

# Define Node2
worker.cluster2.port=8009
worker.cluster2.host=10.10.10.2
worker.cluster2.type=ajp13
worker.cluster2.cachesize=10

# Load-balancing 
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=cluster1,cluster2
worker.loadbalancer.sticky_session=1

# Status worker for managing load balancer
worker.jkstatus.type=status
인스턴스에 해당하는 AJP 1.3 포트를 설정합니다.
 
(5) apache 재기동 합니다.

 

tomcat의 로그종류
 
1. catalina.out : 서버의기동,정지, 서비스의개시, 정지정보, standard output, standard error
 
2. catalina.YYYY-MM-DD.log : 서버의기동,정지, 서비스의개시, 정지정보(tomcat 자체에관한)
 
3. host-manager.log : Tomcat Host Manager Web app 로그 (가상호스트매니저)
 
4. manager.log : Tomcat Manager Web App 로그 (웹콘솔)
 
5. localhost.log : host( VirtualHost 같은) 한정한 로그
 
6. stderr.log : 표준에러출력
 
7. stdout.log : 표준출력
 
8. admin.log : tomcat web server adminstartionTool 로그
 
*catalina.out과 catalina.log 의 차이점: 서로 유사한것처럼 보이나 tomcat에서 생성하는 로그 이외에 standard output, standard error 의 로깅은 제외된다.
 
즉, 소스에서 System.out.println 이나 System.err.println 으로 남기는 로그가 있다면
 
그 내용은 오직 catalina.out 에서만 찾아볼 수 있다.
 
(standard output : 웹페이지에 코딩해논 system.out.println() 디버그 메시지 출력)
 
1. Logrotate 데몬으로 rotate 하기
 
$ cd /etc/logrotate.d
 
$ cat &gt; tomcat
 
/var/local/tomcat/logs/catalina.out { =&gt;톰캣의 로그가 기록될 경로로 지정
 
Copytruncate #백업본을 생성하면 원본의 내용을 지우는 형태
 
Daily           # '일'단위 파일생성 로그파일을 1일에 한번 백업
 
rotate 30      # 보관주기는 30일 단위(이후삭제?) 최대로그파일개수를30개제한
 
Missingok     # 로그파일이 생성되지 않는 경우 오류처리 하지 않음
 
notifempty   # 로그로 기록할 내용이 없을때 신규로그파일 생성안함
 
Dateext       # YYYYMMDD 형식으로 생성
 
#Compress # 'rotate' 내 로그파일은 압축보관(gzip)
 
}
 
1.1  test 해보기
 
[root@yui logrotate.d]# /usr/sbin/logrotate -d /etc/logrotate.d/tomcat6
 
reading config file /etc/logrotate.d/tomcat6
 
reading config info for /home/monwas/apache-tomcat-7.0.82/logs/catalina.out
 
 
 
Handling 1 logs
 
 
 
rotating pattern: /home/monwas/apache-tomcat-7.0.82/logs/catalina.out monthly (1 rotations)
 
empty log files are not rotated, old logs are removed
 
considering log /home/monwas/apache-tomcat-7.0.82/logs/catalina.out
 
log does not need rotating =&gt; 아직 설정값의 날짜가 되지 않아서 순환할 필요없음.
 
 
 
날짜 변경
 
[root@yui logrotate.d]# vi /var/lib/logrotate.status
 
"/home/monwas/apache-tomcat-7.0.82/logs/catalina.out" 2018-6-29 를 한달전인
 
"/home/monwas/apache-tomcat-7.0.82/logs/catalina.out" 2018-5-29 로 변경
 
 
 
실행
 
[root@yui logrotate.d]# /usr/sbin/logrotate /etc/logrotate.d/tomcat6
 
 
 
logs 디렉토리 확인
 
[WAS@yui logs]$ ls -lrt
 
total 12
 
-rw-rw-r-- 1 WAS WAS    0 Jun 29 15:55 manager.2018-06-29.log
 
-rw-rw-r-- 1 WAS WAS    0 Jun 29 15:55 host-manager.2018-06-29.log
 
-rw-rw-r-- 1 WAS WAS    0 Jun 29 15:55 localhost_access_log.2018-06-29.txt
 
-rw-rw-r-- 1 WAS WAS 1796 Jun 29 16:14 localhost.2018-06-29.log
 
-rw-rw-r-- 1 WAS WAS 8133 Jun 29 16:23 catalina.out-20180629
 
-rw-rw-r-- 1 WAS WAS    0 Jun 29 16:23 catalina.out
 
 
 
2. log level 변경
 
catalina.log info 변경
 
1catalina.org.apache.juli.FileHandler.level = INFO
 
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
 
1catalina.org.apache.juli.FileHandler.prefix = catalina.[/code]
 
catalina.out info 변경 (catalina.out은 날짜별로 log를 관리하지못함)
 
TOMCAT_HOME/conf/logging.properties 에서 아래 FINE를 INFO로 변경
 
java.util.logging.ConsoleHandler.level = FINE
 
java.util.logging.ConsoleHandler.formatter = java.util.logging.simpoleformatter
 
 
3. 불필요한 로그 없애기
 
3-1. catalina.out 삭제
 
파일의 용량이 커진다고 무조건 지우면안되고 아래를 이용해야함.
Tomcat shutdown 후 로그 삭제하고 스크립트 변경
TOMCAT_HOME/bin/catalina.sh
 
검색어 : CATALINA_OUT
 
touch "$CATALINA_OUT"
 
if [ "$1" = "-security" ] ; then
 
if [ $have_tty -eq 1 ]; then
 
echo "Using Security Manager"
 
fi
 
shift
 
eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
 
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
 
-Djava.security.manager \
 
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
 
-Dcatalina.base="\"$CATALINA_BASE\"" \
 
-Dcatalina.home="\"$CATALINA_HOME\"" \
 
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
 
org.apache.catalina.startup.Bootstrap "$@" start \
 
#  &gt;&gt; "$CATALINA_OUT" 2&gt;&amp;1 "&amp;"
 
&gt;&gt; /dev/null 2&gt;&amp;1 &amp;
 
 
 
else
 
eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
 
-Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
 
-Dcatalina.base="\"$CATALINA_BASE\"" \
 
-Dcatalina.home="\"$CATALINA_HOME\"" \
 
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
 
org.apache.catalina.startup.Bootstrap "$@" start \
 
# &gt;&gt; "$CATALINA_OUT" 2&gt;&amp;1 "&amp;"
 
&gt;&gt; /dev/null 2&gt;&amp;1 &amp;
 
 
 
fi

+ Recent posts