18장. 애플리케이션 배포

Name

Date

Reason For Changes

Version

오픈나루

2013/11

Initial Version

1.0

전준식, jjeon@opennaru.com

2018/02

Second Version

2.0

이번 장에서는 JBoss EAP 6에서 애플리케이션을 배포하는 방법에 대해 설명한다. JBoss EAP 6의 배포는 스탠드얼론 모드와 도메인 모드에서 실행 방법이 다르다.

또, 배포도 CLI, 관리 콘솔 및 배포 스캐너라는 3가지 방식을 사용할 수 있다. 이중에서 배포 스캐너는 스탠드얼론 모드에서만 사용할 수 있다.

18-1.스탠드얼론 모드에서 배포

스탠드얼론 모드에서는 관리도구를 사용하여 배포한다. 간편한 배포 방법으로는 배포 스캐너를 이용할 수 있는 것이 스탠드얼론 모드의 특징이다.

스탠드얼론 모드에서 배포 상태는 다음 그림과 같다.

image 그림 1. 스탠드얼론 모드의 배포 상태

  • STOPPED

    애플리케이션이 서버에 배포되어 있지만 사용하지 않는 상태

  • OK

    애플리케이션이 서버에 배포되어 사용하고 있는 상태

배포 상태는 CLI의 deployment-info 명령어를 사용하여 확인할 수 있다. 아래와 같이 배포된 example.war 애플리케이션의 상태가 OK인 것을 확인할 수 있다.

[standalone@localhost:9999 /] deployment-info --name=example.war

NAME RUNTIME-NAME PERSISTENT ENABLED STATUS

example.war example.war true true OK

18-2.도메인 모드에서 배포

도메인 모드에서는 관리도구를 사용해 도메인 컨트롤러를 경유하여 배포한다. 또, 도메인 환경에서는 배포스캐너를 지원하지 않는다. 배포 환경에서도 스탠드얼론 모드와 달라, 애플리케이션 배포가 서버가 아니라 서버 그룹을 대상으로 배포한다.

이 때문에 배포 상태도 스탠드얼론 모드의 환경 상태와는 다르다. 도메인 모드에서의 배포 상태는 아래와 같다.

image 그림 2. 도메인 모드의 배포 상태

  • not added

    레파지토리에 애플리케이션이 등록된 상태로 어느 서버 그룹에도 할당되어 있지 않은 상태

  • added

    레파지토리에 애플리케이션이 등록된 상태로 몇 개의 서버 그룹에 할당되어 있지만, 사용하지 않도록 설정되어있기 때문에 애플리케이션에 접근할 수 없는 상태

  • enabled

    레파지토리에 애플리케이션이 등록된 상태로 서버 그룹에 할당되어 사용하고 있는 상태

[domain@localhost:9999 /] deployment-info --name=example.war

NAME RUNTIME-NAME

example.war example.war

SERVER-GROUP STATE

main-server-group enabled

other-server-group not added

18-3.배포 방식 비교

JBoss의 애플리케이션 배포 방법은 Managed 방식과 Unmanaged 방식이 있다. 또, Archive 방식과 Exploded방식이 있다. 두 가지 방식이 혼동될 텐데, 이 배포 방법에 대해서 살펴보자.

먼저 Archive 방식과 Exploded 방식의 차이점은 애플리케이션 파일의 구성 방법에 있다. Archive 방식은 압축된 파일을 사용하는 배포방법이며, Exploded 방식은 애플리케이션의 압축을 풀어놓은 디렉터리를 사용하는 방식이다.

배포방법 설명

Archive

압축된 파일을 배포하는 방법

Exploded

압축을 푼 디렉터리를 배포하는 방법

표 1. Achive 방식과 Exploded 방식의 차이점

