'Know/WAS'에 해당되는 글 7건

  1. 2009.07.09 Apache Tomcat 6.0 - Virtual Hosting and Tomcat
  2. 2007.04.09 [cronolog] Access Log 관리
  3. 2006.11.30 톰캣로그 일별쌓기
  4. 2006.08.11 JEUS <%@ include 자동 반영하기
  5. 2006.05.23 [TOMCAT] WINDOW 서비스 옵션 조정 방법
  6. 2006.04.10 Tomcat 5 세션 클러스터링+FailOver+LoadBalancing+Connection Pool
  7. 2005.12.21 WebLogic Setting

Apache Tomcat 6.0 - Virtual Hosting and Tomcat

Know/WAS 2009.07.09 10:53

[출처] http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html


Apache Tomcat 6.0

Virtual Hosting and Tomcat

Assumptions

For the sake of this how-to, assume you have a development host with two host names, ren and stimpy. Let's also assume one instance of Tomcat running, so $CATALINA_HOME refers to wherever it's installed, perhaps /usr/local/tomcat.

Also, this how-to uses Unix-style path separators and commands; if you're on Windows modify accordingly.

server.xml

At the simplest, edit the Engine portion of your server.xml file to look like this:

<Engine name="Catalina" defaultHost="ren">
    <Host name="ren"    appBase="renapps"/>
    <Host name="stimpy" appBase="stimpyapps"/>
</Engine>
    

Note that the directory structures under the appBase for each host should not overlap each other.

Consult the configuration documentation for other attributes of the Engine and Host elements.

Webapps Directory

Create directories for each of the virtual hosts:

mkdir $CATALINA_HOME/renapps
mkdir $CATALINA_HOME/stimpyapps
    
Configuring Your Contexts
General

Contexts are normally located underneath the appBase directory. For example, to deploy the foobar context as a war file in the ren host, use $CATALINA_HOME/renapps/foobar.war. Note that the default or ROOT context for ren would be deployed as $CATALINA_HOME/renapps/ROOT.war (WAR) or $CATALINA_HOME/renapps/ROOR (directory).

NOTE: The docBase for a context should never be the same as the appBase for a host.

context.xml - approach #1

Within your Context, create a META-INF directory and then place your Context definition in it in a file named context.xml. i.e. $CATALINA_HOME/renapps/ROOT/META-INF/context.xml This makes deployment easier, particularly if you're distributing a WAR file.

context.xml - approach #2

Create a structure under $CATALINA_HOME/conf/Catalina corresponding to your virtual hosts, e.g.:

mkdir $CATALINA_HOME/conf/Catalina/ren
mkdir $CATALINA_HOME/conf/Catalina/stimpy
      

Note that the ending directory name "Catalina" represents the name attribute of the Engine element as shown above.

Now, for your default webapps, add:

$CATALINA_HOME/conf/Catalina/ren/ROOT.xml
$CATALINA_HOME/conf/Catalina/stimpy/ROOT.xml
      

If you want to use the Tomcat manager webapp for each host, you'll also need to add it here:

cd $CATALINA_HOME/conf/Catalina
cp localhost/manager.xml ren/
cp localhost/manager.xml stimpy/
      
Further Information

Consult the configuration documentation for other attributes of the Context element.

tags : Tomcat
Trackbacks 0 : Comments 0

[cronolog] Access Log 관리

Know/WAS 2007.04.09 03:03
cronolog 를 이용할 경우 access_log 의 날짜별 관리가 가능하다
access_log_041001
access_log_041002


1. 다운받기

http://cronolog.org/download/index.html 에 들어가서 cronolog-1.6.2.tar.gz 다운 받는다.
(2004년 10월 2일 현재 최신버전 cronolog-1.6.2.tar.gz)

2. 설치

./configure
make
make install

/usr/local/sbin/cronolog 에 설치된다.


3. 설정하기

httpd.conf 의 CustomLog 부분만 수정해 주면 된다.

예)

아래와 같이 심볼릭링크를 걸어주면 웹로그 분석시 편하다.

CustomLog "|/usr/local/sbin/cronolog --symlink=/home/httpd/logs/access_log /home/httpd/logs/accesslog/www_%y%m%d_access_log" common

4. 설정 예제들 (인터넷 펌)

설정: CustomLog "|/usr/local/sbin/cronolog /www/logs/%Y/%m/%d/access.log" common

결과:
/www/logs/2001/01/01/access.log
/www/logs/2001/01/02/access.log

대문자 Y 를 소문자 y로 고쳤습니다.

설정: CustomLog "|/usr/local/sbin/cronolog /www/logs/%y/%m/%d/access.log" common

결과:
/www/logs/01/01/01/access.log
/www/logs/01/01/02/access.log

%d를 지우면 월단위로 남깁니다.

설정: CustomLog "|/usr/local/sbin/cronolog /www/logs/%y/%m/access.log" common
결과:
/www/logs/01/01/access.log
/www/logs/01/02/access.log

한 디렉토리에 저장하는거도 가능합니다.

설정: CustomLog "|/usr/local/sbin/cronolog /www/logs/access.%Y%m%d" common
결과:

