[service] 서비스로서의 스프링 부트 어플리케이션

리눅스 시스템에서 서비스로 실행 가능한 jar로 패키지 된 Spring Boot 응용 프로그램을 구성하는 방법은 무엇입니까? 이것이 권장되는 접근법입니까, 아니면이 응용 프로그램을 전쟁으로 변환하고 Tomcat에 설치해야합니까?

현재 스프링 부트 응용 프로그램을 screen세션 에서 실행할 수 있습니다 .하지만 서버 재부팅 후 수동 시작이 필요합니다.

내가 찾고있는 것은 init.d실행 가능한 jar 로의 접근 방식 이 적절한 경우 일반적인 조언 / 방향 또는 샘플 스크립트 입니다.



답변

다음은 springboot 1.3 이상에서 작동합니다.

init.d 서비스로

실행 가능한 jar에는 일반적인 시작, 중지, 다시 시작 및 상태 명령이 있습니다. 또한 일반적인 / var / run 디렉토리에 PID 파일을 설정하고 기본적으로 일반적인 / var / log 디렉토리에 로깅합니다.

항아리를 /etc/init.d에 심볼릭 링크하면됩니다.

sudo link -s /var/myapp/myapp.jar /etc/init.d/myapp

또는

sudo ln -s ~/myproject/build/libs/myapp-1.0.jar /etc/init.d/myapp_servicename

그 후 평소에 할 수 있습니다

/etc/init.d/myapp start

그런 다음 원하는 경우 부팅시 앱을 시작 / 중지하려는 실행 수준의 링크를 설정하십시오.


체계적인 서비스로서

var / myapp에 설치된 Spring Boot 응용 프로그램을 실행하려면 /etc/systemd/system/myapp.service에 다음 스크립트를 추가 할 수 있습니다.

[Unit]
Description=myapp
After=syslog.target

[Service]
ExecStart=/var/myapp/myapp.jar

[Install]
WantedBy=multi-user.target

주의 :이 방법을 사용하는 경우 jar 파일 자체를 실행 가능하게 만드는 것을 잊지 마십시오 (chmod + x 사용). 그렇지 않으면 “Permission denied”오류와 함께 실패합니다.

참고

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-service


답변

다음은 Linux에서 시스템 서비스로 Java 애플리케이션을 설치하는 가장 쉬운 방법입니다.

systemd현재 현대 배포판에서 사용하고 있다고 가정 해 봅시다 .

먼저 다음 과 같은 /etc/systemd/system이름 으로 서비스 파일을 작성하십시오 javaservice.service.

[Unit]
Description=Java Service

[Service]
User=nobody
# The configuration file application.properties should be here:
WorkingDirectory=/data
ExecStart=/usr/bin/java -Xmx256m -jar application.jar --server.port=8081
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

둘째, systemd새 서비스 파일을 통지 하십시오.

systemctl daemon-reload

활성화하면 부팅시 실행됩니다.

systemctl enable javaservice.service

결국 다음 명령을 사용하여 새 서비스를 시작 / 중지 할 수 있습니다.

systemctl start javaservice
systemctl stop javaservice
systemctl restart javaservice
systemctl status javaservice

을 사용 systemd하는 경우 Java 응용 프로그램을 시스템 서비스로 설정하는 가장 비 침입적이고 깨끗한 방법입니다.

이 솔루션에서 특히 마음에 드는 점은 다른 소프트웨어를 설치하고 구성 할 필요가 없다는 것입니다. 배송 systemd은 모든 작업을 수행하며 서비스는 다른 시스템 서비스처럼 작동합니다. 나는 다른 배포판에서 지금 당분간 프로덕션에서 사용하며 예상대로 작동합니다.

또 다른 장점은을 사용 하여과 같은 매개 변수를 /usr/bin/java쉽게 추가 할 수 있다는 jvm-Xmx256m입니다.

systemd공식 스프링 부트 문서 에서이 부분을 읽어보십시오 :
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html


답변

또한 매우 편리한 데몬 인 supervisord 를 사용하여 서비스를 쉽게 제어 할 수 있습니다. 이러한 서비스는 어떤 디렉토리에서 어떤 사용자와 함께 실행할 것인지 정의하는 간단한 구성 파일로 정의됩니다. supervisord 는 매우 간단한 구문을 사용하므로 SysV init 스크립트 작성을 대체 할 수 있습니다.

실행 / 제어하려는 프로그램에 대한 간단한 감독자 구성 파일입니다. ( /etc/supervisor/conf.d/yourapp.conf에습니다 )

