에러로그:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
 ...., which  is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.


자상하게도 autoReconnect=true 로 바꾸거나 wait_timeout 을 수정하라고 한다..

wait_timeout 은 connection 증가로 그리 땡기진 않고..autoReconnection 을 추가하기로 했다.
설정은 jdbc 커넥션 설정 파일에서 url 에 "autoReconnection=true" 를 넣어주면 된다.

* url=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf8&autoReconnect=true
* validationQuery="select 1"

그리고 이 외에도 validationQuery를 넣어주는 데 이유는 한번 커넥션이 끊어진다음 재시도를 하는 경우 문제가 있는 처음 한번의 시도는 에러가 나게 된다. 이때 넣어주는게 validationQuery로 모든 사용자쿼리를 실행 전에 한번 이 쿼리를 실행하게 된다.(그러므로 DB로서는 추가적인 부하가 됨) 쿼리가 한번 더 실행되는 것인 만큼 가장 간단한 쿼리여야 한다.

>validationQuery description

Parameter Default Description
validationQuery The SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row.



보통은 SELECT 1 을 많이 쓴다.(oraqle은 SELECT 1 FROM DUAL)
추가적인 쿼리인 만큼 access가 많은 곳에선 조심해서 써야 할듯?

jdbc 설정과 관련된것은 아래 링크를 참조함..
http://commons.apache.org/dbcp/configuration.html

출처 : http://netholic.tistory.com/137
2013/03/12 13:55 2013/03/12 13:55

tomcat-native 설치되어 있지 않다면 아래와 같이 에러가 발생한다.

INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/jdk1.6.0_32_i586/jre/lib/i386/server:/usr/local/jdk1.6.0_32_i586/jre/lib/i386:/usr/local/jdk1.6.0_32_i586/jre/../lib/i386:/usr/lib:/usr/lib:/usr/lib:/usr/lib::/usr/java/packages/lib/i386:/lib:/usr/lib

tomcat-native 설치해 주면 된다. 중요한 것은 os, jdk bit가 일치해야 정상적으로 톰캣이 tomcat-native 라이브러리를 로드한다.

jdk 버전은 아래와 같이 하면 알수 있다. 64-Bit 가 없다면 32bit용으로 설치가 되어 있는 것이다.

[[email protected] tomcat]# java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.8) (rhel-1.22.1.9.8.el5_6-x86_64)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)

OS bit 확인 x86_64은 64bit을 의미하며 i686 으로 나올 경우 32bit인 것이다.
[[email protected] tomcat]# uname -a
Linux techcs9577.cafe24.com 2.6.18-194.3.1.el5xen #1 SMP Thu May 13 13:49:53 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

# yum install apr-devel.x86_64
# cd tomcat/bin
# tar zxvf tomcat-native.tar.gz
# cd tomcat-native-1.1.12-src/jni/native
# ./configure --with-apr=/usr/bin/apr-1-config && make && make install
# ln -s /usr/local/apr/lib/libtcnative-1.so.0.1.12 /usr/lib/libtcnative-1.so

참고) http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Tomcat+Native+Library

Tomcat Native Library
Tags: understanding and improving liferay

Table of Contents [-+]

    * 1 Basic Overview
    * 2 Installation
    * 2.1 Linux
    * 2.2 Mac OS X
    * 2.3 Windows
    * 3 JBoss-Tomcat Bundle

This article deals with the use of the Apache Tomcat Native Library to speed up Liferay.
Basic Overview

The Apache Tomcat Native Library is a JNI (Java Native Interface) that provides many of Tomcat's core functionality in native code instead of Java bytecode. What does this mean? SPEED. For a cursory speed comparison, here is the startup time for my Liferay running on Tomcat without it installed:

 INFO: Server startup in 14463 ms

And, with the native library installed:

 INFO: Server startup in 13266 ms

That's about a 10% speed boost. If you do not have the native library properly installed on your system, your log files will always begin with something that looks like this:

 INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java

Installation
Linux
(Tested with standard Tomcat 5.5.17 downloaded from Apache site, running on Ubuntu 7.04 - Feisty Fawn)

  1. Make sure that you have the libssl-dev and libapr1-dev packages installed$ apt-get install libssl-dev libapr1-dev
  2. Switch to your tomcat's bin directory$ cd ${TOMCAT_HOME}/bin
  3. Extract the tarball (tarred and gzipped archive) of the tomcat native lib$ tar -xvzf tomcat-native.tar.gz
  4. Jump into the source folder$ cd tomcat-native-1.1.3/jni/native
  5. Configure, make and install it$ ./configure --with-apr=/usr && make && sudo make install
  6. Change to the system library folder$ cd /usr/lib
  7. Make a convenience link to you new library$ sudo ln -s /usr/local/apr/lib/libtcnative-1.so libtcnative-1.so
  8. Edit ${TOMCAT_HOME}/bin/catalina.sh adding the following lines somewhere before the java program is executedLD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH
  9. Finally, edit /etc/modprobe.d/aliases and change the linealias net-pf-10 ipv6toalias net-pf-10 off ipv6 and reboot. This disables IPV6 which the library does not support yet (and hence will throw exceptions when trying to bind to TCP ports on network devices having IPV6 enabled).
  10. Restart tomcat and enjoy!