/www/logs/access.20010101
/www/logs/access.20010102

비슷한거

설정: CustomLog "|/usr/local/sbin/cronolog /www/logs/www%Y%m%d.log" common

결과:
/www/logs/www20010101.log
/www/logs/www20010102.log

access_log 로 심볼릭 링크를 걸수도 있습니다.
access_log에 심볼릭링크는 주기적으로 바뀌어서 지금 사용하는 로그파일이 됩니다.
CustomLog "|/usr/local/sbin/cronolog --symlink=/www/logs/access_log /www/logs/www%y%m%d.log" common
/www/logs/access_log -> /www/logs/www20010102.log
/www/logs/www20010101.log
/www/logs/www20010102.log

로그분석 프로그램에서 로그파일을 지정해야 하는 하는 경우에 (예,webalizer) access_log 를 지정하면 해당하는 날짜의 로그파일을 가리키겠죠...

5. 본격 활용 (인터넷 펌)

문제:
아파치로 웹사이트를 운영하고 있는데 로그 분석을 해서 방문자 현황을 보고 싶다.
그리고 지나간 로그 파일을 날짜별로 정리해서 압축해서 보관하고 싶다.

해결:
cronolog를 이용해 로그를 분할 저장합니다. 이때 심볼릭링크를 반드시 해야합니다.
CustomLog "|/usr/local/sbin/cronolog --symlink=/www/logs/access_log /www/logs/www%y%m%d.log" common

그러면 로그는 이렇게 저장됩니다.
/www/logs/access_log -> /www/logs/www20010102.log
/www/logs/www20010101.log
/www/logs/www20010102.log

Webalizer의 conf 파일에서 분석할 로그 파일을 /www/logs/access_log 로 지정합니다. 물론 history 보관 옵션을 on 해야 합니다.

crontab 파일을 열어 매일 23시 59분에 webzlizer를 실행하도록 세팅합니다.
성격이 급한 분은 매일/매시/59분으로 세팅해도 무방합니다.

매일 23시 59분에 cron에 의해 webalizer가 실행되며 access_log에 심볼릭링크 된 오늘자 아파치 로그를 분석하고 history에 저장합니다.

0시 0분이 되면 (새로운 접속이 있으면) 아파치(cronolog)는 새로운 날짜의 로그파일을 만들고 access_log 에는 새로운 파일을 링크걸게 됩니다.

다시 23시 59분이 되면 cron이 webzlizer를 실행시키고, access_log를 분석하는데 어제 날짜가 아닌 오늘 날짜의 파일을 분석합니다.

출처 : http://blog.empas.com/comengx/3859311
Trackbacks 0 : Comments 0

톰캣로그 일별쌓기

Know/WAS 2006.11.30 10:46
Tomcat5.5버전에는 날짜별로 쌓이도록 지원한다하는데, 5.0버전에는 톰캣 자체에서 지원하는 모듈은 없슴다.

그래서 util(lotatelog,cronolog)등을 이용하여, catalina.sh를 고치는 방법이 있긴한데,

자료를 찾아봤더니, 좀.. 불안하기도 하고, 서버에 유틸을 깔기도 좀 께름칙해서,



걍 간단한 쉘을 하나 만들어서 crontab에 등록을 해놓았습니다.



비스므리한 경우가 생기시는 분은 걍 사용하심 될듯해서 올림다.





1.$CATALINA_HOME/logs/tmp/tmp.log (0byte) 를 만들어둡니다. 이걸이용해서 catalina.out을 0바이트로 바꿉니다.

2. logchange.sh를 만듬다. 어디에 둘지는 며느리맘~, 본쉘입니다.

logchange.sh
-------------------------------------------------------------

#!/bin/sh
Wdate=$(date +%Y%m%d) #오늘날짜가져오기

#해당 톰캣의 로그폴더로 이동합니다. 이부분은 절대경로로 사용하든, 상대경로로 사용하든 알아서 하면됩니다.
cd
cd _JAVA/tomcat5/logs/

# catalina.out 을 오늘날짜로 카피
cp catalina.out catalina_$Wdate.log

# 카피가 성공됐으면, catalina.out을 0바이트로 만듭니다.
# mv나 지우고 다시 만들지 않는이유는, 다 아시듯이 서비스중 hang이 걸리지 않게 하기 위해서입니다.
if [ -f "catalina_$Wdate.log" ]
then
cat ./tmp/tmp.log > catalina.out
echo "create new catalina.out"
else
echo "fail to create new catalina.out because backup fail"
fi

echo $Wdate
-------------------------------------------------------------



3. crontab에 등록. 새벽에 한번씩 돌게 합니다.

$crontab -l <-- 현재 등록된 사용자 계정의 crontab 목록을 보여줍니다.

$crontab -e <-- 사용자 계정의 crontab 의 편집모드로 바꾸어줍니다. 해당시간으로 목록편집





그럼 수고~~
Trackbacks 0 : Comments 0

JEUS <%@ include 자동 반영하기

Know/WAS 2006.08.11 10:39
[출처] http://technet.tmaxsoft.com/kr/inquiry/faq/jeus/readBoardForm.do?bbsCode=faq_jeus&fc=inquiry&sc=inquiry_faq&tc=inquiry_faq_jeus¤tPage=1&seqNo=260&categoryId=&productCode=&range=20&searchType=ALL&searchText=include