/etc/supervisor/conf.d/yourapp.conf

[program:yourapp]
command=/usr/bin/java -jar /path/to/application.jar
user=usertorun
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/yourapp-stdout.log
stderr_logfile=/var/log/yourapp-stderr.log

응용 프로그램을 제어하려면 supervisorctl 을 실행해야합니다 . 그러면 app을 시작, 중지 및 상태로 설정할 수있는 프롬프트가 표시됩니다.

CLI

# sudo supervisorctl
yourapp             RUNNING   pid 123123, uptime 1 day, 15:00:00
supervisor> stop yourapp
supervisor> start yourapp

경우 supervisord데몬이 이미 실행되고, 당신은 당신이 간단하게 할 수있는 데몬을 다시 시작하지 않고 당신의 serivce에 대한 구성을 추가 한 rereadupdate에 명령을 supervisorctl쉘을.

이를 통해 SysV Init 스크립트를 사용하는 모든 융통성을 제공하지만 사용 및 제어가 쉽습니다. 설명서를 살펴보십시오 .


답변

방금 직접이 작업을 수행 했으므로 CentOS init.d 서비스 컨트롤러 스크립트 측면에서 지금까지는 다음과 같습니다. 지금까지 꽤 잘 작동하고 있지만 Bash 해커는 아니므로 개선의 여지가 있다고 확신하므로 개선에 대한 생각은 환영합니다.

우선, /data/svcmgmt/conf/my-spring-boot-api.sh각 서비스마다 환경 변수를 설정 하는 간단한 구성 스크립트 가 있습니다.

#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_05/jre
export APP_HOME=/data/apps/my-spring-boot-api
export APP_NAME=my-spring-boot-api
export APP_PORT=40001

CentOS를 사용하고 있으므로 서버를 다시 시작한 후 서비스를 시작하려면 서비스 제어 스크립트가 있습니다 /etc/init.d/my-spring-boot-api.

#!/bin/bash
# description: my-spring-boot-api start stop restart
# processname: my-spring-boot-api
# chkconfig: 234 20 80

. /data/svcmgmt/conf/my-spring-boot-api.sh

/data/svcmgmt/bin/spring-boot-service.sh $1

exit 0

보다시피, 초기 설정 스크립트를 호출하여 환경 변수를 설정 한 다음 모든 Spring Boot 서비스를 다시 시작하는 데 사용하는 공유 스크립트를 호출합니다. 그 공유 스크립트는 그것의 고기를 모두 찾을 수있는 곳입니다 :

#!/bin/bash

echo "Service [$APP_NAME] - [$1]"

echo "    JAVA_HOME=$JAVA_HOME"
echo "    APP_HOME=$APP_HOME"
echo "    APP_NAME=$APP_NAME"
echo "    APP_PORT=$APP_PORT"

function start {
    if pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    then
        echo "Service [$APP_NAME] is already running. Ignoring startup request."
        exit 1
    fi
    echo "Starting application..."
    nohup $JAVA_HOME/bin/java -jar $APP_HOME/$APP_NAME.jar \
        --spring.config.location=file:$APP_HOME/config/   \
        < /dev/null > $APP_HOME/logs/app.log 2>&1 &
}

function stop {
    if ! pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    then
        echo "Service [$APP_NAME] is not running. Ignoring shutdown request."
        exit 1
    fi

    # First, we will try to trigger a controlled shutdown using
    # spring-boot-actuator
    curl -X POST http://localhost:$APP_PORT/shutdown < /dev/null > /dev/null 2>&1

    # Wait until the server process has shut down
    attempts=0
    while pkill -0 -f $APP_NAME.jar > /dev/null 2>&1
    do
        attempts=$[$attempts + 1]
        if [ $attempts -gt 5 ]
        then
            # We have waited too long. Kill it.
            pkill -f $APP_NAME.jar > /dev/null 2>&1
        fi
        sleep 1s
    done
}

case $1 in
start)
    start
;;
stop)
    stop
;;
restart)
    stop
    start
;;
esac
exit 0

중지하면 Spring Boot Actuator를 사용하여 제어 된 종료를 시도합니다. 그러나 Actuator가 구성되지 않았거나 합리적인 시간 내에 종료되지 않으면 (실제로 5 초, 약간 짧음) 프로세스가 종료됩니다.

또한 스크립트는 응용 프로그램을 실행하는 Java 프로세스가 프로세스 세부 정보 텍스트에 “my-spring-boot-api.jar”이있는 유일한 프로세스라고 가정합니다. 이것은 내 환경에서 안전한 가정이며 PID를 추적 할 필요가 없음을 의미합니다.


