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 \ --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.1.tar.bz2 # tar xvfj apr-util-1.6.1.tar.bz2 # cd apr-util-1.6.1 # ./configure --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 # 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-2024 Jo HoSeok. All rights reserved. |