상세질문

<%@ include 를 사용한 경우 include된 파일이 변경된 경우 반영이 되지 않습니다.
자동으로 반영하려면 어떻게 해야 하나요?



답 변

JSP의 include의 방식에는 <%@ include (action),
이 중 a.jsp가 수행 도중 b.jsp의 include 구문을 만나면 b.jsp로 제어권이 넘어가서 수행된 후 다시 a.jsp로 제어권이 넘어와서 계속 수행됩니다.
그래서 b.jsp가 변경된 경우 변경사항이 자동으로 반영됩니다.

그리고 <%@ include (directive)는 include하는 JSP(a.jsp)와 include되는 JSP(b.jsp)가 하나의 servlet으로 변환되어서 a.jsp 내에 b.jsp가 완전히 포함되는 형태로 변환됩니다.
<%@ include (directive)의 목적은 JSP가 Servlet으로 변환되어 컴파일 될 때에
특정 코드나 text를 포함하기 위해서 입니다.
따라서 b.jsp가 변경된 경우 a.jsp는 b.jsp가 변경되었는지 모르기 때문에 include 된 JSP의 변경시 이것을 인지하지 못합니다.

<%@ include (directive) 를 사용하는 경우 JSP container가 include된 파일이 변경된 경우 자동으로 반영해 주기 위해서는 include하는 파일이 수행될 때 마다 include된 파일의 변경 여부를 검사해서 변경되었다면 include 하는 파일을 recompile 해 주어야 합니다.
이것은 JSP container에게는 상당히 부하를 주는 작업입니다.
그래서 JSP Spec에서는 include된 파일의 변경시 반영 여부는 명시하지 않고 있습니다.

JEUS에서는 개발과 운영의 편의성을 위해서 이것을 옵션으로 지정하여 변경시 자동 반영이 되게 설정할 수 있습니다.
하지만 이 옵션을 true로 설정하는 경우 불필요한 검사가 들어가게 되므로 수행 속도에 지장을 주게됩니다. 반드시 JSP 파일의 변경이 빈번한 경우에만 설정하십시오.

1. JEUS 3.x

$JEUS_HOME/config/<HOSTNAME>/<SERVLET_ENGINE_NAME>/container.xml에 설정
---------------------------------------------------------
<Container>
...
<ContextGroup>
...
<JSPEngine ...
CheckIncludedJspFile="true"
... />
---------------------------------------------------------

2. JEUS 4.x

$JEUS_HOME/config/<HOSTNAME>/<SERVLET_ENGINE_NAME>/WEBMain.xml에 설정
---------------------------------------------------------
<web-container>
...
<context-group>
...
<jsp-engine>
...
<check-included-jspfile>true</check-included-jspfile>
...
</jsp-engine>
...
</context-group>
...
</web-container>
---------------------------------------------------------

Trackbacks 0 : Comments 0

[TOMCAT] WINDOW 서비스 옵션 조정 방법

Know/WAS 2006.05.23 10:41
출처 : http://www.okjsp.pe.kr/seq/51700

JSP Tips
kenu 2004-12-14 03:26:37.0

kenu@okjsp.pe.kr http://okjsp.pe.kr
[tomcat]윈도우 서비스 옵션 조정 방법
How to set the Min Xms and Max Xmx allocations for Java VM when using Tomcat NT Service with Tomcat 4.1.x

Notes :

CATALINA_OPTS in Catalina.bat appear to be ignored when using the Tomcat NT Service
Values can be checked using the Task Manager in Windows or by using an application Profiler
from: http://www.pauaware.co.nz/tomcatntservice.htm

tomcatntservice.gif 30790 Bytes (86)
Trackbacks 0 : Comments 0

Tomcat 5 세션 클러스터링+FailOver+LoadBalancing+Connection Pool

Know/WAS 2006.04.10 09:24

출처: 자바서비스넷

 
대충 설명드리고 조금씩 내용을 추가하도록 하겠습니다.

Solaris 8 환경에서 apache 2.0.53과 Tomcat 5.5.7로 연동테스트 하였습니다.

[설명]

- Load Balancing , Fail Over - 

머신은 2대로 각 머신은 172.16.1.79번, 172.16.1.70번으로 IP할당했습니다.
각 머신에 Apache와 Tomcat을 설치했습니다.
JK2 Connector를 사용하면 FailOver 및 LoadBalancing기능이 구현됩니다.
79번 서버의 아파치로 온 요청은 79번 서버의 Tomcat으로 전달되거나 70번 서버의 Tomcat으로 
전달될 수 있고 마찬가지로 70번 서버의 아파치로 온 요청은 70번 서버의Tomcat이나 79번 
서버의 Tomcat으로 전달될 수 있습니다. 이것이 LoadBalancing 개념입니다.
또 만약 79번 서버의 톰캣이 죽은 경우 JK2 Connector가 알아서 79번 Tomcat이 다시 구동되기
전까지는 79번쪽의 톰캣쪽으로는 요청을 보내지 않습니다. 이것이 FailOver 기능입니다.

