프로그램 활용/웹서버

[CentOS 7] Tomcat 서버

3604 2023. 10. 24. 01:31
728x90

출처: https://sepiros.tistory.com/23

  • Apache Tomcat 서버는 Apache 서버처럼 웹 서버로서 작동할 수 있지만, 특별히 자바 서블릿(Servlet)과 JSP(Java Server Pages)어플리케이션을 제공하기 위해 Apache 재단에서 개발한 오픈소스 웹 어플리케이션 서버(WAS)다. Tomcat서버는 초기에 선마이크로시스템에서 개발한 Java Web Server와 Apahce 재단에서 개발한 JServ가 결합돼 탄생한 프로젝트로서 2001년 Apache 재단에서 새로운 아키텍처와 코드를 적용해 버전 4.0이 배포됐다.

     Tomcat 서버는 Apache와 같은 웹 서버와 연동해 JSP와 자바 서블릿이 실행할 수 있는 환경을 제공함으로써 웹사이트에서 자바 프로그램을 쉽게 사용할 수 있도록 도와준다. Tomcat 서버는 브라우저상에서 GUI 관리용 프로그램을 통해 설정을 변경할 수도 있고 XML로 된 설정 파일을 직접 수정할 수도 있다. 참고로, Tomcat은 사전적 의미로 '숫고양이'를 의미하고, 설치 후 초기 화면 로고에서 볼 수 있다. 

     Tomcat 서버와 Apache 서버를 연동해 웹 시스템을 안정적으로 구성할 경우 두 서버간에 연동 모듈이 필요한데, Apache 2.2 이후 버전에서는 기본적으로 제공되는 모듈 mod_proxy_ajp와 별도로 설치하는 mod_jk를 사용할 수 있다. 

     

     

     

    1. Tomcat 서버의 이해


     

    1.1 Tomcat 서버의 역할

     Tomcat 서버는 WAS(Web Application Server) 라고 했는데, 기본적으로 Apache 서버는 포트 20번을 통해 서비스를 제공하고, Tomcat 서버는 포트 8080번을 통해 서비스를 제공한다. HTTP 클라이언트는 Apache 웹 서버를 통해 HTTP 연결을 시도하고, html과 같은 정적인 콘텐츠를 요청할 경우 Apache 서버가 직접 그 요청에 응답한다. 그런데 클라이언트가 자바 서블릿이나 JSP파일 같은 동적 콘텐츠를 요청할 경우 Apache 서버가 Tomcat 서버에게 요청을 전달한다. 이 요청은 Apache 서버가 제공하는 모듈 mod_jk나 mod_proxy를 통해 Tomcat 서버와의 연동을 통해 이뤄진다. 이를 위해 Apache 서버는 프로토콜 AJP(Apache Jserv Protocol)와 Tomcat 서버 포트 8009번을 사용한다. Tomcat 서버는 Apache 서버가 요청한 서블릿이나 JSP 같은 자바 애플리케이션을 해석해서 다시 Apache 서버에 되돌려주고, Apache 서버는 이 데이터를 다시 클라이언트에 제공하게 된다. Apache 서버는 Tomcat 서버와의 연동을 위해 두 가지 모듈을 제공하는데, 이 모듈은 서비스 제공을 위해 각각의 설정 파일을 생성해야 한다.

     

    1.2 Tomcat 서버의 구성 요소와 디렉토리

     

     

    A. 구성요소

    1. Server

    Tomcat 서버를 일반적으로 서블릿 컨테이너(Servlet Container)라고 하는데, 이는 클라이언트로부터 자바 애플리케이션 요청을 받으면 자바 서블릿을 실행하고 JSP나 JSF를 서블릿으로 변환한 다음에 그 결과를 사용자의 브라우저로 전달하는 역할을 수행한다. 또한 Apache나 Nginx 같은 웹 서버와의 연동을 위해 Connector를 제공한다. 이러한 컨테이너 서버로서 Apache Tomcat, Jetty, Weblogic, Jeus, JBoss 등이 사용된다. Tomcat 서버의 설정 파일 server.xml에서 Server 는 다른 구성 요소의 최상위에 위치하며, 클라이언트에게 서비스를 제공하는 Tomcat 서버의 인스턴스 역학을 한다. Server는 아래에서 설명할 하나 또는 여러 개의 Service로 구성되며, 이 Service는 각각 Engine과 Connector를 포함하고 있다.

     

    2. Service

    Service는 하나의 Container를 공유해서 사용하는 하나 또는 그 이상의 Connector들의 집합이다. Server는 기본 이름으로 Catalina가 사용되며, 각 Service는 하나 이상의 Connecotr와 Egine으로 구성된다. 하나의 Server에서 여러 Service를 사용할 경우 이름을 각기 다르게 지정해서 사용해야 한다.

     

    3. Connector

    Connector는 웹 서버와의 연동을 위해 사용되는 최종 연결 지점으로, 웹 서버로부터의 요청이 도착하고 다시 그 요청을 보내기 위해 사용한다. 현재 지원하는 Connector로서 일반적인 HTTP를 처리하는 포트 8080, HTTP에 SSL이 적용된 포트 8443번, 그리고 AJP 프로토콜이 사용하는 포트 8009번이 사용된다. 

     

    4. Engine

    Engine은 서블릿 컨테이너의 인스턴스 이름을 지정하는데, 이는 웹 서버와의 연동을 위해 사용되는 Connector로부터 받은 요청을 실제 처리하는 역학을 수행한다. 기본 이름은 Catalina이며 그 이름으로 로그 디렉토리에 로그 파일이 생성된다. Engine은 HTTP 요청 헤더에서 호스트 이름 또는 IP 주소를 분석해 그 요청에 알맞은 가상 호스트에게 전달되는데, 기본으로 localhost가 사용된다. Engine은 기본적으로 여러 개의 호스트를 포함할 수 있다.

     

    5. Host

    Engine에서 설정한 가상 호스트 이름을 정의하는데, 이 가상 호스트 내에 여러 Context(즉,webappls)가 저장되는 기본 디렉토리를 지정한다. Engine은 여기서 지정된 가상 호스트 이름에 따라 그 요청을 전달하게 된다.

     

    6. Context

    각 가상 호스트마다 실제 사용자 및 관리자가 사용하는 애플리케이션 데이터로서 Tomcat 패키지를 설치하면 wedbapps 디렉토리 내에 기본적으로 5가지, 즉 docs, examples, host-manager, manager, sample, 그리고 추가로 ROOT가 제공된다. 이러한 디렉토리 이름은 URL에서 접근할 수 있는 디렉토리 이름과 동일하다. 예를 들어 manager인 경우 http://localhost:8080/manager/html과 같이 사용된다.

     

    B. Tomcat 디렉토리

    tomcat  패키지를 설치하면 tomcat 서버가 사용하는 디렉토리는 /usr/share/tomcat인데, 이 디렉토리에 설치되는 하위 디렉토리는 다음과 같다.

    - bin : tomcat 서버의 시작과 종료를 제어할 수 있는 스크립트 및 실행 파일이 저장돼 있다.

    - conf : tomcat 서버의 기본적인 설정 파일들일 포함돼 있는데, 이 디렉토리는 /etc/tomcat과 링크로 연결돼 있다. 이 중 server.xml 파일이 직접적으로 tomcat 서버를 제어하기 위해 사용된다.

    - lib : 모든 webapp에 적용되는 JAR 파일이 저장돼 있으며, /usr/share/java/tomcat과 링크로 연결돼 있다.

    - webapps : tomcat이 기본적으로 클라이언트에게 제공하는 웹 어플리케이션이 저장된 공간으로서 /var/lib/tomcat/webapps와 링크로 연결돼 있다.

    - logs : tomcat 서버의 로그 파일이 저장되는 디렉토리로서 /var/log/tomcat과 링크로 연결돼 있다.

    - work : 호스트별로 JSP 파일을 컴파일한 서블릿 소스 파일이 사용되는 임시 디렉토리로서 디렉토리 내부는 엔진 이름(Catalina)과 호스트 이름, 그리고 webapp 이름이 계층적으로 구성돼 있다. 이 디렉토리는 /var/cache/tomcat/work와 링크로 연결돼 있다.

    temp : tomcat engine이 실행 시 생성되는 데이터를 임시로 저장하는 공간이다.

     

     

     

     

    2. Tomcat 서버 시작


     

    2.1 Tomcat 서버 설치와 서비스 시작

     

    A. 패키지 설치

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    1. Tomcat 서버를 설치하기 전에 현재 바 패키지가 설치됐는지 확인
    [root@nddex localhost]# java -version
    java version "1.7.0_171"
    OpenJDK Runtime Environment (rhel-2.6.13.0.el7_4-x86_64 u171-b01)
    OpenJDK 64-Bit Server VM (build 24.171-b01, mixed mode)
     
    2. 자바가 설치되지 않았다면 yum으로 설치 진행
    [root@nddex localhost]# yum install java -y
     
    3. yum을 이용해 tomcat 서버를 설치
    [root@nddex localhost]# yum install tomcat -y
     
    4. rpm을 사용해 설치된 패키지 확인한다.
    [root@nddex localhost]# rpm -qa | grep tomcat
    tomcat-lib-7.0.76-3.el7_4.noarch
    tomcat-servlet-3.0-api-7.0.76-3.el7_4.noarch
    tomcat-el-2.2-api-7.0.76-3.el7_4.noarch
    tomcat-7.0.76-3.el7_4.noarch
    tomcat-webapps-7.0.76-3.el7_4.noarch
    tomcat-admin-webapps-7.0.76-3.el7_4.noarch
    tomcat-jsp-2.2-api-7.0.76-3.el7_4.noarch
    cs

     

    B. 서비스 시작

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    1. tomcat 시작
    [root@nddex localhost]# systemctl start tomcat
     
    2. 부팅 시에도 항상 자동으로 시작하게 설정
    [root@nddex localhost]# systemctl enable tomcat
     
    3. tomcat 서버를 시작한 후에 상태를 확인 
    [root@nddex localhost]# systemctl status tomcat
    ● tomcat.service - Apache Tomcat Web Application Container
       Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
       Active: active (running) since 수 2018-04-11 11:25:37 KST; 10s ago
     Main PID: 10854 (java)
       CGroup: /system.slice/tomcat.service
               └─10854 java -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/shar...
     4월 11 11:25:40 nddex.soribada.com server[10854]: 4월 112018 11:25:40 오전 org.apache.catalina.startup.TldConf…xecute
     4월 11 11:25:40 nddex.soribada.com server[10854]: 정보: At least one JAR was scanned for TLDs yet contained no T… time.
     4월 11 11:25:40 nddex.soribada.com server[10854]: 4월 112018 11:25:40 오전 org.apache.catalina.startup.HostCon…ectory
     4월 11 11:25:40 nddex.soribada.com server[10854]: 정보: Deployment of web application directory /var/lib/tomcat/…271 ms
     4월 11 11:25:41 nddex.soribada.com server[10854]: 4월 112018 11:25:40 오전 org.apache.coyote.AbstractProtocol start
     4월 11 11:25:41 nddex.soribada.com server[10854]: 정보: Starting ProtocolHandler ["http-bio-8080"]
     4월 11 11:25:41 nddex.soribada.com server[10854]: 4월 112018 11:25:41 오전 org.apache.coyote.AbstractProtocol start
     4월 11 11:25:41 nddex.soribada.com server[10854]: 정보: Starting ProtocolHandler ["ajp-bio-8009"]
     4월 11 11:25:41 nddex.soribada.com server[10854]: 4월 112018 11:25:41 오전 org.apache.catalina.startup.Catalina start
     4월 11 11:25:41 nddex.soribada.com server[10854]: 정보: Server startup in 2562 ms
     
    4. 8080포트를 확인하고 사용자, 명령어, 서비스를 확인할 수 있다. 
    [root@nddex localhost]# lsof -i tcp:8080
    COMMAND   PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    java    10854 tomcat   47u  IPv6 1362757      0t0  TCP *:webcache (LISTEN)
     
    5. ps를 사용해 tomcat 서버의 프로세스를 확인
    [root@nddex localhost]# ps -ef | grep tomcat
    ysseo    10273     1  1 10:52 ?        00:00:24 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/was/adm/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dconfig.path=/com/soribada/ddex/properties/config.xml -Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dconfig.classpath=classpath* -Xms2048m -Xmx3072m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -Dlog4j.path=/var/www/ddex/log/ -Dscheduler=1 -Dspring.config.path= -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat7/endorsed -classpath /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/was/adm -Dcatalina.home=/usr/local/tomcat7 -Djava.io.tmpdir=/usr/local/was/adm/temp org.apache.catalina.startup.Bootstrap start
    tomcat   10854     1 38 11:25 ?        00:00:09 java -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
    root     10943 20322  0 11:26 pts/0    00:00:00 grep --color=auto tomcat
     
    6. tomcat 버전 정보 
    [root@nddex localhost]# tomcat version
    Server version: Apache Tomcat/7.0.76
    Server built:   Oct 30 2017 10:21:55 UTC
    Server number:  7.0.76.0
    OS Name:        Linux
    OS Version:     3.10.0-693.17.1.el7.x86_64
    Architecture:   amd64
    JVM Version:    1.7.0_171-mockbuild_2018_02_27_14_27-b00
    JVM Vendor:     Oracle Corporation
    cs

     

     

    2.2 Tomcat 서버를 위한 방화벽 설정

     Iptables 방화벽이나 firewalld 방화벽을 이용해 Tomcat 서버를 허용하기 위한 설정은 다음과 같다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    1.  iptables 방화벽에 tomcat 서버가 사용하는 포트 8080번으로 접속을 허용한다.
    [root@nddex ~]# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
     
    2. firewalld 방화벽을 이용해 tomcat 서버의 포트 8080번의 접근을 허용한다.
    [root@nddex ~]# firewall-cmd --add-port=8080/tcp --permanent
    success
     
    3. 변경 사항이 적용되도록 firewalld 데몬을 다시 시작한다.
    [root@nddex ~]# firewall-cmd --reload
    success
     
    4. 적용 사항 확인을 위해 포트 목록을 확인
    [root@nddex ~]# firewall-cmd --list-ports
    /tcp 8080
     
    5. iptables에서 웹 서버 포트 80번으로 들어오는 클라이언트 요청을 tomcat 서버가 사용중인 8080번으로 포워딩을 할 경우 
    [root@nddex ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
    [root@nddex ~]# iptables -t nat -A PREROUTING -p udp -m udp --dport 80 -j REDIRECT --to-ports 8080
    cs

     

     

     

     

    3. Tomcat 서버 설정


     

    3.1 Tomcat 서버 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    1. Tomcat 서버에 루트 페이지를 제공하며, tomcat-admin-webapps는 웹 어플리케이션 매니저와 가상 호스트 매니저로 
    사용하기 위해 설치한다. 이 패키지를 설치하지 않아도 tomcat 서버로 접속이 가능하다.
    [root@nddex ~]# yum install tomcat-webapps tomcat-admin-webapps
     
    2. rpm을 이용해 패키지 및 설치 버전 정보를 확인하다.
    [root@nddex ~]# rpm -qa | grep tomcat-webapp
    tomcat-webapps-7.0.76-3.el7_4.noarch
    [root@nddex ~]# rpm -qa | grep tomcat-admin
    tomcat-admin-webapps-7.0.76-3.el7_4.noarch
     
    3. 이 파일은 앞서 설치한 매니저용 웹 애플리케이션을 사용하기 위해 인증 정보를 설정해주기 위해 사용한다.
    관리용 인터페이스를 제공하는 manager-gui에 접속할 수 있는 사용자의 이름과 패스워드를 설정한다.
    [root@nddex ~]# vim /usr/share/tomcat/conf/tomcat-users.xml
     <role rolename="manager-gui"/>
     <user name="admin" password="adminpassword" roles="manager-gui" />
     
    4. 설정이 적용되도록 tomcat 서버를 다시 시작한다.
    [root@nddex ~]# systemctl restart tomcat
    cs

     

    3.2 클라이언트에서 연결 테스트

     

    a. http://IP주소:8080

    Tomcat 서버가 사용하는 IP 주소와 포트 8080번을 사용해 브라우저에서 접속을 시도하면 다음과 같은 화면을 만날 수 있다.

     

    b. http://IP주소:8080/manager/

     설정한 인증 정보를 사용해 접속을 시도하는데, 인증 정보를 요구하는 새로충 창을 볼 수 있다. 인증에 성공하면 관리자의 페이지에 접속할 수 있다. 이 웹 어플리케이션 매니저 페이지에서 관리자는 모든 자바 어플리케이션을 관리할 수 있다.

     

    c. http://ip주소:8080/host-manager/

    매니저로 접속이 성공하면 다시 호스트 정보를 보기 위해 호스트 매니저로 접속을 시도한다. 이 페이지에서 가상 호스트를 관리할 수 있다.

     

    3.3 JSP 파일

     

    a. 서버에서 설정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    1. vim으로 확장자 jsp를 가진 index2.jsp 파일을 생성한다.
    [root@nddex ROOT]# pwd
    /usr/share/tomcat/webapps/ROOT
    [root@nddex ROOT]# vim index2.jsp
    <html>
    <head>
    <title> Jaehwan Jeong Tomcat Server </title>
    </head> <body>
    <dev style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
    <START OF JAVA CODES>
    <%
    # 여기에 기록된 내용이 접속 시에 보여줄 메시지다.
            out.println("Hello World!");
            out.println("<BR>This is a first JSP App");
    %>
    <END OF JAVA CODES>
    </div></body></html>
     
    2. 설정 적용을 위해 tomcat을 재시작 
    [root@nddex ROOT]# systemctl restart tomcat
    cs

     

    b. 브라우저에서 확인

     브라우저에서 이 파일로 접속해 그 내용을 확인해본다. 

     

     

     

    4. 가상 호스트 사용


     

    4.1 설정 파일 편집

    가상 호스트 설정을 위해 주 도메인과 추가 도메인을 사용한다. DNS 서버에서 두 도메인에 대한 설정을 완료했다는 전제하에 진행한다.

     

    a. 설정 파일 편집

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    1. 주 도메인을 명령어 host로 검색하면 현재 IP를 알 수 있다.
    [root@master ~]# host -v www.chul.com
    www.chul.com has address 192.168.80.5
     
    2. 추가 도메인도 명령어 host로 검색하면 동일 IP 주소를 사용하고 있음을 알 수 있다.
    [root@master ~]# host -v www.jeong.com
    www.jeong.com has address 192.168.80.5
     
    3. 가상 호스트 설정을 위해 Tomcat 서버의 설정 파일을 열어
    [root@master ~]# vim /usr/share/tomcat/conf/server.xml
    # 호스트 이름에 주 도메인 이름 정의
    <Host name="www.chul.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
        <Valve callssName="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
    # 로그 파일과 유형을 정의하는데, 이 로그 파일은 /var/log/tomcat에서 볼 수 있다.
               prefix="chul_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            <Context path="" docBase="/opt/tomcat7/webapps/ROOT"
    </Host>
    # 두 번째 도메인을 정의
    <Host name="www.jeong.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
        <Valve callssName="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
               prefix="jeong_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    # 도메인에서 제공할 데이터가 저장될 디렉토리 지정한다.
            <Context path="" docBase="/opt/tomcat7/webapps/myapp"
    </Host>
    cs

     

    b. 인덱스 파일 생성

    가상 호스트 jeong.com을 위한 테스트용 파일 및 디렉토리를 생성하고 Tomcat 서버를 다시 시작하면 가상 호스트를 브라우저에서 테스트할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    1. tomcat 서버 설정 파일에서 정의했던 디렉토리 생성
    [root@master~]# mkdir -p /opt/tomcat7/webapp/myapp;
    [root@master ~]# mkdir -p /opt/tomcat7/webapp/ROOT;
     
    2. index2.jsp 파일을 복사하기 위해 디렉토리 이동 후에 복사한다.
    [root@master ~]# cd /usr/share/tomcat/webapps/ROOT/
    [root@master ROOT]# cp index2.jsp /opt/tomcat7/webapp/myapp/index.jsp
     
    3. 복사한 파일을 열어서 내용을 변경한다.
    [root@nddex myapp]# vim index.jsp
    <html>
    <head>
    <title> Jaehwan Jeong Tomcat Server </title>
    </head> <body>
    <dev style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
    <START OF JAVA CODES>
    <%
            out.println("Hello World!");
            out.println("<BR>This is a first JSP App");
    %>
    <END OF JAVA CODES>
    </div>
    </body></html>
     
    4. 변경 사항들이 적용되도록 tomcat 서버를 시 시작한다.
    [root@master myapp]# systemctl restart tomcat
    cs

     

    4.2 브라우저에서 확인

    a. 주 도메인

    주 도메인으로 사용되는 www.chul.com와 포트 8080번, 첫 번째 JSP 파일 index2.jsp을 브라우저상에서 호출 하면 확인할 수 있다.

     

    b. 두 번째 도메인

    두 번째 도메인 www.jeong.com을 위와 동일하게 파일 index.jsp를 브라우저상에서 호출하면 확인할 수 있다.

     

    c. 가상 호스트 매니저에서 확인

    호스트 매니저로 접속하면 두 개의 가상 호스트가 추가된 것을 확인할 수 있다. 웹에서 직접 가상 호스트 설정도 가능하다.

     

     

     

     

    5. .Apache 서버와 Tomcat 서버 연동


     

    5.1 연동 목적과 모듈 종류

     

    a. 연동의 목적

    Apache 서버와 Tomcat 서버를 반드시 연동해서 사용할 필요는 없다. 그러나 이 두 가지 서버를 연동하는 목적은 간단히 설명한다.

     

     - 목적의 차이 : Tomcat 서버는 자바 기반의 애플리케이션을 지원하는 서블릿 컨테이너로서, 그리고 Apache 웹 서버는 image나 css 파일 등과 같은 정적 데이터뿐 아니라 PHP파일을 처리하는 웹 서버로서 기능에 초점을 맞출 경우 연동이 필요한다.

     

    - 기능의 다양성 : Tomcat 서버는 Apache 서버에 비해 기능이 다양하지 않는다. 이에 비해 Apache 웹 서버는 다양한 설정과 모듈을 통해 뛰어나고 편리한 기능을 제공하는데, 연동을 하는 경우 Tomcat 서버는 이러한 Apache 서버의 기능을 활용해 더 다양한 기능을 제공할 수 있다. 

     

    - 부하 분산(Load Balancing) : Apache 서버는 mod_jk나 mod_proxy 모듈을 제공하는데, 이러한 모듈은 대규모 사용자 요청을 처리하는 데 효과적으로 사용된다.  Apache 서버와 연동을 한다면 이러한 모듈이 제공하는 부하 부산이나 Failover(시스템 대체 작동)기능을 통해 Tomcat 서버는 대규모 환경에서도 안정적인 서비스를 제공할 수 있다. 

     

    b. 연동 모듈

    Apache 웹 서버와 Tomcat 서버를 연동하는 모듈을 분류하면 크게 두 가지로 정리할 수 있다.

     이름   설명 
     mod_jk   mod_jserv를 대체한 Apache 서버의 모듈로서 AJP(Apache JServ Protocol) 프로토콜을 사용해 Tomcat 서버와  Apache 서버와의 통신을 지원한다. 설정 방법이 아래 두 가지 방법에 비해 더 복잡하고 설치 과정이 별도로 필요하며, tomcat서버 이외엔 사용할 수 없다는 단점이 있다. 그러나 옵션 jkMount를 사용해 여러 가상 호스트별로 설정이 가능하고 뛰어난 부하 분산 기능과 이상 감지 기능 제공, 그리고 대규모 AJP 패킷 크기 지원 등은 장점이라 할 수 있다. 
     mod_proxy / mod_proxy_ajp  리버스 프록시 기능을 통해 Tomcat 서버와의 연도을 지원한다. 이들은 Apache 서버가 제공하는 기본 모듈로서 별도의 설치 과정이 필요 없고 설정 또한 간단하며, 모든 어플리케이션 서버를 위해 사용이 가능하다는 점이 장점이다. 그리고 Apache 서버와의 Connector로서 프로토콜  http, https, ajp를 모두 사용할 수 있다. 그러나 8k 이상의 패킷 크기를 지원하지 못하고 기본적인 부하 분산 기능만 지원하며, 가상 호스트별로 설정하는 방법이 어렵다는 점이 단점이라 할 수 있다. 

     

    5.2 mod_proxy_ajp 모듈 사용

    Apache 서버에서 mod_proxy 모듈을 이용해 리버스 프록시를 사용하는 방법을 설명했다. 프로시 모듈이 제공하는 또 다른 모듈인 mod_proxy_ajp를 사용해 Apache 서버와 Tomcat 서버를 연동하는 방법을 보자.

     

    a. 모듈 설정

    먼저 Apache 서버가 사용하는 프록시 모듈 정의 파일에서 이 모듈의 기능을 사용하도록 활성화됐는지 확인이 필요하다. 이 활성화된 모듈의 기능을 프록시 설정 파일에 추가해줘야 한다.;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    1. Apache 웹 서버가 mod_proxy_ajp 모듈을 지원하는지 모듈 설정 파일을 확인하고 활성화됐는지 확인한다.
    [root@master]# cat -n /etc/httpd/conf.modules.d/00-proxy.conf  | grep 7
         7  LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    [root@master]# httpd -M | grep ajp
     proxy_ajp_module (shared)
     
    2. Apache 서버에서 프록시 기능을 공하는 설정 파일을 열어서 
    [root@master]# cat /etc/httpd/conf.d/proxy.conf
    <IfModule mod_proxy.c>
            ProxyRequests Off
            ProxyPreserveHost On
            ErrorLog /var/log/httpd/tomcat.error.log
            CustomLog /var/log/httpd/tomcat.log combined
     
            <Proxy *>
                    Order deny,allow
                    Allow from all
            </Proxy>
    3. Apache 서버가 사용하는 루트(/), 주 도메인 포트 80번으로 들어오는 사용자의 요청을 프로토콜 ajp를 통해 
    Tomcat 서버와의  연결을 위해 사용하는 포트 8009번으로 전달하라는 설정 
            ProxyPass / ajp://localhost:8009/
    4. 웹 서버가 클라이언트의 요청을 응답할 때 ㅡ 헤더의 Location, Content-Location, URI 정보에서 URI을 조정하기 위해 
    사용 클라이언트가 우회해서 리버스 프록시된 로컬 호스트의 포트로 접속하는 것을 차단하기 위해 사용되는데 , 응답 헤더의 
    정보에서 localhost:8009는 모두 '/', 즉 루트 도메인으로 사용하는 www.chul.com으로 변경하라는 의미다.
            ProxyPassReverse / ajp://localhost:8009
    </IfModule>
     
    5. Tomcat 서버 설정 파일에 ajp 1.3 프로토콜이 사용하는 포트 8009번이 정의돼 있는데, 사용자가 SSL/TLS 요청을 한다면
    그 요청을 SSLㅣ 적용된 Tomcat 포트 8443번으로 전달하라는 의미다. 
    [root@master]# vim /usr/share/tomcat/conf/server.xml
     
    6. 테스트를 위해 Tomcat 서버의 루트 디렉토리에 index.html을 만들자
    [root@master]# vim /usr/share/tomcat/conf/server.xml
        <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     
    [root@master]# vim /usr/share/tomcat/webapps/ROOT/index.html
    <html>
    <head>
    <title> Jaehwan Jeong Tomcat Server </title>
    </head> <body>
    <dev style="width: 100%; font-size: 80px; font-weight: bold; text-align: center;">
    <START OF JAVA CODES>
    <%
            out.println("Hello World!");
            out.println("<BR>This is a first JSP App");
    %>
    <END OF JAVA CODES>
    </div></body></html>
     
    7. 변경 사항 적용을 위해 데몬을 다시 시작
    [root@master]# systemctl restart tomcat
     
    8. lsof를 사용해 프로토콜 AJP가 사용하는 포트 8009이 현재 열려 있는지 확인한다.
    [root@master]# lsof -i tcp:8009
    COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    java    29821 root   82u  IPv6 7323536      0t0  TCP *:8009 (LISTEN)
    cs

     

    b. 연동 테스트

    프록시 설정을 모두 완료했으므로 브라우저에서 tomcat 서버의 루트 디렉토리에 저장된 index.html 파일을 주 도메인과 함께 호출하면 파일의 내용을 확인할 수 있다.

    ex > http://www.chul.com/index.html

    한편 tomcat 서버의 루트 디렉토리에 저장된 index.jsp 파일을 호출해도 이 요청이 tomcat 서버로 전달되기 때문에 동일하게 이 파일을 읽을 수 있다.

     

    5.3 mod_jk 모듈 사용

     장점을 한 가지 더 추가한다면 mod_proxy보다 역사가 오래돼서 사용자가 더 많고, 이로 인해 자료 또한 mod_proxy보다 많다는 점이다. mod_jk모듈은 기본적으로 제공되지 않기 때문에 별도의 설치 과정이 필요하다. 그리고 이 모듈을 사용하기 위해서 기본적으로 필요한 두 가지 요소는 다음과 같다.

     

     - mod_jk.so : Apache 서버에서 Tomcat Connector로 사용되는 모듈 라이브러리로서 소스 파일을 다운로드 한 뒤에 컴파일을 하면 생성되는 라이브러리 파일이다. 이 라이브러리 파일을 Apache 서버가 인식하는 설정 파일에 정의해 Tomcat 서버와의 연결을 사용한다.

     

     - workers.properties : tomcat 프로세스로 사용되는 worker가 사용하는 포트 및 호스트 정보를 정의한 파일이다. 이 파일을 소스로 제공되지 않기 때문에 그 내용을 포함해 새롭게 생성해야 한다. 

     

    a. 모듈 설정

     모듈을 설치하기 위해 http://tomcat.apache.org/download-connectors.cgi에서 최신 버전의 모듈을 다운로드한다. 그리고 Apache 서버와 Tomcat 서버에서 설정 파일을 생성 및 수정한 다음 이 서버를 다시 시작하면 mod_jk 모듈을 사용할 준비를 마치게 된다. 

    1. 모듈 컴파일하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    1. 소스를 다운로드해서 tar로 압축 해제하고 컴파일을 위해 native 디렉토리로 이동한다.
    [root@master ~]# tar xvfz tomcat-connectors-1.2.43-src.tar.gz
    [root@master ~]# cd tomcat-connectors-1.2.43-src/native/
     
    2. Apache 서버의 확장 모듈 설치를 위해 사용되는 명령어 apxs를 옵션에 추가해 스크립트 configure를 실행한다.
    mod_jk 모듈을 컴파일에 사용되는 명령어 apxs가 없다면 명령어 yum install httpd-devel을 사용해 설치하자.
    [root@master native]# ./configure --with-apxs=/usr/bin/apxs
     
    3. 모듈을 컴파일하고 컴파일된 라이브러리를 정해진 Apache 모듈 디렉토리에 설치한다.
    [root@master native]# make; make install
     
    4. 컴파일된 라이브러리 mod_jk.so가 제대로 설치됐는지 디렉토리를 확인, 이 디렉토리는 /etc/httpd/modules이 링크로 연결됨
    [root@master native]# ls /usr/lib64/httpd/modules/mod_jk.so
    /usr/lib64/httpd/modules/mod_jk.so
    cs

     

    2. 설정 파일 수정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    1. Tomcat 서버 설정 파일을 열어 Apache 서버와 연결할 포트 번호, 프로토콜 AJP와 버전 확인
    [root@master ~]# vi /usr/share/tomcat/conf/server.xml
        <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     
    2. Apache 서버에서 mod_jk를 위해 사용할 설정 파일을 생성한다. 
    [root@master ~]# vi /etc/httpd/conf.d/mod_jk.conf
    # mod_jk 모듈 위치를 지정하고 Apache 서버가 서비스 시작 시 이를 메모리에 로딩한다.
    LoadModule jk_module "/etc/httpd/modules/mod_jk.so"
    # Tomcat 프로세스에서 사용되는 worker가 정의된 프로세스를 지정
    JkMorkersFile   /etc/httpd/conf/workers.properties
    # 모듈이 사용할 공유 메모리의 위치와 파일명을 지정
    JkShmFile       /var/run/httpd/mod_jk.shm
    # 모듈에 대한 로그를 기록할 파일을 지정
    JkLogFile       /var/log/httpd/mod_jk.log
    # 모듈에 대한 로그를 기록할 때 로그의 수준을 표준으로 사용되는 Info 이상으로 설정
    JkLogLevel      info
    # 로그 파일에 기록할 타임스탬프의 포맷을 지정
    JkLogStampFormat "[%t-%m-%d %H:%M:%S.%Q] "
     
    3. 위에서 지정한 디렉토리를 생성하고 소유권을 Apache 서버의 사용자가 접근해 사용할 수 있도록 변경
    [root@master ~]# mkdir -p /var/run/mod_jk
    [root@master ~]# chown apache:apache /var/run/mod_jk
     
    4. 지정한 파일을 열어서 
    [root@master ~]# vim /etc/httpd/conf/workers.properties
    worker.apache_log=/var/log/httpd
    # Tomcat이 사용할 worker 인스턴스 이름을 지정
    worker.list=app1Worker
    # status는 worker 프로세스가 부하를 분산하고 있는 통계를 실시간으로 보여주는 지시어다.
    worker.stat1.type=status
    # tomcat 서버와의 연결에 사용할 프로토콜을 지정
    worker.app1Worker.type=ajp13
    # tomcat 서버처럼 기본 호스트 이름을 로컬 호스트로 지정한다.
    worker.app1Worker.host=localhost
    worker.app1Worker.port=8009
     
    [root@master ~]# vi /etc/httpd/conf.d/vhost.conf
    <VirtualHost *:80>
        ServerName www.chul.com
        ServerAdmin admin@chul.com
        <IfModule mod_jk.c>
    5. 주 도메인이 사용하고 있는 가상 호스트 파일에 mod_jk 모듈을 포함하는데, JkMount를 사용해 루트, 주 도메인으로 
    접속하면 그 요청을 tomcat 서버가 사용하는 app1Worker 프로세스로 보내라는 의미다.
            jkMount /* app1Worker
        </IfModule>
    </VirtualHost>
     
    6. 변경 사항들이 적용되도록 Apache, Tomcat 서버를 다시 시작한다.
    [root@master ~]$ systemctl restart httpd tomcat
    cs

     

    b. 연동 테스트

     설정이 제대로 작동하는지 테스트 해보면, 테스트하는 과정은 이전 mod_proxy_ajp와 동일하다. 주 도메인 www.chul.com과 인덱스 파일 index.html을 브라우저에서 호출하면 내용을 읽을 수 있다. 이 index.html 파일은 앞 절의 테스트에서 사용한 파일과 동일하게 사용했다.

     두 번째 파일로 index.jsp 파일에 접속하면 tomcat 서버의 초기 화면을 볼 수 있다.

     

     

     

    6. SSL/TLS 사용


     

    6.1 SSL/TLS 설정

     tomcat 서버에서 SSL을 설정하는 과정은 Apache 서버와는 약간 다르다. 키를 생성하고 그 키를 설정 파일에 추가하고 테스트를 진행하는 과정은 동일하지만, 키 생성 과정 및 설정 파일에 추가하는 방법에서 차이가 있다.

     

     

    a. 키 생성

    먼저 tomcat 서버에서 SSL/TLS 설정을 위해 사용할 키를 명령어 keytool로 생성한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    1. keytool을 이용해 자바에서 사용할 키를 RSA 알고리즘을 사용해 tomcat 이라는 이름으로 생성한다. 
    이 파일을 JKS 라고 하는데, 자바 보안 인증서의 저장소로 사용된다. 
    [root@nddex ~]# keytool -genkey -alias tomcat -keyalg RSA -keystore /etc/pki/keystore
    키 저장소 비밀번호 입력:
    새 비밀번호 다시 입력:
    이름과 성을 입력하십시오.
      [Unknown]:  localhost
    조직 단위 이름을 입력하십시오.
      [Unknown]:  system
    조직 이름을 입력하십시오.
      [Unknown]:  Jaehwan
    //시 이름을 입력하십시오?
      [Unknown]:  Seoul
    /도 이름을 입력하십시오.
      [Unknown]:  Seoul
    이 조직의 두 자리 국가 코드를 입력하십시오.
      [Unknown]:  KR
    CN=Jeong Jaewhan, OU=system, O=system, L=Seoul, ST=Seoul, C=KR이(가) 맞습니까?
      [아니오]:  yes
     
    2. 키가 생성돼 저장된 디렉토리와 그 이름을 확인한다.
    [root@nddex ~]# ls /etc/pki/kestore
     
    3. 명령어 file로 확인해보면 JKS임을 알 수 있다.
    [root@nddex ~]# file keystore
    keystore: Java KeyStore
    cs

     

    b. 설정 파일 편집

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    1. tomcat 서버의 설정 파일을 열어서 먼저 SSL이 적용된 포트 8443번과 프로토콜을 정의한다.
    [root@master ~]# vi /usr/share/tomcat/conf/server.xml
        <Connector port="8443" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                #클라이언트가 인증이 적용된 자원을 요청하지 않는 한 인증서 체인이 필요하지 않다는 의미
                   clientAuth="false"
                   SSLEnabled="true"
                # SSL이 적용된 프로토콜의 이름을 정의
                   scheme="https"
                   secure="true"
                # 사용할 SSL 프로토콜 이름인데, SSL, SSLv2, SSLv3, TLSv1, TLSv1.2등이 올수 있다.
                   sslProtocol="TLS"
                # JKS 파일의 위치와 이름을 지정
                   keystoreFile="/etc/pki/keystore"
                # 키 생성 시 사용했던 패스워드를 입력하는데, 이는 인증서 접근 시 필요
                   keystorePass="PassWord"/>
     
    2. 변경 사항들이 적용되도록 tomcat 서버를 재시작
    [root@master~]# systemctl restart tomcat
     
    3. lsof를 사용해 SSL이 적용된 포트 8443번이 열려서 서비스를 제공하는지 확
    [root@master~]# lsof -i tcp:8443
     
    cs

     

     

    6.2 SSL 설정 테스트

     앞에서 설정한 Tomcat 서버에 SSL을 적용한 웹사이트를 브라우저에서 테스트한다. 먼저 Apache 서버에서처럼 브라우저에서 http가 아닌 SSL이 적용된 https 프로토콜을 사용하고 주 도메인 www.chul.com과 포트 8443번을 입력하면 인증서에 문제가 있다는 메시지를 볼 수 있다.

     신뢰할 수 없는 인증서 관련 에러 메시지에서 계속 탐색을 클릭하면 index.html 파일 내용을 볼 수 있다.  그리고 JSP 파일도 동일하다

728x90