톰켓에 로그 파일이 복잡하게 생성되어 관리가 복잡합니다.

관련해서 운영에 필요한 정보만(catalina.out 1개 파일만 관리) 생성하도록 처리하는 방법입니다.

 

** 기관에 납품하기전 관련내용 확인 후 변경여부 결정하시기 바랍니다. **

 

 

** handlers 관련 변경하고 나머지 모두 주석처리

# vi $CATALINA_HOM/conf/logging.properties

    handlers = java.util.logging.ConsoleHandler
    .handlers = java.util.logging.ConsoleHandler

    #handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-    manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
    #
    #.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
    #
    #############################################################
    ## Handler specific properties.
    ## Describes specific configuration info for Handlers.
    #############################################################
    #
    #1catalina.org.apache.juli.FileHandler.level = FINE
    #1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    #1catalina.org.apache.juli.FileHandler.prefix = catalina.
    #
    #2localhost.org.apache.juli.FileHandler.level = FINE
    #2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    #2localhost.org.apache.juli.FileHandler.prefix = localhost.
    #
    #3manager.org.apache.juli.FileHandler.level = FINE
    #3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    #3manager.org.apache.juli.FileHandler.prefix = manager.
    #
    #4host-manager.org.apache.juli.FileHandler.level = FINE
    #4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    #4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
    #
    #java.util.logging.ConsoleHandler.level = FINE
    #java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    #
    #
    #############################################################
    ## Facility specific properties.
    ## Provides extra control for each logger.
    #############################################################
    #
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler
    #
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler
    #
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
    #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler
    #
    ## For example, set the org.apache.catalina.util.LifecycleBase logger to log
    ## each component that extends LifecycleBase changing state:
    ##org.apache.catalina.util.LifecycleBase.level = FINE
    #
    ## To see debug messages in TldLocationsCache, uncomment the following line:
    ##org.apache.jasper.compiler.TldLocationsCache.level = FINE

 

 

** Valve 부분 주석처리

# vi $CATALINA_HOME/conf/Catalina/localhost/ROOT.xml

    <?xml version='1.0' encoding='utf-8'?>
    <Context docBase="/usr/local/jakarta/nextbsc/WebRoot" path="/" reloadable="true" antiResourceLocking="false" antiJARLocking="false">
        <Loader delegate="false"/>
        <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" prefix="localhost_access_log." suffix=".txt" pattern="common"/>-->
        <Resource name="jdbc1/dbms" auth="Container" description="DB Connection"
                type="javax.sql.DataSource"
                factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                driverClassName="com.tmax.tibero.jdbc.TbDriver"
                url="jdbc:tibero:thin:@DB:8629:NEXTBSC"
                username="xxxxx"
                password="xxxxx"
                maxActive="100"
                initialSize="30"
                maxIdle="30"
                minIdle="30"
                maxWait="-1"
                validationQuery="SELECT 1 FROM DUAL"
                testOnBorrow="true"
                testOnReturn="false"
                testWhileIdle="false"
                timeBetweenEvictionRunsMillis="60000"
                numTestsPerEvictionRun="5"
                minEvictableIdleTimeMillis="3600000"
        />

        :
        :
        :
    </Context>

 

** catalina.out 파일만 존재여부 확인

# ls $CATALINA_HOME/logs

블로그 이미지

유효하지않음

,

서버 전송 용량 처리가 설정되어 있지 않으면 Tomcat의 경우 POST 기본 전송 용량은

2MB(우리가 알고 있는 그... 아닙니다.) 입니다. 용량이 큰 HWP 파일의 경우 2MB 이상

될 수 있어 전송시 문제가 발생할 수 있습니다.



$CATALINA_HOME/conf/server.xml 설정 파일의 파라미터 수정


** 변경전 Tomcat 8.x **

<Service name="Catalina">
   <Connector port="80"   protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443"
              URIEncoding="MS949" allowLinking="true" allowTrace="false" disableUploadTimeout="true"/>
   <Connector port="8011" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
   <Connector port="8009" protocol="AJP/1.3"  connectionTimeout="20000" redirectPort="8443" />
   <Connector port="8009" protocol="AJP/1.3"  redirectPort="8443" />



** 변경후 Tomcat 8.x **

<Service name="Catalina">
   <Connector port="80"   protocol="HTTP/1.1" connectionTimeout="200000" redirectPort="8443"
              URIEncoding="MS949" allowLinking="true" allowTrace="false"
              disableUploadTimeout="true" maxPostSize="60000000"/>  <!-- 약 57MB 제한 -->
   <Connector port="8011" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxPostSize="-1"/> <!-- 무제한 -->
   <Connector port="8009" protocol="AJP/1.3"  connectionTimeout="20000" redirectPort="8443" maxPostSize="-1"/> <!-- 무제한 -->
   <Connector port="8009" protocol="AJP/1.3"  redirectPort="8443" maxPostSize="-1"/> <!-- 무제한 -->

 


