spring / / 2025. 10. 11. 22:02

[Spring Boot 번역] Installing Spring Boot Applications

출처: https://docs.spring.io/spring-boot/4.0-SNAPSHOT/how-to/deployment/installing.html

이 버전은 아직 개발 중이며 안정적인 것으로 간주되지 않습니다. 최신 안정 버전에 대해서는 Spring Boot 3.5.6을 사용하십시오!

Installing Spring Boot Applications

java -jar를 직접 사용하여 Spring Boot 애플리케이션을 실행하는 것 외에도 systemd, init.d 또는 Windows 서비스로 실행할 수도 있습니다.

Installation as a systemd Service

systemd는 System V init 시스템의 후속 버전이며 현재 많은 최신 Linux 배포판에서 사용되고 있습니다.

Spring Boot 애플리케이션은 systemd 'service' 스크립트를 사용하여 시작할 수 있습니다.

/var/myapp에 uber jar로 패키징된 Spring Boot 애플리케이션이 있다고 가정하면, systemd 서비스로 설치하려면 myapp.service라는 이름의 스크립트를 만들어 /etc/systemd/system 디렉토리에 배치합니다.

다음 스크립트는 예제를 제공합니다:

[Unit]
Description=myapp
After=syslog.target network.target

[Service]
User=myapp
Group=myapp

Type=exec
ExecStart=/path/to/java/home/bin/java -jar /var/myapp/myapp.jar
WorkingDirectory=/var/myapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

애플리케이션에 맞게 Description, User, Group, ExecStartWorkingDirectory 필드를 변경하는 것을 잊지 마십시오.

ExecStart 필드는 스크립트 액션 명령을 선언하지 않으므로 기본적으로 run 명령이 사용됩니다.

애플리케이션을 실행하는 사용자, PID 파일 및 콘솔 로그 파일은 systemd 자체에서 관리하므로 'service' 스크립트에서 적절한 필드를 사용하여 구성해야 합니다.

자세한 내용은 service unit configuration man page를 참조하십시오.

시스템 부팅 시 애플리케이션이 자동으로 시작되도록 플래그를 지정하려면 다음 명령을 사용합니다:

$ systemctl enable myapp.service

자세한 내용은 man systemctl을 실행하십시오.

Installation as an init.d Service (System V)

애플리케이션을 init.d 서비스로 사용하려면 빌드를 구성하여 완전히 실행 가능한 jar를 생성합니다.

완전히 실행 가능한 jar는 파일 앞부분에 추가 스크립트를 삽입하여 작동합니다.

현재 일부 도구는 이 형식을 허용하지 않으므로 항상 이 기술을 사용할 수 있는 것은 아닙니다.

예를 들어, jar -xf는 완전히 실행 가능하게 만들어진 jar 또는 war를 추출하는 데 자동으로 실패할 수 있습니다.

java -jar로 실행하거나 servlet container에 배포하는 대신 직접 실행하려는 경우에만 jar 또는 war를 완전히 실행 가능하게 만드는 것이 좋습니다.

zip64 형식의 jar 파일은 완전히 실행 가능하게 만들 수 없습니다.

이렇게 시도하면 직접 실행하거나 java -jar로 실행할 때 손상된 것으로 보고되는 jar 파일이 생성됩니다.

하나 이상의 zip64 형식 중첩 jar를 포함하는 표준 형식의 jar 파일은 완전히 실행 가능할 수 있습니다.

Maven으로 '완전히 실행 가능한' jar를 만들려면 다음 플러그인 구성을 사용합니다:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

다음 예제는 동등한 Gradle 구성을 보여줍니다:

tasks.named('bootJar') {
    launchScript()
}

그런 다음 표준 start, stop, restartstatus 명령을 지원하기 위해 init.d에 심볼릭 링크를 만들 수 있습니다.

완전히 실행 가능한 jar에 추가되는 기본 실행 스크립트는 대부분의 Linux 배포판을 지원하며 CentOS와 Ubuntu에서 테스트되었습니다.

OS X 및 FreeBSD와 같은 다른 플랫폼에서는 사용자 정의 스크립트를 사용해야 합니다.

기본 스크립트는 다음 기능을 지원합니다:

  • jar 파일을 소유한 사용자로 서비스를 시작합니다
  • /var/run/<appname>/<appname>.pid를 사용하여 애플리케이션의 PID를 추적합니다
  • /var/log/<appname>.log에 콘솔 로그를 기록합니다

/var/myapp에 설치된 Spring Boot 애플리케이션이 있다고 가정하면, Spring Boot 애플리케이션을 init.d 서비스로 설치하려면 다음과 같이 심볼릭 링크를 만듭니다:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

설치가 완료되면 일반적인 방법으로 서비스를 시작하고 중지할 수 있습니다.

예를 들어 Debian 기반 시스템에서는 다음 명령으로 시작할 수 있습니다:

$ service myapp start

애플리케이션이 시작되지 않으면 /var/log/<appname>.log에 작성된 로그 파일에서 오류를 확인하십시오.

표준 운영 체제 도구를 사용하여 애플리케이션이 자동으로 시작되도록 플래그를 지정할 수도 있습니다.

