TOMCAT - 윈디하나의 솔라나라
|
썬 마이크로시스템즈에서 서블릿과 JSP의 레퍼런스 구현을 위해 개발하다가, The Apache Software Foundation 에 기증되었다. 이렇게 해서 나온게 Tomcat 3다. 이 당시에는 아파치 소프트웨어 재단의 자카르타 프로젝트의 일환이었지만, 현재는 톱 레벨 프로젝트로 승격되었다. (자카르타 프로젝트는 아파치 소프트웨어 재단에서 지원하는 오픈 소스 자바 솔루션 프로젝트의 이름이다) 톰캣 4와 5.5 발표때 코드가 재 작성되어, 지금은 톰캣3의 소스의 흔적을 찾아보기는 힘들다.
/usr/apache/tomcat에 톰캣 4가, /usr/apache/tomcat55에 톰캣 5.5가 번들되어있지만 이 문서에서는 이것을 사용하지 않는다. 이 문서의 내용을 따라하기 위해 번들된 톰캣을 삭제할 필요는 없다.pkg install tomcat-8명령으로 설치할 수 있다. IPS에 대한 설명은 윈디하나의 솔라나라: IPS를 읽어보자.jdk-8u231-solaris-x64.tar.gz파일은 공식 홈페이지에 링크되어있는 다운로드 홈페이지에서 다운로드 할 수 있다. /etc/oracle/java/usagetracker.properties파일에 com.oracle.usagetracker.track.last.usage=false를 넣으면 ~/.oracle_jre_usage디렉토리에 생성되는 Java Usage Tracker 데이터를 생성하지 않도록 할 수 있다.$ cd /usr/local $ sudo tar xvfz ~/src/jdk-8u301-solaris-x64.tar.gz $ sudo rm -f java; sudo ln -s jdk1.8.0_301 java $ sudo vi /etc/profile ... if [ -d /usr/local/java ]; then JAVA_HOME=/usr/local/java; export JAVA_HOME; JDK_HOME=$JAVA_HOME; export JDK_HOME; JRE_HOME=$JAVA_HOME; export JRE_HOME; PATH=$JAVA_HOME/bin:$PATH; export PATH; MANPATH=$MANPATH:$JAVA_HOME/man; export MANPATH; fi $ . /etc/profile $ $JAVA_HOME/bin/java -version java version "1.8.0_301" Java(TM) SE Runtime Environment (build 1.8.0_301-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)
Tomcat - Native library을 64비트로 빌드해야 한다. Native library를 64비트로 빌드하려면, 빌드에 필요한 라이브러리들도 모두 64비트로 빌드 되어있어야 한다. 만약 시스템에서 32비트 라이브러리를 사용한다면 차라리 JDK를 32비트로 변경해보자. 단 솔라리스용 JDK 8는 32비트를 제공하지 않기 때문에 JDK 7을 사용해야 한다. 32비트 JDK와 64비트 JDK의 차이점은 윈디하나의 솔라나라: Java 고급 (작성중)를 참조하자.
윈디하나의 솔라나라: OpenSSL을 참고해 OpenSSL 을 설치해놓자. OpenSSL 1.0.2 이상이 필요하다.
# wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
# tar xvfz libiconv-1.16.tar.gz
# cd libiconv-1.16
# ./configure --prefix=/usr/local --enable-static --enable-shared 1)
# make
# sudo make install
1) 64비트로 컴파일 하려면 CFLAGS="-m64"를 사용하자.
# wget http://mirror.navercorp.com/apache/apr/apr-1.7.0.tar.bz2 # tar xvfj apr-1.7.0.tar.bz2 # cd apr-1.7.0 # ./configure CC=gcc CFLAGS="-m64" LDFLAGS="-m64" \ --enable-nonportable-atomics \ --enable-threads \ --enable-posix-shm \ --enable-allocator-uses-mmap \ --enable-allocator-guard-pages \ --enable-pool-concurrency-check \ --enable-other-child \ --prefix=/usr/local 1) 3) # make # make install 2) # wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.3.tar.bz2 # tar xvfj apr-util-1.6.3.tar.bz2 # cd apr-util-1.6.3 # ./configure CFLAGS="-m64" LDFLAGS="-m64" --with-apr=/usr/local/bin/apr-1-config \ --with-ldap \ --with-iconv=/usr/local \ --with-openssl=/usr/local/ssl \ --with-crypto=/usr/local/ssl 3) # make # sudo make install1)
--enable-nonportable-atomics옵션은 이식 가능하지 않은 (운영체제에 특화된) Atomic operations 을 사용하라는 의미다. 사용하는 컴파일러에 따라 작동 방식이 다르다. GCC 4.1 이상에서는 __sync_val_compare_and_swap빌트인 함수를 사용하며, GCC를 사용하지 않는 솔라리스에서는 atomic_cas_ptr(3C)와 atomic_swap_ptr(3C)를 사용한다./usr/local 에 설치된다.CFLAGS="-m64"를 사용하자.
windy@wl ~/src $ wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-9/v9.0.26/bin/apache-tomcat-9.0.26.tar.gz windy@wl ~/src $ cd /usr/local windy@wl /usr/local $ sudo tar xvfz ~/src/apache-tomcat-9.0.26.tar.gz windy@wl /usr/local $ sudo chown -R windy:staff apache-tomcat-9.0.26 windy@wl /usr/local $ sudo rm -f tomcat windy@wl /usr/local $ sudo ln -s apache-tomcat-9.0.26 tomcat이로써 설치는 완료되었다. 단순히 압축만 풀어줘도
/usr/local/tomcat/bin/startup.sh 를 사용해 톰캣을 실행할 수 있다. 하지만 아래에 소개된 몇가지 추가 설치를 고려해보자.
0.0.0.0:8009, 0.0.0.0:8080, 127.0.0.1:8005 포트가 오픈된다. 이중 8009포트는 AJP를 처리하기위한 포트다. 참고로 8080 포트는 http를 처리하기위한 포트고, 8005 포트는 로컬에서 서버에 명령을 내리기 위한 포트다./usr/local/apache2에 설치되었다고 가정한다. 아파치 웹 서버의 설치방법은 윈디하나의 솔라나라: AMP - The Apache HTTP Server를 참고한다.
httpd.conf에 톰캣 연동을 위한 설정을 추가하고 톰캣에서 처리할 요청(=URL, JkMount 옵션으로 지정함)을 지정함.windy@wl ~/src $ wget http://mirror.apache-kr.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.46-src.tar.gz windy@wl ~/src $ tar xvfz tomcat-connectors-1.2.46-src.tar.gz windy@wl ~/src $ cd tomcat-connectors-1.2.46-src/native windy@wl ~/src/tomcat-connectors-1.2.46-src/native $ ./configure --with-apxs=/usr/local/apache2/bin/apxs windy@wl ~/src/tomcat-connectors-1.2.46-src/native $ make windy@wl ~/src/tomcat-connectors-1.2.46-src/native $ sudo make install windy@wl ~/src/tomcat-connectors-1.2.46-src/native $ cd ../conf windy@wl ~/src/tomcat-connectors-1.2.46-src/conf $ sudo cp httpd-jk.conf /usr/local/apache2/conf/extra/ windy@wl ~/src/tomcat-connectors-1.2.46-src/conf $ sudo cp uriworkermap.properties /usr/local/apache2/conf/extra/ windy@wl ~/src/tomcat-connectors-1.2.46-src/conf $ sudo cp workers.properties.minimal /usr/local/apache2/conf/workers.properties커넥터 설정은 다음 챕터를 참고하자.
$CATALINA_HOME/logs/catalina.out 에 아래와 같은 메시지가 나오는 것을 볼 수 있다.정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: ...즉 성능을 위해서는 네이티브 라이브러리를 사용하라는 의미다. Apache Portable Runtime (APR) based Native library for Tomcat 의 문서를 보면 더 많은 정보를 얻을 수 있다. 네이티브 라이브러리를 컴파일해 설치하기 위해서는 APR 1.2+, OpenSSL 1.0.2+, JDK 1.4+ 및 C 컴파일러가 필요하다. 아래와 같이 설치해주면 된다.
$CATALINA_BASE/bin/tomcat-native.tar.gz)있는 소스를 빌드해 사용할 수 있다.windy@wl ~/src $ wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-connectors/native/1.2.23/source/tomcat-native-1.2.23-src.tar.gz windy@wl ~/src $ tar xvfz tomcat-native-1.2.23-src.tar.gz windy@wl ~/src $ cd tomcat-native-1.2.23-src/native windy@wl ~/src/tomcat-native-1.2.23-src/native $ ./configure --prefix=/usr/local --with-apr=/usr/local --with-ssl=/usr/local/ssl 1) windy@wl ~/src/tomcat-native-1.2.23-src/native $ make windy@wl ~/src/tomcat-native-1.2.23-src/native $ sudo make install 2)1)
/usr/local에 설치한다.
$CATALINA_HOME/logs/catalina.out에 정보 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR 버전 [1.7.0]을(를) 사용한, APR 기반 Apache Tomcat Native 라이브러리 [1.2.23]을(를) 로드했습니다.와 같이 표시되며 APR기반 커넥터(ajp-apr-8009, http-apr-8080)를 사용할 수 있다. 라이브러리를 로드하지 못하면
LD_LIBRARY_PATH환경변수에 지정된 라이브러리 경로에 /usr/local/lib이 추가되어있는지 확인해본다.
windy@wl /usr/local/tomcat/bin $ tar xvfz commons-daemon-native.tar.gz
windy@wl /usr/local/tomcat/bin $ cd commons-daemon-1.2.1-native-src/unix
windy@wl /usr/local/tomcat/bin/commons-daemon-1.2.1-native-src/unix $ ./configure --with-java=/usr/local/java
windy@wl /usr/local/tomcat/bin/commons-daemon-1.2.1-native-src/unix $ make
windy@wl /usr/local/tomcat/bin/commons-daemon-1.2.1-native-src/unix $ cp jsvc ../..
windy@wl /usr/local/tomcat/bin/commons-daemon-1.2.1-native-src/unix $ cd ../..
windy@wl /usr/local/tomcat/bin $ sudo useradd -u 210 tomcat
windy@wl /usr/local/tomcat/bin $ sudo ./daemon.sh start 1)
1) startup.sh, shutdown.sh 대신 daemon.sh start, daemon.sh stop를 사용해 톰캣을 시작/종료해야 한다. 자세한 설명은 Tomcat Setup을 읽어보자. (아니면 catalina.sh를 적당히 수정해도 된다) 이 문서는 Commons Daemon를 사용하지 않은 톰캣을 기준으로 삼기 때문에, 이 이후에도 시작/종료 스크립트를 daemon.sh으로 표기하지 않는다.
setenv.sh에 저장한다. 사용 가능한 환경변수의 목록는 catalina.sh파일의 주석에 설명되어있다.
windy@wl ~ $ vi /usr/local/tomcat/bin/setenv.sh
#!/bin/sh
#JAVA_HOME=/usr/local/java
CATALINA_OPTS="-d64 -server -Xms512m -Xmx1024m"
#CATALINA_OPTS="$CATALINA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EventPortSelectorProvider" 1)
1) 솔라리스 10 이상을 사용하고 있다면 언코멘트 한다. 리눅스에서는 epoll(7) 사용 여부(리눅스 커널 2.6 이상)를 자동감지해 사용 하기 때문에 수정할 필요 없다. Enhancements in Java I/O를 읽어보자.
tomcat-users.xml을 수정한다.
windy@wl ~ $ vi /usr/local/tomcat/conf/tomcat-users.xml <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="manager-gui" /> <role rolename="admin-gui" /> <user username="tomcat" password="s3cret" roles="admin-gui,manager-gui" /> </tomcat-users>
위 설정에서 사용자는 tomcat
, 패스워드는 s3cret
이다. 톰캣에서 흔한 패스워드이므로 반드시 다른 것으로 바꿔 사용하자.
localhost에서만 접속할 수 있다. 외부에서 접속하면 tomcat-users.xml에 사용자를 넣었는데도 사용자를 추가하라는 화면이 나온다. localhost이외의 곳에서 접속하려면 webapps/manager/META-INF/context.xml, webapps/host-manager/META-INF/context.xml에서 org.apache.catalina.valves.RemoteAddrValve의 allow부분을 수정해야 한다.server.xml의 Connector태그에 아래와 같이 추가한다.
주로 웹 페이지에서 한글로된 문자열을 파라메터로 받았을때, request.getParameter()에서 문자열이 깨지는 현상이 발생할 때 사용한다. (발생하지 않으면 사용해서는 안된다!) 만약 EUC-KR을 사용한다면 아래에서 UTF-8로 된 부분을 EUC-KR으로 수정해야 한다.
root@wl ~ # vi /usr/local/tomcat/conf/server.xml 1)
<!-- Connector 태그에 useBodyEncodingForURI="true" 또는 URIEncoding="UTF-8" 속성을 추가한다. -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" useBodyEncodingForURI="true" />
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" connectionTimeout="20000" maxKeepAliveRequests="10" keepAliveTimeout="5000" />
windy@wl ~ $ vi $CATALINA_BASE/conf/web.xml
...
<filter>
<filter-name>setCharacterEncodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>setCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>failedRequestFilter</filter-name>
<filter-class>
org.apache.catalina.filters.FailedRequestFilter
</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>failedRequestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
스프링 프레임워크(Spring Framework)를 사용한 경우 스프링에서 제공하는 필터를 등록해 해결할 수 있다.
root@wl ~ # vi /컨텍스트홈/WEB-INF/web.xml
...
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
...
기본적으로 웹에서 사용할 인코딩과 운영체제에서 사용할 인코딩을 동일하게 가져가는 것이 여러가지 인코딩 문제를 해결하기 좋다. 자바스크립트를 포함한 AJAX 형태로 사용하는 경우 encodeURIComponent() 으로 인코딩해서 전달하는 것도 좋은 방법이다.
conf/server.xml의 <Connector>의 속성을 수정해 설정을 변경할 수 있다. -1로 정하면 제한을 두지 않는다.
<Connector maxPostSize="52428800" >
windy@wl ~ $ vi /usr/local/tomcat/webapps/manager/WEB-INF/web.xml
...
<multipart-config>
<!-- 500MiB max -->
<max-file-size>524288000</max-file-size>
<max-request-size>524288000</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
...
windy@wl ~ $ vi /usr/local/apache2/conf/httpd.conf 1) ... # mod_jk Include conf/extra/httpd-jk.conf root@wl ~ # vi /usr/local/apache2/conf/extra/httpd-jk.conf ... JkWorkersFile conf/workers.properties 1) ... JkMountFile conf/extra/uriworkermap.properties 1) ... # JkMount /*.jsp ajp13 root@wl ~ # vi /usr/local/apache2/conf/workers.properties worker.list=wlb,jkstatus,jk-status,jk-manager 2) ... worker.jk-status.type=status 3) worker.jk-status.read_only=true 3) worker.jk-manager.type=status 3) root@wl ~ # vi /usr/local/apache2/conf/extra/uriworkermap.properties ... /*.jsp=wlb 3)1) 보기와 같이 주석 표시(#)를 지운다.