** 주의 ** 

 - Tomcat 7.0.63 미만 : maxPostSize="0"  무제한
 - Tomcat 7.0.63 이상 : maxPostSize="-1" 무제한

블로그 이미지

유효하지않음

,

톰켓 구동 시 멈춤(지연 10분 이상) 현상이 발생하여 찾아보던중 

 

블로킹 이슈문제가 있네요.

 

해결방법 #1 (O/S별 환경변수 설정)

 ** Linux
    # vi /etc/profile.d/java.sh 또는 vi /etc/bashrc
 
      JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"


 ** Windows
      내컴퓨터 > 고급 시스템 설정 > 고급 > 환경 변수(N).. > 시스템 변수(S) > 새로 만들기(W).. 
 
      변수 이름(N) : JAVA_OPTS
      변수 값(V)   : %JAVA_OPTS% -Djava.security.egd=file:/dev/./urandom
 
 
해결방법 #2 (공통)

 ** java.security 파일 추가 및 수정

   jdk 8 이하 : $JAVA_HOME/jre/lib/security/java.security
   jdk 9 이상 : $JAVA_HOME/conf/security/java.security

   securerandom.source=file:/dev/./urandom

 

자바 버그로 인해 /dev/urandom 을 인식하지 못하고 /dev/./urandom 으로 처리해야 함.

 

 

 

참고 : https://lng1982.tistory.com/261

블로그 이미지

유효하지않음

,
jenkins를 통해 톰켓의 2개의 서버에 배포를 해야되는 경우가 발생함
현재 배포 plugin은 다중 배포를 지원하지 않는것 같네.. 힘드네.. 

## 테스트한 plugin
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.1</version>

추후 테스트예정 plugin 들...
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.0</version>

테스트한거랑 같은건가...?? 모르겠네..
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.2-SNAPSHOT</version>


 ## 설정 
a서버는 6.0.35 
b서버는 6.0.37 


A서버 B서버 같은 설정
#vi $CATALINA_HOME/conf/tomcat-users.xml
	<?xml version='1.0' encoding='utf-8'?>
	<tomcat-users>
		<role rolename="manager-gui"/>
		<role rolename="manager-script"/>
		<user username="tomcat" password="1234" roles="manager-gui, manager-script"/>
	</tomcat-users>

* maven settings.xml 파일에 servers 부분에 추가함 
 #vi $MAVEN_HOME/conf/settings.xml
    <server>
        <id>aTomcat</id>
        <username>tomcat</username>
        <password>1234</password>
    </server>
    <server>
        <id>bTomcat</id>
        <username>tomcat</username>
        <password>1234</password>
    </server>

* maven pom.xml 수정 
버전 6.0.35와 6.0.37 테스트시 url부분 때문에 문제가 발생함(403 Access Denied) 
6.0.35는 /manager/html 
6.0.37은 /manager 까지만... 중요!!!
    ....

    <profiles>
        <profile>
            <id>aTomcat</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <tomcat-server>aTomcat</tomcat-server>
                <tomcat-url>http://xxx.xxx.xxx.xxx:9090/manager/html</tomcat-url>
                <tomcat-user>tomcat</tomcat-user>
                <tomcat-password>1234</tomcat-password>
                <tomcat-path>/</tomcat-path>
            </properties>
        </profile>
        <profile>
            <id>bTomcat</id>
            <properties>
                <tomcat-server>bTomcat</tomcat-server>
                <tomcat-url>http://xxx.xxx.xxx.xxx/manager</tomcat-url>
                <tomcat-user>tomcat</tomcat-user>
                <tomcat-password>1234</tomcat-password>
                <tomcat-path>/</tomcat-path>
            </properties>
        </profile>
    </profiles>

    ....

	<build>

		....

        <pluginManagement>
            <plugins>

                 ....

                <!--
                 벤더사별 plugin
                 Tomcat    : http://tomcat.apache.org/maven-plugin-2.0/
                 Jobss     : http://docs.jboss.org/jbossas/7/plugins/maven/7.4.Final/index.html
                 Weblogic  : http://docs.oracle.com/cd/E21764_01/web.1111/e13702/maven_deployer.htm
                 WebSphere : http://www.jroller.com/peter_pilgrim/entry/battling_with_maven_2_integrating
                 -->

                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat6-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <server>${tomcat-server}</server>
                        <url>${tomcat-url}</url>
                        <username>${tomcat-user}</username>
                        <password>${tomcat-password}</password>
                        <path>${tomcat-path}</path>
                        <protocol>HTTP/1.1</protocol>
                        <failOnError>false</failOnError>
                        <charset>${encoding}</charset>
                        <uriEncoding>${encoding}</uriEncoding>
                        <update>true</update>
                        <mode>war</mode>
                    </configuration>
                </plugin>

                ....

            </plugins>
        </pluginManagement>

        ....

        </build>

    ....