답변

Spring Boot Maven Plugin 1.3.0.M2와 함께 Spring Boot 1.2.5를 사용하려는 경우 해결책은 다음과 같습니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
</parent>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.3.0.M2</version>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

<pluginRepositories>
    <pluginRepository>
        <id>spring-libs-milestones</id>
        <url>http://repo.spring.io/libs-milestone</url>
    </pluginRepository>
</pluginRepositories>

그런 다음 ususal :으로 컴파일 mvn clean package하고 symlink ln -s /.../myapp.jar /etc/init.d/myapp를 만들고 실행 가능하게 chmod +x /etc/init.d/myapp만들고 시작하십시오 service myapp start(Ubuntu Server 사용)


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 appassembler-maven-plugin 인 또 다른 방법을 제시하고 싶었다 . 유용한 추가 옵션 값이 많이 포함 된 POM 관련 부분은 다음과 같습니다.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <configuration>
        <generateRepository>true</generateRepository>
        <repositoryLayout>flat</repositoryLayout>
        <useWildcardClassPath>true</useWildcardClassPath>
        <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath>
        <configurationDirectory>config</configurationDirectory>
        <target>${project.build.directory}</target>
        <daemons>
            <daemon>
                <id>${installer-target}</id>
                <mainClass>${mainClass}</mainClass>
                <commandLineArguments>
                    <commandLineArgument>--spring.profiles.active=dev</commandLineArgument>
                    <commandLineArgument>--logging.config=${rpmInstallLocation}/config/${installer-target}-logback.xml</commandLineArgument>
                </commandLineArguments>
                <platforms>
                    <platform>jsw</platform>
                </platforms>
                <generatorConfigurations>
                    <generatorConfiguration>
                        <generator>jsw</generator>
                        <includes>
                            <include>linux-x86-64</include>
                        </includes>
                        <configuration>
                            <property>
                                <name>wrapper.logfile</name>
                                <value>logs/${installer-target}-wrapper.log</value>
                            </property>
                            <property>
                                <name>wrapper.logfile.maxsize</name>
                                <value>5m</value>
                            </property>
                            <property>
                                <name>run.as.user.envvar</name>
                                <value>${serviceUser}</value>
                            </property>
                            <property>
                                <name>wrapper.on_exit.default</name>
                                <value>RESTART</value>
                            </property>
                        </configuration>
                    </generatorConfiguration>
                </generatorConfigurations>
                <jvmSettings>
                    <initialMemorySize>256M</initialMemorySize>
                    <maxMemorySize>1024M</maxMemorySize>
                    <extraArguments>
                        <extraArgument>-server</extraArgument>
                    </extraArguments>
                </jvmSettings>
            </daemon>
        </daemons>
    </configuration>
    <executions>
        <execution>
            <id>generate-jsw-scripts</id>
            <phase>package</phase>
            <goals>
                <goal>generate-daemons</goal>
            </goals>
        </execution>
    </executions>
</plugin>


답변

WINDOWS 서비스로서

이 작업을 Windows 컴퓨터에서 실행하려면 다음 위치에서 winsw.exe를 다운로드하십시오.

 http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/2.1.2/

그 이름을 jar 파일 이름으로 바꿉니다 (예 : your-app .jar).

winsw.exe -> your-app.exe

이제 your-app.xml xml 파일을 만들고 다음 내용을 복사하십시오.

<?xml version="1.0" encoding="UTF-8"?>
<service>
     <id>your-app</id>
     <name>your-app</name>
     <description>your-app as a Windows Service</description>
     <executable>java</executable>
     <arguments>-jar "your-app.jar"</arguments>
     <logmode>rotate</logmode>
</service>

exexmljar 와 함께 같은 폴더에 있는지 확인하십시오 .

관리자 권한에서이 명령 프롬프트를 열고 Windows 서비스에 설치하십시오.

your-app.exe install
eg -> D:\Springboot\your-app.exe install

실패하면

Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' has value '1.8', but '1.7' is required.

그런 다음 다음을 시도하십시오.

Delete java.exe, javaw.exe and javaws.exe from C:\Windows\System32

그게 다야 :).

Windows에서 서비스를 제거하려면

your-app.exe uninstall

서비스보기 / 실행 / 중지 :
win + r 을 입력하고 관리 도구 를 입력 한 후 서비스 를 선택하십시오 . 그런 다음 마우스 오른쪽 버튼을 클릭 하여 옵션을 선택하십시오 -실행 / 중지