- Session Clustering -

Session Clustering 을 구현하기 위해서는 각 Tomcat의 server.xml과 web.xml을 적당히 
수정해 주면 됩니다.

- Connection Pool -

제가 설정하는 Connection Pool은 Commons Project의 DBCP를 사용합니다.
Commons DBCP 와 Runtime에 필요한 기타 Commons Package를 다운받아
tomcat홈의 common/lib에 복사해 넣으시면 됩니다.

[Tomcat 5.5.7 설치]

Binary 버젼 다운 받아서 압축만 풀면 됩니다.
79번과, 70번서버의 /opt/tomcat5 에 각각 설치합니다.

[Apache 2.0.53 설치]

아파치 소스를 다음과 같이 /export/home/auction/httpd-2.0.53 에 풀고 
아래와 같이 진행합니다.
참고로 config.layout에 설치 Directory구조를 명시해 두면 편리합니다.
제가 추가한 Layout명칭은 "Rednics" 입니다.
이 명칭을 configure 실행시 --enable-layout 옵션값으로 설정하면 됩니다.
아래의 같이 79번서버와 70번 서버에 각각 설치합니다.

> cd /export/home/auction/httpd-2.0.53
> vi config.layout
####################################################
<Layout Rednics>
    prefix:        /opt/apache2
    exec_prefix:   ${prefix}
    bindir:        ${prefix}/bin
    sbindir:       ${prefix}/sbin
    libdir:        ${prefix}/lib
    libexecdir:    ${prefix}/libexec
    mandir:        ${prefix}/man
    sysconfdir:    ${prefix}/conf
    datadir:       ${prefix}/share
    installbuilddir: ${datadir}/build
    errordir:      ${prefix}/var/error
    iconsdir:      ${datadir}/icons
    htdocsdir:     /export/home/els/rednics/htdocs
    manualdir:     ${prefix}/manual
    cgidir:        ${prefix}/cgi-bin
    includedir:    ${prefix}/include
    localstatedir: ${prefix}/var
    runtimedir:    ${localstatedir}/run
    logfiledir:    ${localstatedir}/logs
    proxycachedir: ${localstatedir}/proxy
</Layout>
###################################################
> ./configure --enable-layout=Rednics --enable-module=so
> make
> make install

[JK2 Connector 빌드]

JK2 Connector를 설치하기 위해서는 Tomcat Binary가 아닌 Tomcat Source 파일도 
다운받아야 합니다. 그래서 저는 jakarta-tomcat-5.5.7-src.tar 를 다운받아 
/export/home/auction/jakarta-tomcat-5.5.7-src/ 에 풀었습니다.

그리고 JK Connector 빌드시에 다음과 같은 Package가 필요하므로 특정 Package가 
설치되어 있지 않은경우는 ftp://ftp.sunfreeware.com/pub/freeware/sparc/5.8/ 에서 
다운로드하여 아래와 같이 Package를 설치하여야 합니다.
저는 설치되지 않은 Package가 많아서 아래와 같이 많은 Package를 추가하였습니다.

> pkgadd -d autoconf-2.59-sol8-sparc-local
> pkgadd -d automake-1.9-sol8-sparc-local
> pkgadd -d gzip-1.3.5-sol8-sparc-local
> pkgadd -d libtool-1.5-sol8-sparc-local
> pkgadd -d m4-1.4.2-sol8-sparc-local
> pkgadd -d make-3.80-sol8-sparc-local
> pkgadd -d tar-1.15.1-sol8-sparc-local

그리고 빌드과정중 perl관련해서 에러가 발생할 수 있으므로 다음과 같이
해줍니다.

> ln -s /usr/bin/perl /usr/local/bin/perl

이제 빌드를 시작합니다.

> cd /export/home/auction/jakarta-tomcat-5.5.7-src/jakarta-tomcat-connectors/jk/native2
> ./buildconf.sh
> ./configure --with-apxs2=/opt/apache2/sbin/apxs --with-java-home=/usr/j2se --with-java-platform=2
> make
> cd ../build/jk2/apache2
> /opt/apache2/sbin/apxs -n jk2 -i mod_jk2.so


[톰캣, 아파치 설정]

JK2를 아파치와 연동하기 위해서는 아래와 같이
/opt/apache2/conf 에 mod_jk2.conf 와 workers2.properties
파일이 필요합니다.
설정파일들을 구할수 없다면 아래의 예를 복사해서 해당파일들을 만드시면 됩니다.

> cd /opt/apache2/conf
> vi mod_jk2.conf
#####################################################
<IfModule mod_jk2.c>
    #-----------------------------------------------
    # Where to find the workers2.properties file
    #-----------------------------------------------
    #
    JkSet config.file /opt/apache2/conf/workers2.properties
</IfModule>
#####################################################

