24小时在线平台

当前位置: 24小时在线平台 > 部署教程大全 > 文章页

部署Spring Boot应用

时间:2025-05-11 13:21来源: 作者:admin 点击: 29 次
SPRINGDOC.CN 提供Spring Boot官方文档的翻译服务,可以方便你快速阅读中文版官方文档。

除了通过使用 java -jar 运行Spring Boot应用程序外,还可以为Unix系统制作完全可执行的应用程序。完全可执行的jar可以像其他可执行的二进制文件一样执行,也可以。这有助于在普通生产环境中安装和管理Spring Boot应用程序。

  完全可执行的jar通过在文件的前面嵌入一个额外的脚本来工作。目前,有些工具不接受这种格式,所以你不一定能使用这种技术。例如,jar -xf 可能会默默地无法提取一个已经被做成完全可执行的jar或war文件。建议你只有在打算直接执行你的jar或war,而不是用 java -jar 运行它或将它部署到servlet容器中时,才使它完全可执行。  

  一个zip64格式的jar文件不能被完全执行。 试图这样做会导致jar文件在直接执行或使用 java -jar 时被报告为损坏。 一个标准格式的jar文件包含一个或多个zip64格式的嵌套jar,可以完全执行。  

要用Maven创建一个 ‘fully executable’ (完全可执行的)jar,请使用以下插件配置。

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

下面的例子显示了相当于Gradle的配置。

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

然后你可以通过输入 ./my-application.jar (其中 my-application 是你的artifact的名称)来运行你的应用程序。 包含jar的目录将作为你的应用程序的工作目录。

2.1. 支持的操作系统

默认脚本支持大多数Linux发行版,并在CentOS和Ubuntu上测试。 其他平台,如OS X和FreeBSD,需要使用一个自定义的 embeddedLaunchScript。

2.2. Unix/Linux 服务

通过使用 init.d 或 systemd,Spring Boot应用程序可以很容易地作为Unix/Linux服务启动。

2.2.1. 作为 init.d 服务安装 (System V)

如果你将Spring Boot的Maven或Gradle插件配置为生成 ,并且不使用自定义的 embeddedLaunchScript,你的应用程序就可以作为 init.d 服务使用。为此,将jar链接到 init.d,以支持标准的 start、 stop、 restart`和 `status 命令。

该脚本支持以下功能。

以拥有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>

确保 init.d 服务的安全

  以下是一套关于如何保护作为init.d服务运行的Spring Boot应用程序的指南。 它并不打算成为一份详尽的清单,列出为加固应用程序及其运行环境所应做的一切。  

当以root身份执行时,如root被用来启动init.d服务时,默认的可执行脚本会以 RUN_AS_USER 环境变量中指定的用户身份运行应用程序。当环境变量没有设置时,会使用拥有jar文件的用户来代替。你不应该以root身份运行Spring Boot应用程序,所以 RUN_AS_USER 永远不应该是 root,你的应用程序的jar文件也不应该由root拥有。相反,创建一个特定的用户来运行你的应用程序,并设置 RUN_AS_USER 环境变量或使用 chown 来使其成为jar文件的所有者,如下例所示。

$ chown bootapp:bootapp your-app.jar

在这种情况下,默认的可执行脚本以 bootapp 用户身份运行该应用程序。

  为了减少应用程序的用户账户被入侵的机会,你应该考虑防止它使用登录的shell。 例如,你可以将账户的shell设置为 /usr/sbin/nologin。  

你还应该采取措施,防止你的应用程序的jar文件被修改。 首先,配置其权限,使其不能被写入,只能由其所有者读取或执行,如下面的例子所示。

$ chmod 500 your-app.jar

第二,如果你的应用程序或运行该程序的账户被破坏,你也应该采取措施限制损失。 如果一个攻击者获得了访问权,他们可以使jar文件可写并改变其内容。 防止这种情况的方法之一是通过使用 chattr 使其不可更改,如下面的例子所示。

$ sudo chattr +i your-app.jar

这将防止任何用户,包括root,修改jar。

如果root被用来控制应用程序的服务,并且你 来定制它的启动,那么 .conf 文件会被root用户读取和评估。它应该被相应地保护起来。使用 chmod 使该文件只能由所有者读取,并使用 chown 使root成为所有者,如下面的例子所示。

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

2.2.2. 作为 systemd 服务安装

systemd 是System V init系统的后继者,现在很多现代Linux发行版都在使用。 虽然你可以继续使用 init.d 脚本与 systemd,但也可以通过使用 systemd ‘service’ 脚本来启动Spring Boot应用程序。

假设你在 /var/myapp 中安装了一个Spring Boot应用,要把Spring Boot应用安装成 systemd 服务,需要创建一个名为 myapp.service 的脚本,并把它放在 /etc/systemd/system 目录下。 下面的脚本提供了一个例子。