예를 들어 Debian에서는 다음 명령을 사용할 수 있습니다:

$ update-rc.d myapp defaults <priority>

Securing an init.d Service

다음은 init.d 서비스로 실행되는 Spring Boot 애플리케이션을 보호하는 방법에 대한 지침입니다.

애플리케이션과 실행 환경을 강화하기 위해 수행해야 하는 모든 것의 포괄적인 목록이 되도록 의도된 것은 아닙니다.

init.d 서비스를 시작하기 위해 root가 사용되는 경우와 같이 root로 실행될 때 기본 실행 스크립트는 RUN_AS_USER 환경 변수에 지정된 사용자로 애플리케이션을 실행합니다.

환경 변수가 설정되지 않은 경우 jar 파일을 소유한 사용자가 대신 사용됩니다.

Spring Boot 애플리케이션을 root로 실행해서는 안 되므로 RUN_AS_USER는 절대 root가 되어서는 안 되며 애플리케이션의 jar 파일은 절대 root가 소유해서는 안 됩니다.

대신 애플리케이션을 실행할 특정 사용자를 만들고 RUN_AS_USER 환경 변수를 설정하거나 다음 예제와 같이 chown을 사용하여 jar 파일의 소유자로 만듭니다:

$ chown bootapp:bootapp your-app.jar

이 경우 기본 실행 스크립트는 bootapp 사용자로 애플리케이션을 실행합니다.

애플리케이션의 사용자 계정이 손상될 가능성을 줄이려면 로그인 셸을 사용하지 못하도록 하는 것을 고려해야 합니다.

예를 들어 계정의 셸을 /usr/sbin/nologin으로 설정할 수 있습니다.

또한 애플리케이션의 jar 파일 수정을 방지하기 위한 조치를 취해야 합니다.

먼저 다음 예제와 같이 쓸 수 없고 소유자만 읽거나 실행할 수 있도록 권한을 구성합니다:

$ chmod 500 your-app.jar

둘째, 애플리케이션이나 실행 중인 계정이 손상된 경우 피해를 제한하기 위한 조치도 취해야 합니다.

공격자가 접근 권한을 얻으면 jar 파일을 쓰기 가능하게 만들고 내용을 변경할 수 있습니다.

이를 방지하는 한 가지 방법은 다음 예제와 같이 chattr를 사용하여 불변으로 만드는 것입니다:

$ sudo chattr +i your-app.jar

이렇게 하면 root를 포함한 모든 사용자가 jar를 수정할 수 없습니다.

root가 애플리케이션의 서비스를 제어하는 데 사용되고 .conf 파일을 사용하여 시작을 사용자 정의하는 경우 .conf 파일은 root 사용자가 읽고 평가합니다.

따라서 적절하게 보호되어야 합니다.

다음 예제와 같이 chmod를 사용하여 소유자만 파일을 읽을 수 있도록 하고 chown을 사용하여 root를 소유자로 만듭니다:

$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf

Customizing the Startup Script

Maven 또는 Gradle 플러그인에서 작성한 기본 임베디드 시작 스크립트는 여러 가지 방법으로 사용자 정의할 수 있습니다.

대부분의 사람들에게는 기본 스크립트를 몇 가지 사용자 정의와 함께 사용하는 것으로 충분합니다.

필요한 것을 사용자 정의할 수 없는 경우 embeddedLaunchScript 옵션을 사용하여 자체 파일을 완전히 작성하십시오.

Customizing the Start Script When It Is Written

jar 파일에 작성될 때 시작 스크립트의 요소를 사용자 정의하는 것이 종종 합리적입니다.

예를 들어 init.d 스크립트는 "description"을 제공할 수 있습니다.

미리 설명을 알고 있으므로(그리고 변경할 필요가 없으므로) jar가 생성될 때 제공할 수도 있습니다.

작성된 요소를 사용자 정의하려면 Spring Boot Maven 플러그인의 embeddedLaunchScriptProperties 옵션 또는 Spring Boot Gradle 플러그인의 launchScriptproperties 속성을 사용합니다.

다음 속성 대체가 기본 스크립트에서 지원됩니다:

Name Description Gradle default Maven default
mode 스크립트 모드. auto auto
initInfoProvides "INIT INFO"의 Provides 섹션 ${task.baseName} ${project.artifactId}
initInfoRequiredStart "INIT INFO"의 Required-Start 섹션. $remote_fs $syslog $network $remote_fs $syslog $network
initInfoRequiredStop "INIT INFO"의 Required-Stop 섹션. $remote_fs $syslog $network $remote_fs $syslog $network
initInfoDefaultStart "INIT INFO"의 Default-Start 섹션. 2 3 4 5 2 3 4 5
initInfoDefaultStop "INIT INFO"의 Default-Stop 섹션. 0 1 6 0 1 6
initInfoShortDescription "INIT INFO"의 Short-Description 섹션. ${project.description}의 단일 행 버전 (${task.baseName}으로 폴백) ${project.name}
initInfoDescription "INIT INFO"의 Description 섹션. ${project.description} (${task.baseName}으로 폴백) ${project.description} (${project.name}으로 폴백)
initInfoChkconfig "INIT INFO"의 chkconfig 섹션 2345 99 01 2345 99 01
confFolder CONF_FOLDER의 기본값 jar를 포함하는 폴더 jar를 포함하는 폴더
inlinedConfScript 기본 실행 스크립트에 인라인되어야 하는 파일 스크립트에 대한 참조. 외부 구성 파일이 로드되기 전에 JAVA_OPTS와 같은 환경 변수를 설정하는 데 사용할 수 있습니다
logFolder LOG_FOLDER의 기본값. init.d 서비스에만 유효합니다
logFilename LOG_FILENAME의 기본값. init.d 서비스에만 유효합니다
pidFolder PID_FOLDER의 기본값. init.d 서비스에만 유효합니다
pidFilename PID_FOLDER에 있는 PID 파일 이름의 기본값. init.d 서비스에만 유효합니다
useStartStopDaemon start-stop-daemon 명령을 사용할 수 있을 때 프로세스를 제어하는 데 사용해야 하는지 여부 true true
stopWaitTime 초 단위의 STOP_WAIT_TIME 기본값. init.d 서비스에만 유효합니다 60 60
Customizing a Script When It Runs

jar가 작성된 후에 사용자 정의해야 하는 스크립트 항목의 경우 환경 변수 또는 config file을 사용할 수 있습니다.

다음 환경 속성은 기본 스크립트에서 지원됩니다:

Variable Description
MODE 작업 "모드". 기본값은 jar가 빌드된 방식에 따라 다르지만 일반적으로 auto입니다 (즉, init.d라는 디렉토리의 심볼릭 링크인지 확인하여 init 스크립트인지 추측하려고 시도함). `stop
RUN_AS_USER 애플리케이션을 실행하는 데 사용할 사용자. 설정되지 않은 경우 jar 파일을 소유한 사용자가 사용됩니다.
USE_START_STOP_DAEMON start-stop-daemon 명령을 사용할 수 있을 때 프로세스를 제어하는 데 사용해야 하는지 여부. 기본값은 true입니다.
PID_FOLDER pid 폴더의 루트 이름 (기본값은 /var/run).
LOG_FOLDER 로그 파일을 넣을 폴더의 이름 (기본값은 /var/log).
CONF_FOLDER .conf 파일을 읽을 폴더의 이름 (기본값은 jar 파일과 동일한 폴더).
LOG_FILENAME LOG_FOLDER의 로그 파일 이름 (기본값은 <appname>.log).
APP_NAME 앱의 이름. jar가 심볼릭 링크에서 실행되는 경우 스크립트는 앱 이름을 추측합니다. 심볼릭 링크가 아니거나 앱 이름을 명시적으로 설정하려는 경우 유용할 수 있습니다.
RUN_ARGS 프로그램에 전달할 인수 (Spring Boot 앱).
JAVA_HOME java 실행 파일의 위치는 기본적으로 PATH를 사용하여 검색되지만 $JAVA_HOME/bin/java에 실행 파일이 있는 경우 명시적으로 설정할 수 있습니다.
JAVA_OPTS JVM이 시작될 때 전달되는 옵션.
JARFILE jar 파일의 명시적 위치. 스크립트가 실제로 포함되지 않은 jar를 시작하는 데 사용되는 경우입니다.
DEBUG 비어 있지 않으면 셸 프로세스에 -x 플래그를 설정하여 스크립트의 로직을 볼 수 있습니다.
STOP_WAIT_TIME 애플리케이션을 중지할 때 강제 종료하기 전에 대기하는 시간(초) (기본값은 60).

PID_FOLDER, LOG_FOLDERLOG_FILENAME 변수는 init.d 서비스에만 유효합니다.

systemd의 경우 'service' 스크립트를 사용하여 동등한 사용자 정의가 이루어집니다.

자세한 내용은 service unit configuration man page를 참조하십시오.

Using a Conf File

JARFILEAPP_NAME을 제외하고 앞의 섹션에 나열된 설정은 .conf 파일을 사용하여 구성할 수 있습니다.

이 파일은 jar 파일 옆에 있어야 하며 .jar가 아닌 .conf로 접미사가 붙은 동일한 이름을 가져야 합니다.

예를 들어 /var/myapp/myapp.jar라는 이름의 jar는 다음 예제와 같이 /var/myapp/myapp.conf라는 이름의 구성 파일을 사용합니다:

myapp.conf

JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder

구성 파일을 jar 파일 옆에 두는 것을 원하지 않는 경우 CONF_FOLDER 환경 변수를 설정하여 구성 파일의 위치를 사용자 정의할 수 있습니다.

이 파일을 적절하게 보호하는 방법에 대해 알아보려면 the guidelines for securing an init.d service를 참조하십시오.

Microsoft Windows Services

Spring Boot 애플리케이션은 winsw를 사용하여 Windows 서비스로 시작할 수 있습니다.

별도로 유지 관리되는 샘플은 Spring Boot 애플리케이션용 Windows 서비스를 만드는 방법을 단계별로 설명합니다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유