아래의 worker2.properties 는 172.16.1.79 와 172.16.1.70 이라는
물리적으로 다른 2개의 머신을 LoadBalancing및 FailOver기능을 
하도록 하는 설정입니다. 
참고로 Tomcat은 위 두개의 IP에 대해서 8009 Port에 뜨도록 설정하고 있고
79번의 8009에 떠있는 Tomcat에 대해서는 TomcatID를 tc01로
70번의 8009에 떠있는 Tomcat에 대해서는 TomcatID를 tc02로
각각 명시하고 있습니다.
나중에 79번과 70번에 설치된 Tomcat의 server.xml에 이와 Mapping
되도록 포트는 8009, tomcatID는 tc01, tc02등으로 정확하게 
설정해야 합니다.

> vi workers2.properties
#####################################################
[shm]
info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.
file=anonymous

# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]
noErrorHeader=1
stickySession=1
recovery=60

# Example socket channel, override port and host.
[channel.socket:172.16.1.79:8009]
port=8009
host=172.16.1.79
graceful=0
tomcatId=tc01
group=lb

[channel.socket:172.16.1.70:8009]
port=8009
host=172.16.1.70
graceful=0
tomcatId=tc02
group=lb

# define the worker
[ajp13:172.16.1.79:8009]
tomcatId=tc01
max_connections=120
channel=channel.socket:172.16.1.79:8009
group=lb

[ajp13:172.16.1.70:8009]
tomcatId=tc02
max_connections=120
channel=channel.socket:172.16.1.70:8009
group=lb