* maven 실행시 goals 갯수만큼 실행하던가 쉘스크립트로 만들던가 해야됨 
플러그인 버전업시 지원 될라나..?? 
mvn -P aTomcat clean install tomcat6:stop tomcat6:undeploy tomcat6:deploy tomcat6:start 
mvn -P bTomcat clean install tomcat6:stop tomcat6:undeploy tomcat6:deploy tomcat6:start



# Ant 플러그인을 이용하는 방법 테스트 해보진 않았음
<plugin>
    
    ....

    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <target>
            <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/>
            <deploy url="http://xxx.xxx.xxx.xxx/manager" username="tomcat" password="1234"
                path="/" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>

            <deploy url="http://xxx.xxx.xxx.xxx/manager" username="tomcat" password="1234"
            path="/" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>
        </target>
    </configuration>

   ....
   
</plugin>


블로그 이미지

유효하지않음

,

[출처] http://theeye.pe.kr/entry/Proxt-AJP-mod_rewrite%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-Apache-22-Tomcat-%EC%99%84%EB%B2%BD-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

여러분의 JAVA/JSP는 어떤 WAS에서 돌리고 계신가요? 톰캣을 쓰신다고요?

그럼 웹서버는 아파치를 사용하시겠군요. 연동을 위해 톰캣 사이트에서 받을 수 있는 mod_jk를 많이들 쓰실것입니다.

하지만 아파치 2.2.x에서 제공하는 Proxy AJP를 사용하면 매우 깔끔하게 연동을 할 수 있습니다.

톰캣은 설치가 되어 정상적으로 동작하고 있는 상황이라 가정하고 아파치 설정만을 적어보겠습니다.

[이곳]에서 가장 최신의 아파치 2.2 버젼을 다운받습니다. 압축을 풀고 컴파일을 합니다.

설정(쓰레드 방식)

[root@Theeye src]$ CC="gcc" CFLAGS="-O2" ./configure --prefix=/usr/local/httpd --enable-so --enable-proxy-ajp --enable-cgi --enable-rewrite --enable-speling --enable-usertrack --enable-deflate --enable-ssl --enable-cache --enable-disk-cache --enable-expires --enable-file-cache --enable-headers --enable-mem-cache --enable-mime-magic --enable-proxy --enable-mods-shared=all --with-mpm=worker

설정(프로세스 방식)
[root@Theeye src]$ CC="gcc" CFLAGS="-O2" ./configure --prefix=/usr/local/httpd --enable-so --enable-proxy-ajp --enable-cgi --enable-rewrite --enable-speling --enable-usertrack --enable-deflate --enable-ssl --enable-cache --enable-disk-cache --enable-expires --enable-file-cache --enable-headers --enable-mem-cache --enable-mime-magic --enable-proxy --enable-mods-shared=all --with-mpm=prefork

컴파일
[root@Theeye src]$ make
[root@Theeye src]$ make install


아파치가 설치된 디렉토리의 conf/httpd.conf 파일을 열어 다음의 두가지가 정상적으로 존재하는지 확인합니다.
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule rewrite_module modules/mod_rewrite.so


그리고 마지막쯤에 있는 가상호스팅 관련 설정을 인클루드 하도록 설정합니다.
Include conf/extra/httpd-vhosts.conf


아파치 설치 디렉토리의 conf/extra/httpd-vhost.conf 파일을 열어 가상호스트를 추가합니다.

<VirtualHost *:80>
ServerAdmin your@emailhere
DocumentRoot /var/www/html
ServerName theeye.pe.kr
ErrorLog logs/theeye.pe.kr-error_log
CustomLog logs/theeye.pe.kr-access_log common
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} \.(htm|html|xhtml|js|css|jpg|gif|png|swf)$
RewriteRule (.*) - [L]
RewriteRule (.*) ajp://localhost:8009$1 [P]
</VirtualHost>


위와같은 rewrite를 통한 설정은 htm, html, xhtml, js, css, jpg, gif, png, swf 확장자를 가진 요청은 아파치가 처리하도록 하고 나머지는 톰캣이 처리하도록 합니다. 원하시는 확장자를 마음껏 추가하셔도 됩니다.