JBoss EAP 내부적으로 배포할 파일을 관리하는지 여부에 따라 Managed, Unmanaged 방식으로 구분한다. 관리 콘솔의 Deployments에서 파일을 업로드 하여 배포하거나, CLI에서 특정 애플리케이션을 직접 배포할 경우 내부적으로 data 디렉터리에 파일을 보관하여 배포한다. 이렇게 JBoss가 애플리케이션을 관리하는 경우를 Managed 방식이라고 한다. 도메인 모드에서도 콘솔이나 CLI에서 Managed 방식으로 배포하면 다른 머신에 있더라도 호스트 컨트롤러에 애플리케이션을 JBoss가 내부적으로 복사하고 배포한다.

반대로 Unmanaged 방식은 사용자가 직접 애플리케이션 파일을 관리하는 방식이다. 여러 머신을 사용하는 도메인 모드에서 Unmanaged 방식을 사용하면, 사용자가 직접 각각의 머신에 애플리케이션 파일 복사해야 한다.

Managed 방식으로 배포하려면 Archive 방식으로 배포해야만 한다.

배포방법 설명

Managed

JBoss가 애플리케이션 배포 파일을 관리

Archive 방법만 사용할 수 있음

Unmanaged

사용자가 애플리케이션 배포 파일을 관리

표 2. Managed방법과 Unmanaged 방식의 차이점

애플리케이션의 크기가 매우 큰 경우에는 각각의 머신에 사용자가 직접 애플리케이션을 배포하는 Unmanaged 방식을 사용하는 것이 좋다. 또, JSP파일등 특정 파일만 변경하여 배포하고자 할 경우엔 Exploded 방식을 사용해야 한다.

다음에서 애플리케이션을 배포하는 방법을 살펴보자.

18-4.CLI에서 배포

CLI를 사용한 배포 방법에 대해 설명한다. CLI에서 배포하려면 deploy 명령어를 사용한다.

CLI에서 애플리케이션 배포

  • deploy 명령을 실행하여 /EAP6book/download/example.war를 배포하는 예제이다.

[standalone@localhost:9999 /] deploy /EAP6book/download/example.war

[standalone@localhost:9999 /] deploy -l

NAME RUNTIME-NAME ENABLED STATUS

example.war example.war true OK

CLI에서 애플리케이션 제거

CLI 로 undeploy 하는 방법에 대해 설명한다. 스탠드얼론 모드에서는 애플리케이션에 대해 undeploy 명령어를 실행하기만 하면 배포된 애플리케이션이 삭제된다.

[standalone@localhost:9999 /] undeploy example.war

도메인 모드에서는 배포된 example.war 애플리케이션을 main-server-group 에서 제거하기 위해 remove 명령어를 사용한다.

[domain@localhost:9999 /] /server-group=main-server-group/deployment=example.war:remove

{
  "outcome" => "success",
  "result" => undefined,
  "server-groups" => \{
    "main-server-group" => \{
      "host" => \{
        "master" => \{
          "server-one" => \{"response" => \{"outcome" => "success"}},
          "server-two" => \{"response" => \{"outcome" => "success"}}
        }
      }
    }
  }
}

18-5.관리 콘솔에서 배포

관리 콘솔에서 애플리케이션을 배포하는 방법을 설명한다.

관리 콘솔에서 ‘Runtime’ ‘Server’ ‘Manage Deployments’를 선택한다.

따라하기

  1. 관리 콘솔에서 Deployments 선택

  2. 배포할 애플리케이션 선택

  3. 배포파일 저장

  4. 애플리케이션 Enable

  5. 배포완료

  6. 애플리케이션 확인

  1. 관리 콘솔에서 Deployments 선택

    Runtime Server Manage Deployments를 선택한다.

    image

  1. 배포할 애플리케이션 선택

    image

  1. 배포파일 저장

    image

  1. 애플리케이션 Enable

    image

  1. 배포완료

    image

  1. 애플리케이션 확인

    웹 브라우저에서 http://localhost:8080/example/ 을 입력하여 배포한 애플리케이션을 확인한다.

    image

18-6.Unmanaged 배포