Mac OS X

  1. Make sure to have installed the latest version of MacPorts.
  2. From the Terminal program, enter:sudo port install tomcat-native.
  3. From the Terminal program, make symbolic links from the /opt/local/lib/libtcnative-1.* to /usr/lib/java:sudo ln -s /opt/local/lib/libtcnative-1.* /usr/lib/java
  4. Restart Tomcat and enjoy!

Windows

  1. Download http://tomcat.heanet.ie/nativs/1.1.7/win32/tcnative-1-ipv4.dll
  2. Copy tcnative-1-ip4.dll to %TOMCAT_HOME%/bin
  3. Restart Tomcat and enjoy!

JBoss-Tomcat Bundle
If you are running with JBoss-Tomcat, be aware that the standard APR will not work properly. This is because JBoss makes some modifications to the Tomcat that is part of its bundle. For instructions on how to install the native libraries for JBoss-Tomcat, see the documentation at http://wiki.jboss.org/wiki/Wiki.jsp?page=HowToAddAprToJBoss. Liferay running on JBoss AS 4.0.5 has been reported to run with JBoss Native 2.0.1 performing, under load, with about a 20% speed boost.

2012/05/03 21:48 2012/05/03 21:48
참고 :
http://kyungseo.pe.kr/blog/55
2011/11/05 13:43 2011/11/05 13:43

톰캣 메모리릭 문제에 대해서 많이 좋아질 것으로 예상됩니다.

 

스프링소스의 개발자이며, 톰캣 Commitor Mark Thomas(subversion id : markt)에 의해 Memory Leak protection 기능이 새로 생기게 되었습니다. 원래는 톰캣 7부터 적용하려고 했는데, 톰캣 6.0.24 부터 적용되었다고 합니다. 6.0.25버전에는 Memory leak 체크 api도 지원하는 군요~ 덜덜
다음의 내용으로 Change log 6.0.25에 있습니다. ..

“Add new "Find leaks" command to the Manager application”

 

Mark는 이 OOME가 발생하는 원인을 톰캣이 아닌 Jvm, library라고 언급하였고, 그 예를 적었습니다.

(1)   Application, Library code 에 의해서 발생

A.     JDBC driver

B.      Logging framework

C.      ThreadLocal object를 저장하고 remove하지 않아서

D.     쓰레드를 시작시키고 멈추지 않아서

(2)   Java Api에 의해서도 발생

A.     Using the javax.imageio API (the Google Web Toolkit can trigger this)

B.      Using java.beans.Introspector.flushCaches() (Tomcat does this to prevent memory leaks caused by this caching)

C.      Using XML parsing (the root cause is unknown due to a bug in the JRE)

D.     Using RMI (somewhat ironically, causes a leak related to the garbage collector)

E.      Reading resources from JAR files

 

이런 문제가 나타나는 것의 이유 중의 하나는 Java Class Loader에서는 아직 object에 대해서 de-register 기능이 없습니다. 그래서 톰캣 web class loader는 이런 부분을 지원했습니다.

 

Mark는 이런 OOME 문제 해결을 위해서 다음을 하였습니다.

Org.apache.ctalina.loader.WebappClassLoader (http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?view=markup )클래스에 clearRefereneces() 메소드를 추가하여 톰캣에 의해서 load object들을 de-register하여 gc 되도록 하였습니다. PermGen 지우고 시작하는 같습니다.

 

또한 org.apache.catalina.core.JreMemoryLeakPreventionListener 클래스
(http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/JreMemoryLeakPreventionListener.java?view=markup )
추가하여 원인파악을 쉽게 있도록 api 제공하였습니다.

Mark java.util.logging 처럼 JRE에서 로딩되는 경우에 대해서는 Tomcat단에서 처리할 없으니, 다른 LogManager 쓰라고 권고하고 있습니다.

 

Static ThreadLocal의 경우도 해결이 힘들었는데. Tomcat 6.0.24는 아래와 같이 detect를 하고 webclassloader에서 ThreadLocalMap inspect함으로서 잘 테스트했다고 적혀 있네요.

