티스토리 뷰

개요

  • CentOS(RHEL)에서 특정 기능을 수행하는 서비스를 만드려면 start(), stop()이 정의된 Bash 스크립트를 /etc/init.d 디렉토리에 작성하거나 심볼릭 링크를 생성하면 된다. Java 애플리케이션 또한 이 방식을 따르면 nohup java -jar {some_project} &으로 직접 실행하거나 스크립트를 작성하지 않아도 서비스로 작동하게 만들 수 있다.
  • Spring Boot는 이러한 서비스를 실행하기 위한 Bash 스크립트를 빌드 옵션을 통해 제공하고 있다. 개발자는 따로 서비스 스크립트를 작성하지 않아도 편리하게 이용할 수 있다. 다만, 버전마다 다른 설정이 필요하다.

Spring Boot 1.x

  • Spring Boot 1.x에서는 /build.gradle 파일에 아래 내용을 추가하면 된다.
bootRepackage {
    executable = true
}

Spring Boot 2.x

  • Spring Boot 2.x에서는 /build.gradle 파일에 아래 내용을 추가하면 된다.
bootJar {
    launchScript()
}

서비스 스크립트 등록

  • 이제 프로젝트를 빌드하고 등록할 차례이다.
# 프로젝트 빌드
$ ./gradlew build

# 빌드된 프로젝트를 서비스로 등록
$ sudo ln -s ./build/libs/some-project.jar /etc/init.d/some-project

## 등록한 서비스에 실행 권한 부여
$ sudo chmod 0755 /etc/init.d/some-project

# 서비스 실행시 적용될 JVM 옵션 설정
$ nano ./build/libs/some-project.conf
PID_FOLDER='/home/some-project'
LOG_FOLDER='/dev'
LOG_FILENAME='null'
JAVA_OPTS='-server -Xms8g -Xmx8g -XX:MaxMetaspaceSize=512m -Dspring.profiles.active=prod'
  • /etc/init.d/ 경로에 빌드된 프로젝트의 .jar 파일의 심볼릭 링크를 생성하고 파일 실행 권한을 부여하는 것 만으로 운영체제 내의 정식 서비스로 작동하게 된다. 이 작업은 최초 1번만 필요하며, 추후 빌드된 파일의 경로와 이름이 변경되지 않는한 자동으로 적용된다.
  • 추가적으로 빌드된 프로젝트의 .jar 파일과 동일한 디렉토리에 동일한 파일 이름으로 .conf 파일을 작성하면 서비스 실행시 적용될 다양한 옵션을 자동으로 적용할 수 있다.
  • .conf 파일에서 LOG_FOLDERLOG_FILENAME 옵션을 사용하면 기본적으로 콘솔에 출력되는 로그를 실시간으로 파일에 남길 수 있다. 하지만 Spring Boot에 기본 내장된 Logback을 이용한 파일 로깅(logback.xml에 로그 처리 정책을 정의하는 방법)이 훨씬 강력하고 다양한 기능을 제공하기 때문에 위와 같이 /dev/null을 지정하여 서비스 레벨에서의 로그 기능을 비활성화하는 방법을 추천한다.

서비스 실행

  • 등록된 서비스는 아래와 같이 실행, 종료, 재시작 등의 제어가 가능하다.
# 애플리케이션 시작
$ sudo service some-project start

# 애플리케이션 종료
$ sudo service some-project stop

# 애플리케이션 재시작
$ sudo service some-project restart

# 애플리케이션 상태 확인
$ sudo service some-project status

# 운영체제 재시작시 자동 시작
$ sudo chkconfig some-project on 
  • chkconfig on 명령어를 사용하면 서버 재시작시 애플리케이션을 자동으로 실행되도록 설정할 수 있다. 서버 전원을 껐다 켜는 상황 등에 유용하게 대처할 수 있다.

트러블슈팅

  • .conf 파일 작성 후 저장시 개행(라인 전환) 방법은 반드시 리눅스 표준의 LF 기호만 사용해야 한다. 이를 고려하지 않고, Windows 환경에서 무심코 CR, LF 기호로 저장하면 서비스 스크립트 실행시 이를 인식하지 못하여 아래와 같은 오류가 발생한다.
$ sudo service some-project start
 does not exist. Falling back to /tmp
 does not exist. Falling back to /tmp 

참고 글

댓글
댓글쓰기 폼