JBoss EAP 6 서버에 애플리케이션을 배포할 때 WAR나 EAR로 패키징된 하나의 파일을 사용하지 않고 별도의 디렉터리(Exploded)에 보관된 애플리케이션을 사용하려고 할 때 사용하는 방법이 Unmanaged 배포 방법이다. 대부분 미들웨어 벤더는 운영환경에서 JSP를 체크하여 컴파일하는 것을 권장하진 않지만, 특정 JSP 변경 파일만 빠르게 운영환경에 반영하려는 요구사항이 많다. 이 경우 압축이 풀린 디렉터리 형태로 배포하여야 한다. 이런 배포 방식을 JBoss에서는 Unmanaged 배포라고 한다.

도메인 모드에서 여러 호스트에서 Unmanaged 형식으로 배포하려면 각 호스트에 같은 디렉터리에 먼저 애플리케이션이 복사되어 있어야 한다.

다음에 설명할 배포 스캐너에서도 압축이 풀린 디렉터리로 배포할 수 있다. 예를 들어 example.war 라는 압축을 풀어놓은 디렉터리를 사용하면 된다.

관리 콘솔에서 배포

따라하기

  1. 관리 콘솔에서 Deployments 선택

  2. 배포할 애플리케이션 경로 입력

  3. 애플리케이션 Enable

  4. 배포완료

  5. 애플리케이션 확인

  1. 관리 콘솔에서 Deployments 선택

    Runtime Server Manage Deployments를 선택한다.

    image

  1. 배포할 애플리케이션 경로 입력

    ‘Path’에는 압축이 풀린 디렉터리 경로를 입력한다. ‘Is Archive?’ 체크박스는 선택하지 않는다. example.war파일이 압축 파일인 경우에는 체크 박스를 선택한다. ‘Name’은 JBoss에서 관리에 사용하는 이름이며, ‘Runtime Name’은 실제 배포될 이름이다. 예제에서 example.war는 압축을 풀어놓은 디렉터리이다.

    image

  1. 애플리케이션 Enable

    image

  1. 배포완료

    image

  1. 애플리케이션 확인 웹 브라우저에서 http://localhost:8080/example/ 을 입력하여 배포한 애플리케이션을 확인한다.

    image

CLI에서 배포

CLI에서 배포하는 여러 가지 명령들을 살펴보자.

  • 스탠드얼론 모드에서 Exploded 디렉터리 배포 방법

    [standalone@localhost:9999 /] /deployment=example.war:add(runtime-name="example.war", content=[\{"path"=>"/EAP6book/apps/example.war","archive"=>false}])
    
    {"outcome" => "success"}
    
    [standalone@localhost:9999 /] */deployment=example.war:deploy*
    
    {"outcome" => "success"}
  • 스탠드얼론 모드에서 애플리케이션 undeploy, 제거 방법

    [standalone@localhost:9999 /] /deployment=example.war:undeploy
    
    {"outcome" => "success"}
    
    [standalone@localhost:9999 /] */deployment=example.war:remove*
    
    {"outcome" => "success"}
  • 도메인 모드에서 Exploded 배포 디렉터리 추가

    [domain@localhost:9999 /] /deployment=example.war:add(runtime-name="example.war", content=[\{"path"=>"/EAP6book/apps/example.war","archive"=>false}])
  • 도메인 모드에서 서버 그룹에 배포

    [domain@localhost:9999 /] deploy --name=example.war --server-groups=main-server-group
  • 도메인 모드에서 애플리케이션 서버 그룹에서 undeploy

    [domain@localhost:9999 /] undeploy example.war --server-groups=main-server-group

18-7.배포스캐너를 이용한 배포

새로운 애플리케이션을 배포하기 위해 특정 디렉터리를 모니터링하는 모듈이 ‘배포 스캐너’이다.

배포스캐너는 두 가지 방법으로 배포를 제어한다. 첫 번째는 배포 디렉터리에 있는 배포 파일(WAR, EAR, JAR, SAR 파일)을 주기적으로 스캔하여 배포하는 ‘자동 배포’ 방법이다. 두 번째는 주기적인 스캔을 통한 배포를 이용하지 않고, 마커 파일을 이용하여 수동으로 배포를 제어하는 ‘수동 배포’ 방법이다. 배포 스캐너는 도메인 모드에서는 사용할 수 없다.