Mar 17, 2010 10:23:13 PM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap

SEVERE: A web application created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [[email protected]]) and a value of type [test.leak.threadlocal.value.MyCounter] (value [[email protected]]) but failed to remove it when the web application was stopped. To prevent a memory leak, the ThreadLocal has been forcibly removed.

 

Tomcat manager "Find leaks" 누르면 아래와 같이 알려줄 수는 있으나, 상세한 것은 Eclipse MAT (http://www.eclipse.org/mat/) 쓰라고 합니다.

The following web applications were stopped (reloaded, undeployed), but their
classes from previous runs are still loaded in memory, thus causing a memory
leak (use a profiler to confirm):
/testWeb

 

 

 

l  참고자료

http://java.dzone.com/articles/memory-leak-protection-tomcat

http://java.dzone.com/articles/mark-thomas-apache-tomcat-7

http://tomcat.apache.org/tomcat-6.0-doc/changelog.html

http://wiki.apache.org/tomcat/MemoryLeakProtection?action=diff&rev1=3&rev2=4

2011/11/05 13:42 2011/11/05 13:42

회사 교육때문에 필요한 부분만 정리해 두었음. ㅎ
1.1 용어정리
  - 컴파일 : 고급 언어로 작성된 프로그래밍 언어를 기계어 또는 중간언어로 변화, 컴퓨터가 알수 있는 파일로 변환
  - 클래스 파일 : java로 컴파일 된 파일(확장자 : .class)
  - 서블릿 : 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램, 웹상에서 class 파일 사용.
  - 프레임워크 : 프로그램 개발 시 편의를 위해 제공되는 클래스들의 집함.
        * spring, struts, ibatis 등
  - 톰캣매핑 : apache + tomcat에서 나온 용어이며, apache와 tomcat 연결고리
        * 규칙 : .action 확장자 매핑, servlet_test 주소 매핑
  - 라이브러리 : 클래스 압축파일.
 
1.2 구조 : apache 1.3 + tomcat 6.0.29     ## 해당 구조로 인하여 톰캣매핑이 필요
1.3 특이사항 : JVM 메모리 할당
1.4 디렉토리 구조

- tomcat
  - bin                   ## 톰캣 실행파일 위치
    * shutdonw.sh         ## 톰캣 정지
    * startup.sh          ## 톰캣 시작
    * version.sh          ## 톰캣 버전 확인
   
  - conf                 ## 톰캣 설정파일 위치
    * catalina.policy
    * catalina.properties
    * context.xml
    * logging.properties
    * server.xml          ## 톰캣 서버 설정
    * tomcat-users.xml
    * web.xml             ## 파일 삭제될 시 톰캣 시작이 정상적으로 안됨.
    * web.xml_org
  - lib
    * annotations-api.jar
    * catalina-ant.jar
    * catalina-ha.jar
    * catalina-tribes.jar
    * catalina.jar
    * el-api.jar
    * jasper-el.jar
    * jasper-jdt.jar
    * jasper.jar
    * jsp-api.jar
    * mysql-connector-java-5.1.6-bin.jar    ##mysql connection 라이브러리
    * ojdbc14.jar                           ##oracle connection 라이브러리
    * servlet-api.jar
    * tomcat-coyote.jar
    * tomcat-dbcp.jar
    * tomcat-i18n-es.jar
    * tomcat-i18n-fr.jar
    * tomcat-i18n-ja.jar
   
  - logs
    * catalina.out   ## 톰캣관련 모든로그가 저장되어 있음.
    * catalina.2010-08-02.log
    * host-manager.2011-08-26.log
    * localhost.2011-08-26.log
    * manager.2011-08-26.log
   
  - temp
  - webapps     ## 톰캣 기본 설치시 appBase ( 카페24 : /home/hosting_users/ID)
  - work        ## jsp 클래스 파일 및 세션파일 위치

- www           ## 톰캣 docBase
  - WEB-INF     ## WEB-INF 디렉토리 하위 파일은 브라우저에서 직접 접근 불가능
    -classes    ## 서블릿등을 사용하기 위한 클래스 파일 위치 (.class)
    -lib        ## 라이브러리 파일 위치 (.jar)
    * web.xml   ## 서블릿, MIME 타입, 보안, 세션 구성등을 설정하는 파일
    
2011/09/10 09:15 2011/09/10 09:15
TAG ,

서버에 아래와 같은 DB 관련 에러가 간헐적으로 발생하고 있는 상태


org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
.. 중략
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
 
[원인]
원인은 크게 두가지 경우로 나뉩니다.
 
1. DB Connection Pool 을 사용함에 있어서 connection Resource를 사용 후 이를 반환(close) 하지
않은 경우
 
2. Tomcat이 작동중인 JVM이 가비지 컬렉션을 할 때, 그 시간이 JNDI Resource에 파라미터로 설정한 maxWait보다 길게 갈 경우 DB 커넥션이 끊어지는 경우
 
[처리내용]
1번의 원인(코드상의 문제)으로 보기엔 테스트서버에서도 충분히 해당 에러가 발생했어야 하는데 전혀 발생하지 않았음.
코드를 확인 해도 역시 resource 반환하는 소스엔 문제 없다고 판단됨.
 
2번을 검토하기 위해선 maxWait 를 늘려 보고 지속적인 모니터링을 하는 방법 선택 함.

maxWait 값을 기존 2000 (2초)에서 10000(10초)로 늘림


maxIdle="30"
maxWait="10000"
maxActive="100"
     

문서의 Common Problems 절 참조)
 