# Map the Tomcat examples webapp to the Web server uri space
[uri:/*.jsp]
group=lb

[uri:/servlet/*]
group=lb

[status:]
info=Status worker, displays runtime information

[uri:/jkstatus/*]
info=The Tomcat /jkstatus handler
group=status:
#####################################################
> vi httpd.conf
#####################################################
DocumentRoot "/export/home/na/SVC"
LoadModule jk2_module libexec/mod_jk2.so
Group nobody
KeepAlive Off
#####################################################

아래의 설정은 workers2.properties 에 명시한 내용과 
일부 Mapping시켜야 합니다.
Mapping시킬 곳은 Connector port="8009" 라고 적은 부분과
Engine 부분의 jvmRoute="tc01" 라고 적은 부분입니다.
79번 tomcat의 server.xml에는 port:8009, jvmRoute="tc01"로
70번 tomcat의 server.xml에는 port:8009, jvmRoute="tc02"로
각각 설정하면 됩니다.
그리고 Cluster 부분을 아래와 같이 설정해 줘야 Session Clustering 이
가능해 지게 됩니다. 그러니 Session Clustering을 설정하는 곳은
바로 이곳이 되겠네요.
마지막으로 Connection Pool을 설정하기 위해서 아래와 같이 Context 하위에
Resource를 정의합니다. Connection Pool은 Commons의 DBCP를 사용합니다.

172.16.1.79> vi /opt/tomcat5/conf/server.xml

#####################################################

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

  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>

  <GlobalNamingResources>

    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

    <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>

  <Service name="Catalina">

    <Connector port="8009"
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

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

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

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

        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 useDirtyFlag="true"
                 notifyListenersOnReplication="true">

            <Membership
                className="org.apache.catalina.cluster.mcast.McastService"
                mcastAddr="228.0.0.4"
                mcastPort="45564"
                mcastFrequency="500"
                mcastDropTime="3000"/>

            <Receiver
                className="org.apache.catalina.cluster.tcp.ReplicationListener"
                tcpListenAddress="172.16.1.79"
                tcpListenPort="4001"
                tcpSelectorTimeout="100"
                tcpThreadCount="6"/>

            <Sender
                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
                replicationMode="pooled"
                ackTimeout="15000"/>

            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
                      tempDir="/tmp/war-temp/"
                      deployDir="/tmp/war-deploy/"
                      watchDir="/tmp/war-listen/"
                      watchEnabled="false"/>
        </Cluster>

        <Context docBase="/export/home/na/SVC" path="/"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
                    <Resource name="jdbc/Oracle" auth="Container"
                              type="javax.sql.DataSource"
                              driverClassName="oracle.jdbc.driver.OracleDriver"
                              url="jdbc:oracle:thin:@172.16.1.30:1521:happydb2"
                              defaultAutoCommit="false"
                              username="user"
                              password="password"
                              maxActive="50"
                              maxIdle="10"
                              maxWait="-1"
                              removeAbandoned="true"
                              removeAbandonedTimeout="60"
                              logAbandoned="true"
                              initialSize="50"
                              />
                </Context>

      </Host>
    </Engine>

  </Service>

</Server>

#####################################################

172.16.1.70> vi /opt/tomcat5/conf/server.xml

#####################################################

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

  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>

  <GlobalNamingResources>

    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

    <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>

  <Service name="Catalina">

    <Connector port="8009"
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

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

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

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

        <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 useDirtyFlag="true"
                 notifyListenersOnReplication="true">

            <Membership
                className="org.apache.catalina.cluster.mcast.McastService"
                mcastAddr="228.0.0.4"
                mcastPort="45564"
                mcastFrequency="500"
                mcastDropTime="3000"/>

            <Receiver
                className="org.apache.catalina.cluster.tcp.ReplicationListener"
                tcpListenAddress="172.16.1.70"
                tcpListenPort="4001"
                tcpSelectorTimeout="100"
                tcpThreadCount="6"/>

            <Sender
                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
                replicationMode="pooled"
                ackTimeout="15000"/>

            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
                      tempDir="/tmp/war-temp/"
                      deployDir="/tmp/war-deploy/"
                      watchDir="/tmp/war-listen/"
                      watchEnabled="false"/>
        </Cluster>

        <Context docBase="/export/home/na/SVC" path="/"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
                    <Resource name="jdbc/Oracle" auth="Container"
                              type="javax.sql.DataSource"
                              driverClassName="oracle.jdbc.driver.OracleDriver"
                              url="jdbc:oracle:thin:@172.16.1.30:1521:happydb2"
                              defaultAutoCommit="false"
                              username="user"
                              password="password"
                              maxActive="50"
                              maxIdle="10"
                              maxWait="-1"
                              removeAbandoned="true"
                              removeAbandonedTimeout="60"
                              logAbandoned="true"
                              initialSize="50"
                              />
                </Context>

      </Host>
    </Engine>

  </Service>

</Server>

#####################################################

이제 어느정도 정리가 된거 같습니다.
위와같이 따라하셨다면 이제 tomcat과 apache를 다시 시작하면 되겠군요

마지막으로 DBCP에 대해서 한가지 말씀드리겠습니다.
server.xml의 DBCP 설정부분에 initialSize="50"이라고 설정한 
부분이 있습니다. 이렇게 설정하였다고 해서 Tocmat이 기동할 때
자동으로 Connection 50개를 생성하지는 않더군요. 
그렇다면 Connection 50개를 최초 생성하는 시점은 언제일까요?
테스트해 본 결과 DB와 최초 커낵션이 일어나는 시점입니다.
그래서 저는 ServletContextListener를 만들어 contextInitialized() 메소드내에 
Connection을 가져온 후 바로 Connection을 close()하도록 했습니다. 
이렇게 만들면 Tomcat이 올라가는 시점에 Connection 50개가 자동으로 생성됩니다.

테스트가 잘 된 분이나 궁금하신 점이 있으신 분은 리플달아주세요.
그리고 문서가 잘 작성되었는지도 궁금합니다. 
리플달아 주시면 고맙겠습니다.

신관영:rednics@nate.com
Trackbacks 0 : Comments 0

WebLogic Setting

Know/WAS 2005.12.21 10:37
1. Path Setting

1) CLASSPATH
① 자바의 기본Path는 잡혀있어야 합니다.
C:\jdk1.2.2\lib\tools.jar

② WebLogic 의 ClassPath
set JAVA_HOME=C:\jdk1.2.2
set WL_HOME=C:\weblogic
set ORACLE=c:\oracle_driver
set CLASSPATH=.
set CLASSPATH=%CLASSPATH%;%WL_HOME%\classes\boot
set CLASSPATH=%CLASSPATH%;%WL_HOME%\lib\weblogic510sp8boot.jar
CLASSPATH=%CLASSPATH%;%WL_HOME%\eval\cloudscape\lib\cloudscape.jar
set WLCLASSPATH=%WL_HOME%\classes
set WLCLASSPATH=%WLCLASSPATH%;%WL_HOME%\license
set WLCLASSPATH=%WLCLASSPATH%;%WL_HOME%\lib\weblogicaux.jar
set WLCLASSPATH=%WLCLASSPATH%;%WL_HOME%\lib\weblogic510sp8.jar
set CLASSPATH=%CLASSPATH%;%WLCLASSPATH%;%ORACLE%

오라클 드라이버가 Class Path 안에 있는것이 보통(예외 c:\jdk1.2.2\jre\lib\ext 안에 드라이버가 있으면 상관없음.)

2) Path
PATH=%PATH%;%JAVA_HOME%\bin;%WL_HOME%\bin;%WL_HOME%\bin\oci734_7
이 Path 에서 뒤의 oci734_7 은 WebLogic 상에서 dbConnection Pool 을 올리기 위해서 필요한 Path 입니다. 이것이 빠지면 user 가 Setting 해놓은 Pool이 Loading이 되지 않음.(꼭 oci734_7 만 쓰는건 아니구 oci driver 를 쓰려면 이 Path 를 사용, 다른것 을 쓰려면 bin 폴더 안에 있는 다른게 사용)

2. WebLogic 의 환경설정(weblogic.properties)
1) document root 설정
WebLogic 상에서 처리할 html문서나 jsp, .gif 등 같은 이미지를 처리할 경로를 설정하는 부분
Weblogic 이 설치된 폴더에 보면 weblogic.properties 파일 존재
하위 document root 설정 이라는 부분 weblogic.httpd.documentRoot = public_html/ 로 되어있음.
이것은 WebLogic 이 보는 default html directory로서 이대로 쓰게되면
c:\weblogic\myserver\public_html을 기본폴더로 사용하게됨.
이것을 사용자가 바꿀수 있습니다.

절대 경로를 써줘야 원하는 곳으로 바꿀수 있습니다.
예로 C:\weblogic\jsp 라는 폴더를 만들고 그것을 기본 html,jsp,.gif 등를 처리하는 곳으로 setting 하고 싶으면
weblogic.httpd.documentRoot= c:/weblogic/jsp하면 됨

2) Servlet 의 경로설정
WebLogic 상에서 Servlet 을 처리하기위한 폴더 설정하는 부분.
이것 역시 weblogic.properties file 을 보게되면
weblogic.httpd.servlet.classpath=c:\weblogic\myserver\servletclasses
가 defalult 로 잡혀 있음.
이것을 user 가 c:\weblogic\servlet 이라는 폴더를 만들고
이것을 servlet 처리 폴더로 설정 하려면
weblogic.httpd.servlet.classpath=C:/weblogic/servlet로 하면 됨.

그리고 servlet 을 처리하기 위해서는 #부분을 삭제하여야함.
weblogic.httpd.register.servlets=weblogic.servlet.ServletServlet
이부분이 주석 처리 되어있는데 앞의 # 부분을 없애부면 됨.

3) JSP 설정
Jsp 쓰기 위해서는
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# WEBLOGIC JSP PROPERTIES
# ------------------------------------------------
# Sets up automatic page compilation for JSP. Adjust init args for
# directory locations and uncomment to use.
# weblogic.httpd.register.*.jsp=# weblogic.servlet.JSPServlet
# weblogic.httpd.initArgs.*.jsp=# pageCheckSeconds=1,# compileCommand=c:/java/bin/javac.exe,# workingDir=C:/weblogic/myserver/classfiles,# verbose=true

이 부분을 찾아 위부분의 주석을 모두 삭제, 수정할 것은
compoileCommand=c:/java/bin/javac.exe인데 c:/java 는 jdk1.2.2(또는 jdk1.3) 가 설치된 폴더를 가르킨다.
따라서 jdk1.2.2 가 루트에 설치 되 있으면 c:/java 를 c:/jdk1.2.2 로 바꾸면 됩니다.

다음은 바꾼 예 입니다.
# WEBLOGIC JSP PROPERTIES
# ------------------------------------------------
# Sets up automatic page compilation for JSP. Adjust init args for
# directory locations and uncomment to use.
 weblogic.httpd.register.*.jsp= weblogic.servlet.JSPServlet
weblogic.httpd.initArgs.*.jsp= pageCheckSeconds=1, compileCommand=c:/jdk1.2.2/bin/javac.exe, workingDir=C:/weblogic/myserver/classfiles, verbose=true
encoding=EUC-KR

그리고,encoding=EUC-KR 한글 사용을 위해서 필요한 것입니다.
그것은 맨 밑에 직접 추가 시켜 주세요
이걸 하게 되면 jsp 내에서
<%@ page contentType=”text/html; charset=euc-kr” %>
를 할 필요가 없습니다.(하게 되면 오류가 나오더라구요 제경험으로는)

이상으로 jsp 및 servlet setting 을 마치겠습니다.

다음은 weblogic.properties 에서 웹로직 일반 setting 을 설명하겠습니다.
Weblogic.system.listenPort=7001 : 이것은 weblogic 이 기동 되면서 쓰게될
Port 번호를 지정하는 부분입니다.
기본은 7001 입니다.
Weblogic.password.system=11111111 : 이것은 웹로직 설치할 때 입력한 암호가 있는곳입니다. 여기서 바꿀수 있습니다.8자 이상입니다.(설정에 따라 달라집니다)
Weblogic.security.ssl.enable=true : SSL 을 사용할지 여부를 설정
SSL 이 머냐면 저 두 잘 모릅니다.(^^a;;)
기본으로 설정되 있기에 그냥 씁니다.
Weblogic.system.SSLListenPort=7002 : 웹로직 SSL TCP/IP 포트 번호
Weblogic.httpd.enable=true : 웹로직을 웹서버로써 사용할지 여부를 설정한다
IIS,Netscape 를 웹서버로 사용하고 웹로직을
Application 서버로만 사용할때는 이 값을 false
로 설정합니다.
이것을 true 로 쓰실거면 listenPort 를
80 으로 주세요 그러면,port 번호 안넣어도
됩니다.
Weblogic.system.enableConsole=true : 웹로직 콘솔 사용여부를 결정
Weblogic.system.maxLogFileSize=1024 : System 로그파일 의 최대크기를
설정합니다.(단위 Kbytes)
weblogic.system.minPasswordLen=8 : password 의 최소길이 결정

다음은 Oracle 을 쓰기 위한 DB Setting 을 설명하겠습니다.

WebLogic DB Connection Pool Setting (for Oracle)
이제부터 dbconnection pool 을 설정하겠습니다.
마찬가지로 weblogic.properties 를 살펴보시면
# WEBLOGIC JDBC CONNECTION POOL MANAGEMENT 이라는 항목이 있습니다.
그 부분이 머냐 하면 oci driver 쓰는부분입니다.
Oci 는 WebLogic 에서 지원하는 겁니다.
일단 oci driver 먼저 setting 해 보겠습니다.
먼저 default 로
#weblogic.jdbc.connectionPool.oraclePool=# url=jdbc:weblogic:oracle,# driver=weblogic.jdbc.oci.Driver,# loginDelaySecs=1,# initialCapacity=4,# maxCapacity=10,# capacityIncrement=2,# allowShrinking=true,# shrinkPeriodMins=15,# refreshMinutes=10,# testTable=dual,# props=user=SCOTT;password=tiger;server=DEMO
이렇게 되 있습니다.

여기서 #을 없애서 주석을 없앤다음
weblogic.jdbc.connectionPool.oraclePool=\ 요부분에서
oraclePool 이라고 되 있는데 이것이 WebLogic 이 start 되면서 loading 하는
pool 이름이 됩니다. 이것을 user 가 임의로 줄 수 있습니다.
그러면 프로그램에 서 Class.forName 을 쓸 때 이 이름으로 loading 하게 됩니다.
예제 는 제가 밑에서 보여드리겠습니다.
그리고, props=user=SCOTT;password=tiger;server=DEMO 부분은
아시다시피 user 와 password 를 넣는 부분입니다.
이것만 설정하면 pool 이 loading 이 됩니다.
Server=DEMO 는 sqlnet 을 통해서 원격 데이터 베이스 에 접근 할 때 씁니다.
Local 데이터 베이스라면 server 부분은 생략해도 됩니다.
Sqlnet 에서 tns name 을 생성한 그 이름이 server= 에 들어가게 됩니다.
Oracle net easy configuration 에서 tns name 을 생성할수 있습니다.
그리고,원격에 접근할 때 initialCapacity 부분을 없애야 됩니다. 아니면
원격 데이터 베이스 와 맞춰주든가요…

이상은 oci driver 를 쓸때였습니다.
이제부터는 Oracle에 서 지원하는 driver를 써서 pool 을 작성 해보겠습니다.
weblogic.jdbc.connectionPool.misPool= url=jdbc:oracle:thin:@150.1.202.46:1521:mis1db, driver=oracle.jdbc.driver.OracleDriver, loginDelaySecs=1, initialCapacity=3, maxCapacity=9, capacityIncrement=2, allowShrinking=true, shrinkPeriodMins=15, refreshMinutes=10, testTable=dual,props=user=scott;password=tiger;
weblogic.allow.reserve.weblogic.jdbc.connectionPool.misPool=everyone
자 보시면 아마 Oracle 을 써보셨으면 아실 겁니다.
달라진 부분이 머냐 하면 url 과 driver 부분이 달라졌죠?
물론 misPool 은 user가 임의로 줄 수 있는 Pool Name 입니다.
그리고, url=jdbc:oracle:thin:@150.1.202.46:1521:testdb,\ 에서
testdb 는 sid 입니다. SqlPlus 에 서 로긴 할 때 hoststring에 들어갈 부분의 이름입니다. Local 데이터 베이스 라면 ORCL 이 보통입니다.(셋팅에 따라 다름)weblogic.allow.reserve.weblogic.jdbc.connectionPool.misPool=everyone
부분은 misPool 에 접근 권한을 모두에게 준다는 겁니다.
나머지는 그냥 두시면 되는데 부수적으로 설명을 드리면
initialCapacity=3,\ 는 처음 생성할 pool 의 개수를 말합니다.
maxCapacity=9,\ 는 최대 9개 까지 만들수 있다는 겁니다.
capacityIncrement=2,\ 는 최대 pool 개수를 넘으면 2개씩 증가 하라는 겁니다.

다 아시겠지만 thin 다음에 나오는 ip 는 데이터 베이스 서버가 위치한
시스템 의 ip 입니다.
Local 데이터 베이스 라면(고정 ip인 경우) local 시스템의 ip 를, 유동 ip 라면 127.0.0.1 을 쓰면 됩니다(localhost)

이상 WebLogic 의 Setting 및 DB Connection Pool 설정에 대한 설명이었습니다.

다음은 프로그램에서 사용방법입니다.
보통 direct 로 Oracle 에 연결할 때...

Connection Con = null;
String url = “jdbc:oracle:thin:@127.0.0.1:1521:mis1d”;
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Con = DriverManager.getConnection(url,”scott”,”tiger”);

이렇게 해서 Oracle 과 연결을 합니다.

이렇게 프로그램에서 하나하나 해주게 되면 매 프로그램마다 loading
을 하게 되므로 서버에 엄청난 부하를 주게 됩니다.

그래서,main Programmer 들이 pool 을 만들어 던가 아니면 pool class 를 직접 만들어서 connection 을 얻어오도록 하는게 보통입니다.
WebLogic 에서는 간편합니다.
WebLogic 이 start 할 때만 pool 을 가져 오기 때문에 driver class 를
프로그램 실행 시 마다 가져 오지 않습니다.

아래는 WebLogic에 서의 driver loading 예제 입니다.

Driver Drv = null;
Connection Con = null;
Drv = (Driver)Class.forName(“weblogic.jdbc.pool.Driver”).newInstance();
Con = Drv.connect(“jdbc:weblogic:oci:misPool”,null); “misPool” 은 user 가 지정한 Pool 이름 입니다.

이상 connection 을 여는 방법입니다.
이하, 이제 PreparedStatement 나 Statement 를 통해서 ResultSet 을 받아서 프로그램을 작성하면 됩니다.


출처: http://www.dakorsys.com
Trackbacks 0 : Comments 0