자동 배포

배포스캐너는 배포 디렉터리($jboss.server.base.dir/deployments)를 주기적으로 체크하고 있다가 새로운 애플리케이션이나 변경이 있으면 로드하여, 배포, 재배포한다. 자동 배포는 애플리케이션의 개발 시점에서는 매우 편리한 기능이지만, 운영 환경에서는 자동 배포하지 않도록 설정을 변경해야 한다. 배포스캐너에 대한 설정 변경은 CLI를 사용하여 /subsystem=deployment-scanner 서브시스템에서 할 수 있다.

다음은 CLI 명령을 사용하여 배포스캐너의 설정을 확인하는 방법이다.

[standalone@localhost:9999 /] cd subsystem=deployment-scanner

[standalone@localhost:9999 subsystem=deployment-scanner] :read-resource(recursive=true)

{
  "outcome" => "success",
  "result" => {
    "scanner" => {
      "default" => {
        "auto-deploy-exploded" => false,
        "auto-deploy-xml" => true,
        "auto-deploy-zipped" => true,
        "deployment-timeout" => 600,
        "path" => "deployments",
        "relative-to" => "jboss.server.base.dir",
        "scan-enabled" => true,
        "scan-interval" => 5000
      }
    }
  }
}

배포 스캐너에서 설정할 수 있는 파라미터는 다음과 같다.

파라미터 데이터타입 설명

name

STRING

스캐너의 이름, 기본값은 ‘default’

path

STRING

스캐너가 감시하는 파일 시스템의 경로

  • relative-to가 설정되지 않은 경우:절대 경로

  • relative-to가 설정된 경우:상대 경로

relative-to

STRING

디렉터리의 지정

환경 변수 등에 설정한 경로를 참조하는 경로로 기본값은 ‘jboss.server.base.dir’

scan-enabled

BOOLEAN

스캔을 사용할 것인지를 지정

scan-interval

INT

스캔 간격을 밀리 세컨드로 지정

1 이상의 값을 지정했을 경우에만 스캔이 실행된다.

auto-deploy-zipped

BOOLEAN

압축된 애플리케이션 콘텐츠를 .dodeploy 마커 파일를 사용하지 않고 배포할 것인지를 지정

auto-deploy-exploded

BOOLEAN

exploded (압축이 풀린) 형식인 애플리케이션 콘텐츠를 .dodeploy 마커 파일을 사용하지 않고 배포할 것인지를 지정

애플리케이션을 배포하는 중 콘텐츠가 수정될 수 있기 때문에 이 방식을 사용하는 것은 추천하지 않는다.

deployment-timeout

LONG

배포의 타임아웃

기본값:60 초

표 3. 배포 스캐너 파라미터

스캔 간격

스캔 간격(scan-interval)은 배포스캐너가 디렉터리 스캔 간격을 지정하는 항목이다. 스캔 간격을 0으로 설정하면 자동 배포는 사용할 수 없다. 서버 시작시 배포 및 마커 파일로 수동 배포 제어를 할 수 있다.

다음에 스캔 간격(scan-interval)을 0으로 설정하는 CLI 예제이다.

[standalone@localhost:9999 subsystem=deployment-scanner] cd scanner=default

[standalone@localhost:9999 scanner=default] :write-attribute(name=scan-interval,value=0)

{"outcome" => "success"}

배포스캐너 사용 설정

배포스캐너의 scan-enabled 속성은 배포스캐너 기능을 사용할 것인지를 지정하는 항목이다.

이 설정은 standalone*.xml파일의 deployment-scanner 서브시스템의 scan-enabled 항목을 설정하면 된다. 서버 시작 시에만 배포하고 싶은 경우, scan-enabled 항목을 false로 설정한다.

[standalone@localhost:9999 scanner=default] :write-attribute(name=scan-enabled,value=false)

{"outcome" => "success"}

수동 배포