위 처리로 약 3시간 지난 현 시점 까지 에러 발생하지 않음.

출처 : http://blog.daum.net/kingches/17927041
2011/09/07 17:26 2011/09/07 17:26
공인된 인증서를 가지고 있으면 openssl을 통하여 PKCS #12 형식으로 변환하여 톰캣에 적용시킬 수 있음.
자체적으로 인증서를 생성할경우에는 복잡함.

ssl.key : 개인키
ssl.crt : 인증서
InstantSSL.ca-bundle : 중개자인증서

0. PKCS #12 형식으로 변환(톰캣에서 인식할수 있게 변환하는 것임)
openssl pkcs12 -export -in ssl.crt -inkey ssl.key -certfile InstantSSL.ca-bundle -out ssl.p12 -name tomcat

1. tomcat 5.5 경우 (server.xml)
<Connector port="8443"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" disableUploadTimeout="true"
              acceptCount="100" debug="0" scheme="https" secure="true"
              keystoreFile="/경로/client.p12" keystorePass="패스워드"
              keystoreType="pkcs12"
              clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601" />

2. tomcat 6 경우 (server.xml)
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
                  port="8443" minSpareThreads="5" maxSpareThreads="75"
                  enableLookups="true" disableUploadTimeout="true"
                  acceptCount="100" maxThreads="200"
                  scheme="https" secure="true" SSLEnabled="true"
                  keystoreFile="/경로/client2.p12" keystorePass="패스워드"
                  keystoreType="pkcs12"
                  clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601"/>


===================================================================================================

[자체적으로 인증서 생성시 SSL 적용방법]

touch index.txt
echo "0001" > serial
echo "0001" > crlnumber
vi /etc/pki/tls/openssl.cnf
dir            = .            # Where everything is kept  <-----요부분 . 으로 수정하면 됨.
certs          = $dir/certs            # Where the issued certs are kept
crl_dir        = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.

1. CA 및 서버 인증서 생성

- 자체인증기관 생성
openssl genrsa -des3 -out ./private/cakey.pem 2048

openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out ./cacert.pem

- key 생성
openssl genrsa -des3 -out certificate-key.pem 1024

- 인증기관(자체) 보낼 요청 생성
openssl req -new -days 3650 -key certificate-key.pem -out certificate-req.pem

- 인증기관(자체) 인증
openssl ca -in certificate-req.pem -out certificate.pem -notext

- 톰켓용 변환
openssl pkcs12 -export -in certificate.pem -inkey certificate-key.pem -certfile ./cacert.pem -out client.p12 -name tomcat

2. server.xml 설정
 - Tomcat 5.5 경우     
 <Service name="Catalina">
    <Connector port="8443"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" disableUploadTimeout="true"
              acceptCount="100" debug="0" scheme="https" secure="true"
              keystoreFile="/root/demoCA/client.p12" keystorePass="*******"
              keystoreType="pkcs12"
              clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601" />
        <Engine name="Catalina" defaultHost="localhost" debug="0">
          <Realm className="org.apache.catalina.realm.UserDatabaseRealm" debug="0"
                      resourceName="UserDatabase"/>
          <Host name="localhost" appBase="webapps">
              <Context path="/contextName" docBase="/home/altimis/tomcat/webapps/test"
                                                  reloadable="true"/>
      </Host>
    </Engine>
  </Service>
 
 
- Tomcat 6 경우     
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
 
<Connector protocol="org.apache.coyote.http11.Http11Protocol"
                  port="8443" minSpareThreads="5" maxSpareThreads="75"
                  enableLookups="true" disableUploadTimeout="true"
                  acceptCount="100" maxThreads="200"
                  scheme="https" secure="true" SSLEnabled="true"
                  keystoreFile="/root/demoCA/client.p12" keystorePass="******"
                  keystoreType="pkcs12"
                  clientAuth="false" sslProtocol="TLS" URIEncoding="KSC5601"/>


