5 minute read

라즈베리파이 WEB WAS 연동

연동 개요

: 라즈베리파이에 Apache & Tomcat서버를 연동한다.

  • Apache (웹 서버) 는 static한 파일 (js, img, css) 등 변동이 없는 파일을 서비스하기 위해 사용되어 왔다.
  • Tomcat (웹 어플리케이션 서버, 이하 WAS) 는 사용자의 요청 등에 따라 유동적인 서비스를 제공하기 위해 사용한다.

참고)
WEB은 static 파일 서비스에 유리하고, WAS는 동적인 서비스를 제공하는데 유리하다. 톰캣은 WAS 이지만 Web 서버의 기능도 갖고 있다. 그러나 톰캣의 Web 서버 기능은 아파치보다 처리 속도가 느리기 때문에 정적인 페이지는 아파치가 처리하고, 동적인 페이지는 톰캣이 처리하도록 한다. 이렇게 하므로 부하를 분산시킬 수 있다. (물리적 분리 외부망: WEB, 내부망: WAS)

연동 종류

: 다양한 연동방법이 존재했다. 나는 mod_jk 를 이용한 연동방식으로 진행한다. mod_proxy는 AJP 같은 특정 프로토콜에 의존하지 않고, 설정이 간편하며, 성능상 우위를 점하고 있지만, mod_jk를 이용한 방식이 전통적으로 널리 쓰이고 있기에 선택했다.

  • 종류
    • Tomcat Connector를 이용한 mod_jk 연동 (AJP)
    • mod_proxy를 이용한 reverse proxy 기능으로 연동 (Proxy 개념 필요)
    • mod_proxy_ajp를 이용한 AJP를 reverse proxy로 사용해서 연동 (기존의 2가지 방법 모두 개념이 필요함)

mod_jk 모듈이란?
AJP프로토콜을 사용하여 톰캣과 연동하기 위해 만들어진 모듈이다.
아파치에 들어온 요청 중 톰캣이 처리할 요청을 AJP 포트(일반적으로 8009)를 통해 톰캣에 전달하고 그에 대한 응답을 받는 역할을 수행한다. mod_jk는 톰캣에서 배포되므로 톰캣 홈페이지에서 tomcat-connector 이라는 파일로 다운 받을 수 있다.
참고로 mod_jk는 아파치 웹서버에 설치해주어야 한다.

AJP란? (Apache JServ Protocol)

  • 웹서버 뒤에 있는 와스로 부터 웹서버에서 받은 요청을 와스로 전달해주는 프로토콜이다.
  • 아파치와 톰캣을 연동하기 위해서는 AJP를 통해 서로 통신을 한다.
  • 아파치는 이를 사용하여 80포트로 들어오는 요청은 자신이 받고, 이 요청중 서블릿을 필요로 하는 요청은 톰캣에게 전달하여 처리한다. (httpd.conf 의JkMount설정 )
  • 해당 프로토콜(ajp)는 다양한 WAS에서 지원한다. ex) 아파치, 톰캣, 제우스, 웹로직, 웹스피어 등…

연동시 흐름

: 흐름을 요약하자면 다음과 같다.

  • 요약
    1. web서버 에 주소를 입력하면 정적페이지를 로드한뒤 was서버 내부의 동적페이지가 호출되도록 연동을 목적한다.
    2. 흐름은 web서버(80포트)를 거쳐서 요청한 특정 확장자 파일은 특정포트인 was서버(8080포트)로 바인딩한다.
    3. 이렇게 http://주소:8080 포트로 WAS로 직접접속이 아닌 http://주소:80// 포트로 WEB로 접속을통해 WAS로 접근하도록 한다.
  • 상세
    1. 아파치 웹서버의 httpd.conf 파일에서 톰캣 연동을 위한 설정을 추가하고 톰캣에서 처리할 요청을 지정한다.
    2. 사용자의 브라우저는 아파치 웹서버에 접속하여 요청한다. (통상 80 port )
    3. 아파치 웹서버는 사용자의 요청이 들어왔을때, 이 요청이 톰캣에서 처리되도록 지정된 요청인지 확인한다.
    4. 톰캣에서 처리해야하 하는 경우 (예를들어 특정 확장자인 경우) 아파치 웹서버는 톰캣의 AJP 포트(통상 8009 port) 에 접속해 요청을 톰캣에게 전달한다.
    5. 톰캣은 아파치 웹서버로부터 요청을 받아 처리한 후, 처리 결과를 다시 아파치 웹서버에게 돌려준다. 아파치 웹 서버는 톰캣으로 전달받은 처리 결과를 사용자에게 전송한다.

mod_jk 구축

mod_jk 설치