배포스캐너는 애플리케이션 배포 디렉터리에 있는 콘텐츠 자체는 감시하지 않는다. 대신 스캐너는 마커 파일 시스템을 사용하여 그 마커 파일을 추가, 삭제하는 것을 명령어로 스캐너에 전달하여 콘텐츠를 배포, 제거한다.

마커 파일

마커 파일(Marker Files)은 관련하는 콘텐츠의 파일명 뒤의 확장자(extension)를 추가하여 만든다. 예를 들어, example.war 파일의 배포하기 위한 마커 파일명은 example.war.dodeploy가 된다. 마커 파일은 파일 내에 내용이 없는 0 바이트 비어있는 파일을 만들면 된다. 리눅스에서는 touch 명령을 이용하여 파일을 만들 수 있다. 예를 들면 ‘touch example.war.dodeploy’ 명령은 빈 파일을 생성한다.

마커 파일의 확장자의 종류는 다음과 같다.

확장자 설명 작업주체

.dodeploy

애플리케이션을 배포하라고 알린다. 이미 배포했을 경우엔 재배포한다. 사용자가 작성하는 파일이다.

관리자가 배포 시 작성

.skipdeploy

이 애플리케이션은 자동배포를 사용하지 않는다는 것을 뜻한다.

exploded 애플리케이션을 업데이트할 때, 재배포되지 않도록 할 때 사용할 수 있다.

관리자가 작성

.isdeploying

애플리케이션이 배포 중임을 나타내는 파일이다. 배포스캐너가 작성하는 파일이다.

시스템에서 자동생성

.deployed

애플리케이션 배포가 완료되었음을 나타낸다. 배포스캐너가 작성하는 파일로 사용자가 이 파일을 삭제했을 경우엔 콘텐츠가 배포되지 않는다.

시스템에서 자동생성

.failed

애플리케이션 배포 중 오류가 발생하여 배포 실패한 것을 나타낸다. 배포 스캐너가 작성하는 파일로 파일 안에 배포 오류 메시지가 들어있다.

시스템에서 자동생성

.isundeploying

dodeploy 파일이 삭제되어 애플리케이션이 undeploy 되고 있는 상태를 나타낸다. 배포 스캐너가 작성하는 파일이다.

undeploy가 완료되면, 이 마커 파일은 삭제된다.

시스템에서 자동생성

.undeployed

애플리케이션이 undeploy된 상태를 나타낸다.

시스템에서 자동생성

.pending

서버에서 애플리케이션을 배포하고 있거나, 문제가 생겨 애플리케이션 배포 명령을 서버에 보내지 못한 생태를 나타낸다.

시스템에서 자동생성

표 4. 마커 파일의 종류

  • 배포 스캐너를 사용한 새로운 애플리케이션 배포

    아래와 같이 배포 스캐너의 ‘scan-enabled=true’ 속성을 확인한다.

    [standalone@localhost:9999 scanner=default] /subsystem=deployment-scanner/scanner=default:read-resource(recursive=true)
    
    {
    
      "outcome" => "success",
      "result" => {
        "auto-deploy-exploded" => false,
        "auto-deploy-xml" => true,
        "auto-deploy-zipped" => true,
        "deployment-timeout" => 600,
        "path" => "deployments",
        "relative-to" => "jboss.server.base.dir",
        "scan-enabled" => true,
        "scan-interval" => 5000
      }
    }

따라하기

  1. 콘텐츠를 deployments 디렉터리에 복사

  2. 마커 파일작성

  3. 배포 확인

  4. 배포 삭제

  1. 콘텐츠를 deployments 디렉터리에 복사

    $ cp /products/download/example.war $JBOSS_HOME/standalone/deployments
    
    $ ls
    
    README.txt example.war
    
    $
  1. 마커 파일 작성

    $ cd $JBOSS_HOME/standalone/deployments
    
    $ touch example.war.dodeploy
  1. 배포확인

    $ ls
    
    README.txt example.war example.war.deployed
    
    $
  1. 배포 삭제

    $ rm -rf $JBOSS_HOME/standalone/deployments/example.war
    
    $ ls
    
    README.txt example.war.undeployed
    
    $