참고 사이트 : http://blog.naver.com/PostView.nhn?blogId=zauberha&logNo=150063226665
2011/08/30 09:05 2011/08/30 09:05

로그 확인시 IOException while loading persisted sessions 에러가 발생한 것으로 확인되었다.

이 경우 tomcat/conf/server.xml 의 <Context></Context> 태그 안에 아래와 같이 설정을 해주면 된다.

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"/>

Manager className 설정시에도 문제가 발생한다면,
session.ser 파일이 work 디렉토리에 남아 문제가 발생한 것이기 때문 에tomcat/work/의 하위디렉토리를 삭제 하고 톰캣을 재시작 해보자

2011/06/11 13:58 2011/06/11 13:58

tomcat 설정 파일

Tomcat 2011/01/08 15:08
WEB-INF 분석
  • /WEB-INF/web.xml - 디플로이먼트 디스크립터라고 불리는 파일이다. 이 파일은 자식이 속한 웹 응용프로그램의 구성에 관련된 정보를 가지고 있다. 이 파일은 DTD를 가지고 있으며, DTD에는 50여개의 태그들이 정의되어 있다.
  • /WEB-INF/classes/* - 서블릿과 유틸리티 클래스들이 있는 디렉토리이다. 이 디렉토리에 있는 클래스들은 응용프로그램의 클래스 로더에 의해 메모리로 로드된다.
  • /WEB-INF/lib/*.jar - 서블릿, 빈, 유틸리티 클래스들을 포함하는 JAR 파일들이 포함되어 있고, 이 파일들은 웹 응용프로그램 클래스 로드에 의해 로드된다.

server.xml 파일
- 톰캣의 구조와 톰캣 컴포넌트의 초기 구성 정보를 제공하는 역할을 하는 메인 구성 파일이다. server.xml은 XML 파일이기 때문에 XML 파일의 포맷과 문법을 따른다.
  • Server - server.xml 파일의 최상위의 원소로서 톰캣 서버를 정의한다. Server원소는 Logger와 ContextManager 원소를 포함할 수 있다.
  • Logger - 이 원소는 로거 객체를 정의한다. 각 로거 객체는 이름, 로거 객체의 출력물을 저장할 로그 파일, 로그 레벨을 정의하는 verbosityLevel 속성을 가지고 있다. 현재 서블릿을 위한 로거 객체, jsp 파일을 위한 로거 객체, 톰캣 실행 환경을 위한 로거 객체가 있다. 서블릿의 ServletContext의 log() 메소드의 결과물이 저장되는 로그 파일을 기술한다.
  • ContextManager - 구성과 ContextInterceptor, requestInterceptor, Context, Connector의 구조를 정의한다. 디버깅 레벨, webapps, conf, logs의 기본 디렉토리, working 디렉토리 이름
  • ContextInterceptor - 톰캣의 시작 및 종료 이벤트를 감시한다.
  • RequestInterceptor - 톰캣이 서비스하는 동안에 다양한 사용자의 요청 단계를 감시한다.
  • Connector - 클라이언트와의 커넥션을 표현한다. 컨넥터 객체는 다양한 클라이언들로의 연결된 소켓에서 요청을 읽고, 응답을 기록하기 위한 톰캣 워커 스래드를 관리하는 역할을 한다. hanlder 클래스, TCP/IP 포트, TCP/IP backlog
  • Context - 각 Conntext는 톰캣의 디렉토리 패스를 나타내는데, 이 디렉토리는 웹 응용프로그램의 디렉토리를 의미한다. 컨텍스트가 존재하는 디렉토리 패스, 디버깅 레벨, 서블릿 리로딩 플래그
web.xml
  • 웹 응용프로그램을 위한 그래픽 아이콘 파일들
  • 응용프로그램에 관한 기술(기능, 작성자 등)
  • 응용프로그램이 분산 처리될 수 있는지 여부
  • 응용프로그램의 파라메터 정보
  • 등록된 서블릿 이름
  • 서블릿 로드 순서
  • URL 매핑 규칙
  • 세션 디폴트 타임 아웃 시간
  • 세션 구성
  • 서블릿/ JSP 정의
  • 서블릿/ JSP 매핑
  • MIME 타입 매핑
  • 에러 페이지
  • 인사말 파일 리스트
  • 보안

출처 : http://youall.textcube.com/206

2011/01/08 15:08 2011/01/08 15:08