리눅스 시스템에서 서비스로 실행 가능한 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”오류와 함께 실패합니다.
참고
답변
다음은 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에 대한 구성을 추가 한 reread
및 update
에 명령을 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>
exe 와 xml 이 jar 와 함께 같은 폴더에 있는지 확인하십시오 .
관리자 권한에서이 명령 프롬프트를 열고 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 을 입력하고 관리 도구 를 입력 한 후 서비스 를 선택하십시오 . 그런 다음 마우스 오른쪽 버튼을 클릭 하여 옵션을 선택하십시오 -실행 / 중지