: 본격적으로 연동모듈을 다운로드하고 설치하자.

  1. JK connector(mod_jk) 다운로드
    공식 홈페이지에서 소스링크를 복사한다. (공식홈페이지)
     cd /fswas/insatall
     wget [mod_Jk 소스 링크]  #소스파일 다운로드 완료
        
     mkdir /fswas/apache/tomcat-connectors  # mod_jk 설치할 폴더 생성
     cd /fswas/apache/tomcat-connectors/    
     tar -zxf tomcat-connectors-1.2.48-src.tar.gz  # mod_jk 압축해제
            
    
  2. JK connector(mod_jk) 컴파일
    소스 컴파일 설치한다.
     # 압축해제한 폴더에서 Tomcat Connector 홈/native 디렉터리로 이동     
     cd /fswas/apache/tomcat-connectors/tomcat-connectors-1.2.48-src/native/
    
     # configure 명령어를 통해 의존성패키지 설치경로(이전에 아파치 의존성패키지로 설치해둔 경로/bin/apxs)를 포함한 make 파일을 생성한다.
     ./configure --prefix=/fswas/apache/tomcat-connectors --with-apxs=/fswas/apache/httpd/httpd-2.4.541/bin/apxs
    
     # 컴파일 설치
     make && make install
     
    
  3. 정상설치 확인
    정상적으로 설치 되었는지 확인한다. (연동모듈 mod_jk.so 생성을 확인한다.)
     cd /fswas/apache/httpd/httpd-2.4.541/modules
     ls | grep mod_jk.so
        
     # 존재하면 정상적으로 설치완료다.
        
    

참고)
여기까지 완료하면 아파치홈/modules 경로안에 mod_jk.so 파일이 생성된다. 이 파일이 있는지확인해야한다.

WEB서버 mod_jk 설정