startup.sh을 실행하면 된다.
windy@wl ~ $ /usr/local/tomcat/bin/startup.sh 1)
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
windy@wl ~ $ tail -f /usr/local/tomcat/logs/catalina.out
...
27-Sep-2019 00:45:51.664 정보 [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
27-Sep-2019 00:45:51.690 정보 [main] org.apache.coyote.AbstractProtocol.start 프로토콜 핸들러 ["ajp-nio-8009"]을(를) 시작합니다.
27-Sep-2019 00:45:51.699 정보 [main] org.apache.catalina.startup.Catalina.start 서버가 [2,082] 밀리초 내에 시작되었습니다.
톰캣 종료는 단지 shutdown.sh을 실행하면 된다.
windy@wl ~ $ /usr/local/tomcat/bin/shutdown.sh Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar1)
startup.sh에서 catalina.sh을 호출하며, catalina.sh에서는 setenv.sh와 setclasspath.sh을 읽어들여 환경 변수를 설정한다.
tomcat_smf.xml | (865 바이트) |
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='Tomcat'>
<service name='application/web/tomcat' type='service' version='1'>
<single_instance />
<exec_method
type='method'
name='start'
exec='/usr/local/tomcat/bin/startup.sh'
timeout_seconds='60' />
<exec_method
type='method'
name='stop'
exec='/usr/local/tomcat/bin/shutdown.sh'
timeout_seconds='60' />
<instance name='default' enabled='false' />
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>Apache Tomcat</loctext>
</common_name>
<documentation>
<manpage title='tomcat' section='1' manpath='/usr/local/tomcat/man' />
</documentation>
</template>
</service>
</service_bundle>
root@wl ~ # mkdir /var/svc/manifest/application/web root@wl ~ # wget -o /var/svc/manifest/application/web/tomcat.xml http://www.solanara.net/contents/includes/tomcat_smf.xml root@wl ~ # svccfg import /var/svc/manifest/application/web/tomcat.xml root@wl ~ # svcadm enable tomcat
| 톰캣 시작 화면 http://localhost:8080 |
![]() |
톰캣 관리자 (http://localhost:8080/manager/html)

톰캣 호스트 관리자 (http://localhost:8080/host-manager/html)

톰캣 상태 (http://localhost:8080/manager/status)

Complete Server Status로 들어가면더 상세한 상태를 볼 수 있다.
/usr/local/tomcat/webapps/ROOT/tomcat_test.jsp으로 저장한다.
tomcat_test.jsp | (1,393 바이트) |
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.lang.management.*,org.apache.catalina.util.*"
%><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>윈디하나의 솔라나라: TOMCAT - TOMCAT TEST</title></head>
<body><pre>
운영체제: <%=System.getProperty("os.name")%> <%=System.getProperty("os.version")%>
아키텍처: <%=System.getProperty("os.arch")%>
데이터모델: <%=System.getProperty("sun.arch.data.model")%>비트
자바스펙버전: <%=ManagementFactory.getRuntimeMXBean().getSpecVersion()%>
자바VM버전: <%=ManagementFactory.getRuntimeMXBean().getVmVersion()%>
클래스경로: <%=System.getProperty("java.class.path",".")%>
라이브러리경로: <%=System.getProperty("java.library.path", ".")%>
파라메터: <%=request.getParameter("param")%> ('한글'이라고 표기되어야 함)
톰캣PID: <%=ManagementFactory.getRuntimeMXBean().getName().split("@")[0]%>
톰캣버전: <%=ServerInfo.getServerNumber()%>
파일캐릭터셋: <%=System.getProperty("file.encoding")%>
시스템캐릭터셋: <%=java.nio.charset.Charset.defaultCharset().name()%>
페이지캐릭터셋: <%=response.getCharacterEncoding()%>
서블릿 경로: <%=application.getRealPath("")%>
</pre>
</body>
</html>
톰캣에 직접 접속하는 http://localhost:8080/tomcat_test.jsp?param=%ED%95%9C%EA%B8%80 와
아파치를 통해 접속하는 http://localhost/tomcat_test.jsp?param=%ED%95%9C%EA%B8%80 에 접속해서, 아래화면과 비슷하게 보여야 한다.
운영체제: SunOS 5.11
아키텍처: amd64
데이터모델: 64비트
자바스펙버전: 1.8
자바VM버전: 25.202-b08
클래스경로: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
라이브러리경로: ...
파라메터: 한글 ('한글'이라고 표기되어야 함)
톰캣PID: 28618
톰캣버전: 9.0.17.0
파일캐릭터셋: UTF-8
시스템캐릭터셋: UTF-8
페이지캐릭터셋: UTF-8
서블릿 경로: /usr/local/apache-tomcat-9.0.17/webapps/ROOT/
/usr/local/tomcat/webapps/ROOT/tomcat_connstatus.jsp으로 저장한다.
tomcat_connstatus.jsp | (3,994 바이트) |
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.util.*,javax.management.*,org.apache.tomcat.util.modeler.Registry"
%><%!
public static String padRight(String s, int n) {
return String.format("%1$-" + n + "s", s);
}
public static String padLeft(String s, int n) {
return String.format("%1$" + n + "s", s);
}
public static String formatTime(Object obj, boolean seconds) {
long time = -1L;
if (obj instanceof Long) {
time = ((Long) obj).longValue();
} else if (obj instanceof Integer) {
time = ((Integer) obj).intValue();
}
if (seconds) {
return ((((float) time ) / 1000) + " s");
} else {
return (time + "ms");
}
}
public static String formatSize(Object obj, boolean mb) {
long bytes = -1L;
if (obj instanceof Long) {
bytes = ((Long) obj).longValue();
} else if (obj instanceof Integer) {
bytes = ((Integer) obj).intValue();
}
if (mb) {
StringBuilder buff = new StringBuilder();
if (bytes < 0) {
buff.append('-');
bytes = -bytes;
}
long mbytes = bytes / (1024 * 1024);
long rest =
((bytes - (mbytes * (1024 * 1024))) * 100) / (1024 * 1024);
buff.append(mbytes).append('.');
if (rest < 10) {
buff.append('0');
}
buff.append(rest).append("MiB");
return buff.toString();
} else {
return ((bytes / 1024) + "KiB");
}
}
%><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head><title>윈디하나의 솔라나라: TOMCAT - CONNECTION STATUS</title></head>
<body><pre>
수행시간 IP URL 호스트명 받음 보냄 커넥터명
-------- --------------- ---------------------- --------------- ---- ---- ---------------
<%
// 아래 소스 참고
// org.apache.catalina.manager.StatusManagerServlet
// org.apache.catalina.manager.StatusTransformer
MBeanServer mBeanServer = Registry.getRegistry(null, null).getMBeanServer();
Vector<ObjectName> requestProcessors = new Vector<ObjectName>();
String onStr = "*:type=RequestProcessor,*";
ObjectName objectName = new ObjectName(onStr);
Set<ObjectInstance> set = mBeanServer.queryMBeans(objectName, null);
Iterator<ObjectInstance> iterator = set.iterator();
while (iterator.hasNext()) {
ObjectInstance oi = iterator.next();
requestProcessors.addElement(oi.getObjectName());
}
Enumeration<ObjectName> enumeration = requestProcessors.elements();
while (enumeration.hasMoreElements()) {
objectName = (ObjectName) enumeration.nextElement();
String workerName = objectName.getKeyProperty("worker");
int stageValue = (Integer) mBeanServer.getAttribute(objectName, "stage");
String URL = (String) mBeanServer.getAttribute(objectName, "currentUri");
if (stageValue >= 1 && stageValue <= 7 && URL != null) {
String queryString = (String) mBeanServer.getAttribute(objectName, "currentQueryString");
out.write(padLeft(formatTime(mBeanServer.getAttribute(objectName, "requestProcessingTime"), false), 8));
out.write(" " + padLeft(((String) mBeanServer.getAttribute(objectName, "remoteAddr")).trim(), 15));
out.write(" " + padLeft(URL + (queryString != null ? "?" + queryString : ""), 22));
out.write(" " + padRight(mBeanServer.getAttribute(objectName, "virtualHost").toString(), 10));
out.write(" " + formatSize(mBeanServer.getAttribute(objectName, "requestBytesReceived").toString(), false));
out.write(" " + formatSize(mBeanServer.getAttribute(objectName, "requestBytesSent").toString(), false));
out.write(" " + workerName);
out.write("\n");
}
}
%></pre></body>
</html>
톰캣 매니저의 톰캣 상태 확인 페이지에서, 접속 상태(URL, 시간, 보낸 크기, 받은 크기, 접속한 톰캣 커넥터 이름 등)만 볼 수 있도록 프로그램을 재 구성했다. 아래와 유사하게 표시될 것이다.
수행시간 IP URL 호스트명 받음 보냄 커넥터명
-------- --------------- ---------------------- --------------- ---- ---- ---------------
3ms xxx.xxx.xxx.xxx /tomcat_connstatus.jsp xxx.xxx.xxx.xxx 0KiB 0KiB "http-nio-8080"
probe.war를 다운로드 받는다.tomcat-users.xml에서 설정해준 암호를 넣으면 된다. 솔라나라에서는 tomcat / s3cret 를 사용한다)해서 화면 하단의 WAR file to deploy를 선택해
probe.war를 선택하고 Deploy를 클릭한다.
Applications탭에
/probe컨텍스트가 추가된것을 확인할 수 있다.
설정이 완료되었으면 http://localhost:8080/probe/에 접속해 사용할 수 있다. 접속에 필요한 아이디 및 패스워드는 Tomcat Manager 암호와 같다.




| RSS ATOM XHTML 5 CSS3 |
Copyright © 2004-2025 Jo HoSeok. All rights reserved. |