TOMCAT - 윈디하나의 솔라나라

목차

개요

설치

  1. 자바 런타임 및 JDK

    $ 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)
    
    64비트 JDK 사용시 주의
    JDK가 64비트인 경우 아래에 설명할 Tomcat - Native library을 64비트로 빌드해야 한다. Native library를 64비트로 빌드하려면, 빌드에 필요한 라이브러리들도 모두 64비트로 빌드 되어있어야 한다. 만약 시스템에서 32비트 라이브러리를 사용한다면 차라리 JDK를 32비트로 변경해보자. 단 솔라리스용 JDK 8는 32비트를 제공하지 않기 때문에 JDK 7을 사용해야 한다. 32비트 JDK와 64비트 JDK의 차이점은 윈디하나의 솔라나라: Java 고급 (작성중)를 참조하자.
  2. 윈디하나의 솔라나라: OpenSSL을 참고해 OpenSSL 을 설치해놓자. OpenSSL 1.0.2 이상이 필요하다.

  3. Libiconv

    # 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"를 사용하자.
    ※ ICONV 는 APR을 설치하기 위해 필요하다. 그리고 APR은 톰캣 네이티브 라이브러리를 설치하기 위해서 필요하다. 결과적으로, 네이티브 라이브러리를 설치하지 않겠다면, ICONV를 설치할 필요 없다.
  4. Apache Portable Runtime

    # 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 install
    
    1) --enable-nonportable-atomics옵션은 이식 가능하지 않은 (운영체제에 특화된) Atomic operations 을 사용하라는 의미다. 사용하는 컴파일러에 따라 작동 방식이 다르다. GCC 4.1 이상에서는 __sync_val_compare_and_swap빌트인 함수를 사용하며, GCC를 사용하지 않는 솔라리스에서는 atomic_cas_ptr(3C)atomic_swap_ptr(3C)를 사용한다.
    2) APR 은 /usr/local 에 설치된다.
    3) 64비트로 컴파일 하려면 CFLAGS="-m64"를 사용하자.
    ※ APR은 톰캣 네이티브 라이브러리를 설치하기 위해서 필요하다. 네이티브 라이브러리를 설치하지 않는다면, APR을 설치할 필요 없다.
  5. Tomcat

    톰캣의 설치는 매우 간단하다. Tomcat 9 Software Downloads에서 바이너리 파일을 받아 적당한 디렉토리에 풀어주면 된다.
    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 를 사용해 톰캣을 실행할 수 있다. 하지만 아래에 소개된 몇가지 추가 설치를 고려해보자.
  6. Tomcat - Connectors

    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
    
    커넥터 설정은 다음 챕터를 참고하자.
  7. Tomcat - Native library

    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에 설치한다.
    2) 설치한 후, 톰캣을 시작하면 자동으로 네이티브 라이브러리를 로드한다. $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이 추가되어있는지 확인해본다.
  8. Tomcat - Commons Daemon(jsvc)

    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으로 표기하지 않는다.

설정

  1. 톰캣 환경변수 설정

    Tomcat실행시 JVM전달해야할 환경 변수는 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를 읽어보자.
  2. 톰캣 사용자 설정

    톰캣 관리자 및 호스트 관리자, 서버 상태 페이지에 접속하기 위해, 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 이다. 톰캣에서 흔한 패스워드이므로 반드시 다른 것으로 바꿔 사용하자.

    접근 IP 확인
    톰캣 매니저는 기본적으로 localhost에서만 접속할 수 있다. 외부에서 접속하면 tomcat-users.xml에 사용자를 넣었는데도 사용자를 추가하라는 화면이 나온다. localhost이외의 곳에서 접속하려면 webapps/manager/META-INF/context.xml, webapps/host-manager/META-INF/context.xml에서 org.apache.catalina.valves.RemoteAddrValveallow부분을 수정해야 한다.
  3. URI에서 UTF-8 설정

    HTTP GET 메소드에서, UTF-8로 인코딩된 URI를 깨짐 없이 받기 위해 server.xmlConnector태그에 아래와 같이 추가한다. 주로 웹 페이지에서 한글로된 문자열을 파라메터로 받았을때, 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" />
    
    POST 방식에서의 UTF-8 입력
    HTTP POST 방식에서 UTF-8 캐릭터 깨짐 현상은 운영체제의 로케일과 톰캣 컨텍스트의 로케일(인코딩)이 다르기 때문에 발생하기 때문에, OS의 로케일을 UTF-8으로 변경해야 한다. OS의 로케일을 변경할 수 없는 경우 어플리케이션의 서블릿 컨트롤러 인코딩을 바꿔 문제를 피할 수 있다. 톰캣에서는 아래와 같이 할 수 있다.
    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() 으로 인코딩해서 전달하는 것도 좋은 방법이다.
  4. POST 설정

    POST 방식으로 데이터를 받을 때 크기제한이 있다. 이는 conf/server.xml<Connector>의 속성을 수정해 설정을 변경할 수 있다. -1로 정하면 제한을 두지 않는다.
    	<Connector maxPostSize="52428800"  >
    
  5. 톰캣 매니저 업로드 설정

    웹 어플리케이션 배포를 위해 Tomcat manager를 사용하는 경우, 큰 용량의 .war 파일을 업로드 하기 위해 파일 크기 제한을 충분히 크게 해 놓는다. (기본값 50MiB)
    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>
    ...
    
  6. 톰캣 커넥터(mod_jk)를 사용해 아파치 웹 서버와 연동

    Tomcat - Connectors 를 설치했다면 아파치 웹서버에 아래와 같은 작업이 필요하다.
    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) 보기와 같이 주석 표시(#)를 지운다.
    2) 보기와 같이 수정한다.
    3) 보기와 같이 추가한다.
    JK Status Manager는 http://localhost/jkmanager에서 아래와 비슷한 화면을 볼 수 있다.
    JK Status Manager
    mod_jk에 대한 더 자세한 설명은 The Apache Tomcat Connectors / mod_jk를 참고하자. 윈디하나의 솔라나라: Tomcat Advanced (작성중)

실행

샘플 프로그램

psi-probe

마치며

RSS ATOM XHTML 5 CSS3