[Unit] Description=myapp After=syslog.target [Service] User=myapp ExecStart=/var/myapp/myapp.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target

  记得为你的应用程序改变 Description、User 和 ExecStart 字段。  

  ExecStart 字段没有声明脚本的动作命令,这意味着默认使用 run 命令。  

注意,与作为 init.d 服务运行时不同,运行应用程序的用户、PID 文件和控制台日志文件由 systemd 自己管理,因此必须在 ‘service’ 脚本中使用适当的字段进行配置。更多细节请参考 服务单元配置手册。

要想标记应用程序在系统启动时自动启动,请使用以下命令。

$ systemctl enable myapp.service

运行 man systemctl 以了解更多细节。

2.2.3. 定制启动脚本

由Maven或Gradle插件编写的默认嵌入式启动脚本可以通过多种方式定制。 对大多数人来说,使用默认脚本和一些定制的脚本通常就足够了。 如果你发现无法定制你需要的东西,可以使用 embeddedLaunchScript 选项,完全编写你自己的文件。

编写开始脚本时的定制

在写进jar文件时,定制启动脚本的元素往往是有意义的。 例如,init.d脚本可以提供一个 “description”。 既然你预先知道了描述(而且不需要改变),你也可以在生成jar时提供它。

要自定义写入的元素,请使用Spring Boot Maven插件的 embeddedLaunchScriptProperties 选项或 。

默认脚本支持以下属性替换。

Name 说明 Gradle 默认 Maven 默认

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 部分。

 

Single-line version of ${project.description} (falling back to ${task.baseName})

 

${project.name}

 

initInfoDescription

 

“INIT INFO” 的 Description 部分。

 

${project.description} (falling back to ${task.baseName})

 

${project.description} (falling back to ${project.name})

 

initInfoChkconfig

 

“INIT INFO” 的 chkconfig 部分

 

2345 99 01

 

2345 99 01

 

confFolder

 

CONF_FOLDER 的默认值。

 

Folder containing the jar

 

Folder containing the jar

 

inlinedConfScript

 

对一个文件脚本的引用,该脚本应被内联到默认的启动脚本中。这可以用来在加载任何外部配置文件之前设置环境变量,如 JAVA_OPTS。

     

logFolder

 

LOG_FOLDER 的默认值。 Only valid for an init.d service

     

logFilename

 

LOG_FILENAME 的默认值。 Only valid for an init.d service

     

pidFolder

 

PID_FOLDER 的默认值。 Only valid for an init.d service

     

pidFilename

 

PID_FOLDER 中的PID文件名的默认值。 只对 init.d 服务有效。

     

useStartStopDaemon

 

当 start-stop-daemon 命令可用时,是否应使用该命令来控制进程。

 

true

 

true

 

stopWaitTime

 

STOP_WAIT_TIME 的默认值(秒)。 只对 init.d 服务有效。

 

60

 

60

 

脚本运行时的自定义

对于脚本中需要在写完jar后进行定制的项目,你可以使用环境变量或。

默认脚本支持以下环境属性。

Variable 说明

MODE

 

操作的 “mode”。 默认情况取决于jar的构建方式,但通常是 auto(自动)(意味着它试图通过检查它是否是一个名为 init.d 目录下的符号链接来猜测它是否是一个init脚本)。 你可以明确地把它设置为 service,这样 stop|start|status|restart 命令就会起作用,如果你想在前台运行脚本,就可以设置为 run。

 

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-file相同)。

 

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

 

如果不是空的,在shell进程中设置 -x 标志,允许你看到脚本中的逻辑。

 

STOP_WAIT_TIME

 

停止应用程序时,在强制关机前等待的时间(以秒为单位)(默认为 60)。

 

  PID_FOLDER、LOG_FOLDER 和 LOG_FILENAME 变量只对 init.d 服务有效。对于 systemd 来说,相应的自定义变量可以通过 ‘service’ 脚本来实现。更多细节请参见 服务单元配置手册。  

除了 JARFILE 和 APP_NAME 之外,上一节列出的设置可以通过使用 .conf 文件进行配置。 这个文件应该在jar文件的旁边,并且有相同的名字,但后缀是 .conf 而不是 .jar。 例如,一个名为 /var/myapp/myapp.jar 的jar文件使用名为 /var/myapp/myapp.conf 的配置文件,如以下例子所示。

myapp.conf

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

  如果你不喜欢把配置文件放在jar文件旁边,你可以设置一个 CONF_FOLDER 环境变量来定制配置文件的位置。  

要了解如何适当地保护这个文件,请参阅。

2.3. 微软的Windows服务

通过使用 winsw,Spring Boot应用程序可以作为一个Windows服务启动。

这篇文章( 单独保存的样本)介绍了如何为Spring Boot应用程序创建一个Windows服务的步骤。

(责任编辑:)
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2025-07-03 23:07 最后登录:2025-07-03 23:07
栏目列表
推荐内容