톰캣이 설치된 디렉토리의 conf/server.xml의 설정을 변경합니다. Connector설정을 확인합니다.
<Connector port="8009" protocol="AJP/1.3" maxThreads="150" minSpareThreads="25"  maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />


아파치 가상호스트에 지정한것과 동일한 호스트를 설정합니다.
<Host name="theeye.pe.kr" debug="0" appBase="/var/www/html" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/var/www/html" debug="0" reloadable="false" crossContext="true" />
</Host>


자, 이제 아파치와 톰캣의 설정이 모두 끝났습니다. 위와 같이 사용하시면 아파치에서 처리할 파일과 톰캣이 처리할 파일들을 따로 분리할 필요도 없으며 확장자에 따라 정확히 아파치와 톰캣이 분산 처리를 하게 됩니다.

정적인 파일들을 톰캣이 처리할 필요는 없으니깐요^^

추가로 특정 호스트에게만 오픈하는 관리자 페이지거나 개발서버일 경우 다음과 같이 접근 가능 아이피를 지정할 수 있습니다.

<VirtualHost *:80>
ServerAdmin your@emailhere
DocumentRoot /var/www/html
ServerName theeye.pe.kr
ErrorLog logs/theeye.pe.kr-error_log
CustomLog logs/theeye.pe.kr-access_log common
RewriteEngine On
RewriteCond !%{REMOTE_ADDR} ^127\.0\.0\.1$
RewriteRule ^.*$ - [F]
RewriteCond %{REQUEST_FILENAME} \.(htm|html|xhtml|js|css|jpg|gif|png|swf)$
RewriteRule (.*) - [L]
RewriteRule (.*) ajp://localhost:8009$1 [P]
</VirtualHost>


127.0.0.1 아이피를 가진 호스트가 아니라면 아파치에서 바로 에러페이지를 출력하게 됩니다.



ProxyAJP에 대해 잘 모르신다면 링크의 글을 보시거나 좀더 검색해 보시고 보시면 좋을 것같습니다.

제가 운영하는 투명아이 호스팅에서 JSP 호스팅을 좀더 편하게 구현할 방법을 찾아보니 여기까지 왔습니다.

정말 간단하다 못해 너무 단순하게 강력한 효과를 얻을 수 있는 방법이라고 생각합니다.

우선 보통의 경우 mod_jk를 이용하여 연동을 하게 되는데요, 이때에 볼 수 있는 설정 파일은 대충 다음과 같습니다.

LoadModule          jk_module       modules/mod_jk.so
JkWorkersFile /usr/local/tomcat/conf/workers.properties
JkLogFile /var/log/httpd/mod_jk.log
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories -ForwardLocalAddress
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
JkLogLevel info
JkMount             /servlet/*      ajp13
JkMount             /manager/*      ajp13
JkMount             /flex/*         ajp13
JkMount             /*.jsp          ajp13
JkMount             /*.do           ajp13

위의 방법은 Apache 2.2의 ProxyAJP 모듈을 이용한 방법으로 고쳐 보겠습니다. [참고]

다음과 같은 설정 파일을 proxy_ajp.conf 파일로 만들어 Apache의 설정 파일에 Include되도록 합시다.
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ProxyRequests On
ProxyVia On
ProxyPass /manager/ ajp://localhost:8009/manager/
ProxyPass /servlet/ ajp://localhost:8009/servlet/
ProxyPass /flex/ ajp://localhost:8009/flex/
ProxyPassMatch ^/.*\.(jsp|do)$ ajp://localhost:8009/
# 보안을 위해 WEB-INF 접근 불가설정
<LocationMatch "/WEB-INF">
deny from all
</LocationMatch>
# 보안을 위해 META-INF 접근 불가설정
<LocationMatch "/
META-INF">
deny from all
</LocationMatch>

ProxyPass를 사용하여 특정 디렉토리를 톰캣에서 처리하게 할 수 있습니다.

ProxyPassMatch를 이용하여 특정 확장자를 가진 파일을 톰캣에서 처리하도록 할 수 있습니다. 정규식을 잘 쓰면 되겠네요.

이제는 더이상 worker.properties니 하는 파일이 필요없습니다. 위와 같은 방법으로 간단하게 처리 가능합니다.

WEB-INF나 META-INF 디렉토리로의 접근 보안 문제는 위와같이 해결할 수 있습니다.

위와 같은 설정으로 웹호스팅 환경의 멀티 가상호스트상황에서도 일일이 연동 설정을 할 필요없어졌습니다.



또 다른방법

블로그 이미지

유효하지않음

,