text: (window.webpackJsonp=window.webpackJsonp||[]).push([[149],{767:function(a,t,s){"use strict";s.r(t);var e=s(5),r=Object(e.a)({},(function(){var a=this,t=a.$createElement,s=a._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"_3-tomcat-설치"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-tomcat-설치"}},[a._v("#")]),a._v(" 3. Tomcat 설치")]),a._v(" "),s("ul",[s("li",[a._v("설치파일 받기")]),a._v(" "),s("li",[a._v("윈도우에 설치하기")]),a._v(" "),s("li",[a._v("유닉스/리눅스에 설치하기")]),a._v(" "),s("li",[a._v("설치 후 작업")]),a._v(" "),s("li",[a._v("디렉토리 구조")])]),a._v(" "),s("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/621YGq7ulS4",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}}),a._v(" "),s("hr"),a._v(" "),s("p",[a._v("설치되는 톰캣의 최상위 경로는 "),s("code",[a._v("$CATALINA_HOME")]),a._v(" 으로 표현합니다.")]),a._v(" "),s("h2",{attrs:{id:"_3-1-설치파일-받기"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-1-설치파일-받기"}},[a._v("#")]),a._v(" 3.1 설치파일 받기")]),a._v(" "),s("p",[a._v("설치파일은 "),s("a",{attrs:{href:"https://tomcat.apache.org/whichversion.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("톰캣 홈페이지"),s("OutboundLink")],1),a._v("에서 좌측의 "),s("code",[a._v("Downloads")]),a._v("에서 설치하고자 하는 버전을 선택하면 우측에 Binary와 Source Code 두가지 형태로 받을 수 있습니다. Binary는 OS플랫폼에 맞게 미리 준비된 설치파일로서 Core에 해당하는 파일을 받습니다. 종류는 여섯가지로 나뉘어 있습니다.")]),a._v(" "),s("ul",[s("li",[a._v("zip")]),a._v(" "),s("li",[a._v("tar.gz")]),a._v(" "),s("li",[a._v("32-bit Windows zip")]),a._v(" "),s("li",[a._v("64-bit Windows zip")]),a._v(" "),s("li",[a._v("64-bit Itanium Windows zip ("),s("a",{attrs:{href:"https://tomcat.apache.org/tomcat-8.5-doc/changelog.html",target:"_blank",rel:"noopener noreferrer"}},[a._v("8.5.0부터 제외"),s("OutboundLink")],1),a._v(")")]),a._v(" "),s("li",[a._v("32-bit/64-bit Windows Service Installer")])]),a._v(" "),s("p",[a._v("zip과 tar.gz는 Unix/Linux환경에서 사용할 압축된 형태의 파일이고 나머지 네가지는 CPU 아키텍쳐에 맞게 컴파일된 zip 형태의 압축 파일과 서비스에 등록할수 있는 형태의 인스톨러로 구성되어 있습니다. 설치하고자 하는 OS와 CPU 아키텍처에 맞는 설치파일을 받아 준비합니다.")]),a._v(" "),s("h2",{attrs:{id:"_3-2-윈도우에-설치하기"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-2-윈도우에-설치하기"}},[a._v("#")]),a._v(" 3.2 윈도우에 설치하기")]),a._v(" "),s("p",[a._v("Windows에는 압축파일을 풀어 설치하는 방법과 서비스 등록을 위한 인스톨러 두가지 방식이 있었습니다. 압축파일 형태의 경우 압축을 풀기만하면 바로 실행이 가능합니다. 서비스 인스톨러의 경우 서비스에 등록하기 위한 설치 경로와 같은 정보를 입력하여 진행합니다.")]),a._v(" "),s("p",[a._v("압축파일로 설치한 경우 "),s("code",[a._v("%CATALINA_HOME%\\bin")]),a._v("에 위치한 "),s("code",[a._v("startup.bat")]),a._v("으로 시작하고 "),s("code",[a._v("shutdown.bat")]),a._v("으로 종료합니다.")]),a._v(" "),s("p",[a._v("서비스로 설치한 경우 윈도우 서비스 관리 유틸리티에서 서비스의 '시작/종료'를 사용하거나 "),s("code",[a._v("net start (서비스이름)")]),a._v(" 또는 "),s("code",[a._v("net stop (서비스이름)")]),a._v("을 사용하여 서비스의 시작과 종료가 가능합니다.")]),a._v(" "),s("h2",{attrs:{id:"_3-3-유닉스-리눅스-맥-에-설치하기"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-3-유닉스-리눅스-맥-에-설치하기"}},[a._v("#")]),a._v(" 3.3 유닉스/리눅스/맥 에 설치하기")]),a._v(" "),s("p",[a._v("Unix/Linux의 binary 설치파일은 압축을 풀어 설치합니다.")]),a._v(" "),s("p",[s("code",[a._v("$CATALINA_HOME/bin")]),a._v("에 위치한 "),s("code",[a._v("startup.sh")]),a._v("으로 시작하고 "),s("code",[a._v("shutdown.sh")]),a._v("으로 종료합니다.")]),a._v(" "),s("h2",{attrs:{id:"_3-4-설치-후-작업"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-설치-후-작업"}},[a._v("#")]),a._v(" 3.4 설치 후 작업")]),a._v(" "),s("p",[a._v("설치 방법은 매우 간단하나 설치 후 꼭 해야할 작업이 있습니다. Java Home을 설정하고 성능을 위한 Native library를 설치하는 작업 입니다.")]),a._v(" "),s("p",[a._v("Java Home의 경우 앞서 JDK를 OS에 설치하였다면 톰캣에서 이를 사용할 수 있도록 경로를 잡아주는 과정입니다. OS자체의 PATH나 환경변수로 지정하는 방법도 있고 톰캣의 스크립트에 변수로 넣어주는 방법이 있습니다. OS자체의 PATH로 설정하는 경우 해당 OS에 설치된 모든 Java 실행환경이 영향을 받게 됩니다. 따라서 일관된 서비스, 일관된 톰캣 운영 환경인 경우 같은 Java Home이 설정되는 장점이 있습니다. 이와달리 스크립트에 Java Home을 설정하면 해당 톰캣에서만 관련 설정의 영향을 받습니다. OS내에 서로 다른 JDK로 동작하는 서비스나 어플리케이션이 있다면 스크립트를 이용하는 방법을 사용할 수 있습니다.")]),a._v(" "),s("h3",{attrs:{id:"_3-4-1-java-home-설정하기"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-1-java-home-설정하기"}},[a._v("#")]),a._v(" 3.4.1 Java Home 설정하기")]),a._v(" "),s("p",[a._v("OS 환경에 Java Home을 설정하는 방법은 다음과 같습니다. (Java Home은 JDK의 bin 디렉토리를 포함한 상위 디렉토리 입니다.)")]),a._v(" "),s("h4",{attrs:{id:"_3-4-1-1-환경변수로-지정"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-1-1-환경변수로-지정"}},[a._v("#")]),a._v(" 3.4.1.1 환경변수로 지정")]),a._v(" "),s("Tabs",{attrs:{type:"border-card"}},[s("Tab",{attrs:{label:"Unix/Linux/OSX"}},[s("p",[a._v("계정 루트의 "),s("code",[a._v(".profile")]),a._v(" (bash 쉘의 경우 "),s("code",[a._v(".bash_profile")]),a._v(")에 다음을 설정")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# .bash_profile")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("JAVA_HOME")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/usr/java/jre1.8.0_241\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br")])])]),a._v(" "),s("Tab",{attrs:{label:"Windows"}},[s("p",[a._v("내컴퓨터 우클릭 > 고급 > 환경변수 > JAVA_HOME 추가")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://github.com/Great-Stone/great-stone.github.io/blob/master/assets/img/Tomcat_youtube/JavaHomeOnWindows.png?raw=true",alt:"JavaHomeOnWindows"}})])])],1),a._v(" "),s("h4",{attrs:{id:"_3-4-1-2-스크립트에-추가"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-1-2-스크립트에-추가"}},[a._v("#")]),a._v(" 3.4.1.2 스크립트에 추가")]),a._v(" "),s("p",[a._v("스크립트에 Java_Home을 설정하는 경우 "),s("code",[a._v("catalina.sh(bat)")]),a._v("에 "),s("code",[a._v("JAVA_HOME")]),a._v(" 으로 지정하는 경우가 있습니다. 추가로 "),s("code",[a._v("setenv.sh(bat)")]),a._v("을 생성하여 해당 스크립트에 설정하는 방법을 권장합니다.")]),a._v(" "),s("Tabs",{attrs:{type:"border-card"}},[s("Tab",{attrs:{label:"Unix/Linux/OSX"}},[s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# setenv.sh")]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("JAVA_HOME")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"/usr/java/jre1.8.0_241"')]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br")])])]),a._v(" "),s("Tab",{attrs:{label:"Windows"}},[s("div",{staticClass:"language-powershell line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-powershell"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# setenv.bat")]),a._v("\nJAVA_HOME=C:\\Progra~1\\java\\jre1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("8"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("0_241\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br")])])])],1),a._v(" "),s("p",[a._v("Windows환경에서 Java를 "),s("code",[a._v("C:\\Program Files")]),a._v("에 설치하는 경우 중간에 공백이 있기 때문에 "),s("code",[a._v("C:\\Progra~1")]),a._v("로 표현함에 주의합니다.")]),a._v(" "),s("h4",{attrs:{id:"_3-4-2-native-library-적용하기-옵션"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#_3-4-2-native-library-적용하기-옵션"}},[a._v("#")]),a._v(" 3.4.2 Native Library 적용하기 (옵션)")]),a._v(" "),s("p",[a._v("톰캣의 Native Library를 적용하지 않고도 충분히 톰캣을 실행하고 사용할 수 있습니다. 다만 톰캣의 콘솔 로그에 다음의 메시지가 걸리적(?)거리게 발생합니다.")]),a._v(" "),s("div",{staticClass:"language-log line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-log"}},[s("code",[a._v("The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the "),s("span",{pre:!0,attrs:{class:"token domain constant"}},[a._v("java.library.path")]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br")])]),s("p",[a._v("굳이 필요하지 않다면 적용하지 않아도 되지만 Native Library가 주는 이점은 다음과 같습니다.")]),a._v(" "),s("ul",[s("li",[a._v("Non-blocking I/O for Keep-Alive requests (between requests)")]),a._v(" "),s("li",[a._v("Uses OpenSSL for TLS/SSL capabilities (if supported by linked APR library)")]),a._v(" "),s("li",[a._v("FIPS 140-2 support for TLS/SSL (if supported by linked OpenSSL library)")])]),a._v(" "),s("p",[a._v("결국 NIO(Non-Blocking I/O)를 지원하는 것과 SSL관련 설정을 지원합니다. OpenSSL을 사용하지 않아도 NIO를 사용하는 성능상의 이점을 제공합니다.")]),a._v(" "),s("p",[a._v("Native Library를 사용하기 위해서는 APR과 Tomcat Native 소스 파일이 필요합니다. APR은 Apache 2.0 이상 버전이 설치되어있다면 해당 설치 경로의 "),s("code",[a._v("$APACHE_HOME/bin/apr-1-config")]),a._v("과 같이 존재하나 없는 경우 별도의 APR을 설치합니다.")]),a._v(" "),s("p",[a._v("(Apache APR 홈페이지 : http://apr.apache.org/)")]),a._v(" "),s("p",[a._v("APR 홈페이지에서 받은 apr-x.x.x.tar.gz 파일은 다음의 순서를 따라 설치를 진행하며, 예제와 같이 "),s("code",[a._v("/usr/local")]),a._v("에 설치하는 경우 root 계정이 필요합니다.")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("gzip")]),a._v(" -d apr-1.5.1.tar.gz\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf apr-1.5.1.tar\n$ configure --prefix"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/usr/local/apr-1.5.1\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("make")]),a._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("make")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br"),s("span",{staticClass:"line-number"},[a._v("3")]),s("br"),s("span",{staticClass:"line-number"},[a._v("4")]),s("br"),s("span",{staticClass:"line-number"},[a._v("5")]),s("br")])]),s("p",[a._v('일반적인 경우 Tomcat이 설치되면 설치된 경로의 "$CATALINA_HOME/bin" 위치에 tomcat-native.tar.gz 형태로 설치 파일이 존재하나 없는 경우, 혹은 높은 버전을 설치하고 싶은 경우 별도로 다운로드 받아 진행합니다. Native의 다운로드는 톰켓 홈페이지의 좌측 '),s("code",[a._v("Downloads")]),a._v("의 하위에 "),s("a",{attrs:{href:"http://tomcat.apache.org/download-native.cgi",target:"_blank",rel:"noopener noreferrer"}},[a._v("Tomcat Native"),s("OutboundLink")],1),a._v("로 존재합니다. 관련 링크를 클릭하면 우측에 OS플랫폼에 맞게 소스를 받을 수 있는 링크가 제공됩니다.")]),a._v(" "),s("p",[a._v("Native Library는 다음과 같이 설치를 진행합니다.")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[a._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("gzip")]),a._v(" -d tomcat-native.tar.gz\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("tar")]),a._v(" -xvf tomcat-native.tar\n$ configure --prefix"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CATALINA_HOME")]),a._v(" --with-apr"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),a._v("/usr/local/apr-1.5.1/bin/apr-1-config  --with-java-home"),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$JAVA_HOME")]),a._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("make")]),a._v("\n$ "),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("install")]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br"),s("span",{staticClass:"line-number"},[a._v("3")]),s("br"),s("span",{staticClass:"line-number"},[a._v("4")]),s("br"),s("span",{staticClass:"line-number"},[a._v("5")]),s("br")])]),s("p",[a._v('소스의 컴파일과 설치가 완료되면 "$CATALINA_HOME/lib"에서 libtcnative 관련 파일의 확인을 할 수 있습니다.')]),a._v(" "),s("p",[a._v("Native Library가 해당 플랫폼 환경에 맞게 생성되었다면 Shared Library로 설정하여 적용하며 적용방법은 앞서 Java Home을 설정하는 방법을 이용합니다. Shared Library 환경변수명은 OS마다 상이함에 주의하며 setenv.sh(bat)에 적용하는 방법은 다음과 같습니다.")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# setenv.sh(bat)")]),a._v("\nLD_LIBRARY_PATH "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CATALINA_HOME")]),a._v('/lib"')]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br")])]),s("table",[s("thead",[s("tr",[s("th",[a._v("OS")]),a._v(" "),s("th",[a._v("Shared Library Path")])])]),a._v(" "),s("tbody",[s("tr",[s("td",[a._v("Windows")]),a._v(" "),s("td",[a._v("PATH")])]),a._v(" "),s("tr",[s("td",[a._v("Solaris")]),a._v(" "),s("td",[a._v("LD_LIBRARY_PATH")])]),a._v(" "),s("tr",[s("td",[a._v("HP-UX")]),a._v(" "),s("td",[a._v("SHLIB_PATH")])]),a._v(" "),s("tr",[s("td",[a._v("AIX")]),a._v(" "),s("td",[a._v("LIBPATH,LD_LIBRARY_PATH")])]),a._v(" "),s("tr",[s("td",[a._v("Linux")]),a._v(" "),s("td",[a._v("LD_LIBRARY_PATH")])]),a._v(" "),s("tr",[s("td",[a._v("OS/2")]),a._v(" "),s("td",[a._v("LIBPATH")])]),a._v(" "),s("tr",[s("td",[a._v("OSX")]),a._v(" "),s("td",[a._v("LD_LIBRARY_PATH")])])])]),a._v(" "),s("p",[a._v('적용된 Native Library는 톰캣의 콘솔 로그 "$CATALINA_HOME/logs/catalina.out(log)"에서 다음의 메시지를 확인 할 수 있습니다.')]),a._v(" "),s("div",{staticClass:"language-log line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-log"}},[s("code",[s("span",{pre:!0,attrs:{class:"token property"}},[a._v("Info:")]),a._v(" Loaded APR based Apache Tomcat Native library "),s("span",{pre:!0,attrs:{class:"token number"}},[a._v("1.1.31")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(".")]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br")])])],1)}),[],!1,null,null,null);t.default=r.exports}}]);