: 웹서버(아파치) 측의 설정.

  1. (아파치루트/conf/httpd.conf) 설정
    : mod_jk를 연동하는 설정과 mod_jk.conf의 경로를 지정하여 요청 처리에 대한 설정 및 로그 파일 등을 기술한다.

     cd /fswas/apache/httpd/httpd-2.4.541/conf/
     vi httpd.conf
          
    
     #LoadModule rewrite_module modules/mod_rewrite.so
    
     # httpd.conf 내용 중 LoadModule 바로 아래에 mod_jk 설정 호출을 작성했다.
     # 사람마다 설정을 작성하는 방법은 다르겠지만 (httpd.conf 안에 한번에 작성하는 등..)
     # 나는 위 처럼 mod_jk 설치시 기본적으로 포함되어있는 httpd-jk.conf 파일을 include 하는것으로 한번에 끝냈다.
     # 즉, 이 설정파일에 기본설정이 어느정도 기록이 되어있어서 약간의 수정으로 쉽게 반영했다.
     # 요즘엔 mod_jk 패키지에 이렇게 기본설정이 포함되어서 나오나보다.
          
     # mod_jk 설정호출 (mod_jk Connector)
     Include /fswas/apache/tomcat-connectors/tomcat-connectors-1.2.48-src/conf/httpd-jk.conf
          
     # 최종 mod_jk JK마운트로 worker를 등록한다. url를 구분하여 톰캣이 처리할지 결정한다.
     # 이게 없으면 설정만 존재할 뿐이다.
     jkMount /* lilo_lb
    
    

    참고) mod_jk 패키지에 기본적으로 들어있었던 설정파일
    httpd-jk.conf
    uriworkermap.properties
    workers.properties

  2. (아파치루트/톰캣커넥터루트/mod_jk.conf) 설정
    : 앞서 설명했듯이 관례적인 파일로 하지않고(mod_jk.conf 가 아닌) 패키지에서 제공하는 기본설정파일 httpd-jk.conf 를 활용했다. (앞에서 httpd.conf 파일로 부터 호출되도록 작성했었다.)

    사진1

     cd /fswas/apache/tomcat-connectors/tomcat-connectors-1.2.48-src/conf
     vi httpd-jk.conf
    
    
     <IfModule jk_module>
         (중략)
         # 아파치 시작시 로드할 연동모듈을 정의                 
         LoadModule jk_module modules/mod_jk.so
           
         # 워커(Worker) 파일 경로를 적어준다.
         JkWorkersFile /fswas/apache/tomcat-connectors/tomcat-connectors-1.2.48-src/conf/workers.properties
    
         # 연동모듈의 로그를 생성시킬 경로를 적어준다.
         JkLogFile /fswaslog/apache/dbd/mod_jk.log
         JkShmFile /fswaslog/apache/dbd/mod_jk.shm
    
         (중략)
              
         # 아래 부분을 모두 주석처리 해준다.
       # 주석처리 하지 않으면 web서버 기동시 연동모듈이 동작할때 고치치않아도 되지만 로그에 에러가 찍힌다.
       #  <Location /jk-status>
       #      # Inside Location we can omit the URL in JkMount
       #      JkMount jk-status
       #      Require ip 127.0.0.1
       #  </Location>
       #  <Location /jk-manager>
       #      # Inside Location we can omit the URL in JkMount
       #      JkMount jk-manager
       #      Require ip 127.0.0.1
       #  </Location>
    
    <IfModule jk_module>
    
    
  3. (아파치루트/톰캣커넥터루트/workers.properties) 설정
    : 요청을 처리할 톰캣 인스턴스들을 정의하는 중요한 핵심 파일이다. 예를 들어 컨텍스트 별로 각각 톰캣을 구성하기 위한 설정을 하거나, 로드 밸런싱을 위한 다중화 톰캣 설정을 할 수 있다. (앞에서 mod_jk.conf 파일로 부터 호출되도록 작성했다.)

     cd /fswas/apache/tomcat-connectors/tomcat-connectors-1.2.48-src/conf
     vi workers.properties
    
    
     worker.list=lilo_lb     # 리스트정의
     worker.lilo_lb.type=lb  # 타입정의
     worker.lilo_lb.balance_workers=worker1  # 이름정의
     worker.worker1.port=8009          # mod_jk 가 이용하는 APJ 연동 포트
     worker.worker1.host=192.168.0.10  # 연동시킬 나의 다른 라즈베리파이 WAS서버 주소를 입력 
     worker.wokrer1.type=ajp13         # 연동모듈 프로토콜
    
    

WAS서버 mod_jk 설정

: 와스서버(톰캣) 측의 설정.

  1. (톰캣루트/conf/server.xml) 설정 : server.xml 에서 아래부분 주석을 해제한다

     cd /fswas/tomcat/apache-tomcat-8.5.82/conf
     vi server.xml
          
          
     # 아래 mod_jk 연동 관련한 주석을 풀어준다!.
     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <Connector protocol="AJP/1.3"
              address="0.0.0.0"
              secretRequired="false"
              port="8009"     # mod_jk 연동 포트이다.
              # port="28009"  # 이부분은 로드밸런싱 내용이다. 지금은 신경쓰지말도록..!
              redirectPort="8443" />
    
    

secretRequire=”fasle”

□ secretRequire=”false” 로 설정한다 (기본값은 true 이다.)
□ 기본적으로 보안(SSL) 응답 요청을 하기 때문에 address, secret 설정이 없다면 HTTP ▷ Tomcat 웹 연결 시 넘어가지 못하고
무한 로딩 상태가 된다.
□ 테스트를 위해 또는 기본 내부 네트워크(신뢰할 수 있는 네트워크) 환경이라면 “false” 옵션을 무조건 줘야 한다.

addess

□ address - IP 주소가 두 개 이상인 서버의 경우 이 속성은 지정된 포트에서 수신 대기하는 데 사용할 주소를 지정한다.
□ 기본값으로는 커넥터는 루프백 주소에서 수신 대기합니다. (디폴트값이 ::1 값이였다.)
□ 별다른 시스템 속성을 사용하지 않을 경우 기본 커넥터로 address=”0.0.0.0”으로 구성하며 IPv4/IPv6 주소 모두에서 수신 대기합니다.
□ 저의 경우는 최신 톰캣 10 버전으로 설치를 했으며 기본적으로 address=”::1” IPv6로 값이 들어가 있는데 저 값이 IPv4의 127.0.0.1(Localhost)과 로컬 통신과 같은 의미로 수정할 필요는 없습니다.

secret (해당 설정에서는 사용안함.)

□ 기본값이 NULL 상태로 secretRequired가 명시적으로 구성되지 않는 한 값으로 지정되어야 처리가 된다.
□ 값으로 구성된 경우는 세팅 시 Apache와 Tomcat 같은 보안 키가 일치해야 하며
□ 그렇지 않으면 secretRequired 설정에 관계없이 요청이 거부가 된다.
□ ex) 사용법 예시

workers.properties 안에 worker.tomcat.secret=eztest1234 (값을 추가)
server.xml 안에 secret=”eztest1234” (worker 설정 값과 동일하게 추가)

# 재기동 후 톰캣에서 수행중인 포트번호 확인하기
# mod_jk 8009 포트가 서비스중임을 볼 수 있다.
# 8009 포트: mod_jk 를 통해 apache 서비스와 통신하기 위한 포트이다.

wasadm@cddaapo2:~ $ sudo netstat -nlp | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      1013/java
tcp6       0      0 ::1:8005                :::*                    LISTEN      1013/java
tcp6       0      0 ::1:8009                :::*                    LISTEN      1013/java

연동완료 정리

: mod_jk 를 이용한 WEB, WAS 연동이 완료되었다. 정상일시 /index 주소를 호출해보면 web서버의 index.html 파일이 아닌 WAS서버의 index.html 파일이 호출된다.

사진2

  • 요약
    1. 사용자 http://호스트주소:9510/index.hmtl 입력
    2. 공유기 포트포워딩으로 9510 내부포트로 이동하며 내부포트를 9510으로 했기때문에 WEB서버가 수신한다.
    3. mod_jk 모듈과 설정이 로드된다.
    4. mod_jk 모듈과 설정 로드가 끝나면 jkMount를 체크하고 적절한 호출의 url패턴인지 통과시키거나 거부한다.
    5. 통과하면 톰캣의 mod_jk APJ 포트인 8009 으로 요청을 전달한다.
    6. 연동 끝

상세내용

  1. (httpd.conf) mod_jk.conf 설정파일 호출
  2. (httpd-jk.conf) mod_jk.so 모듈로드
  3. (workers.properties) 설정된 Worker 로드 후 JkLogFile 로그 생성
  4. (httpd.conf) jkMount 로 적합한 호출 제외 및 통과 처리하여 톰캣에 요청
  5. 연동 끝

Leave a comment