跳到主要内容

安装 Spring Boot 应用程序

DeepSeek V3 中英对照 Installing Spring Boot Applications

除了直接使用 java -jar 运行 Spring Boot 应用程序外,还可以将其作为 systemdinit.d 或 Windows 服务运行。

作为 systemd 服务安装

systemd 是 System V 初始化系统的继任者,现在已被许多现代 Linux 发行版所采用。Spring Boot 应用程序可以通过使用 systemd 的“服务”脚本来启动。

假设你有一个 Spring Boot 应用程序打包为 uber jar,位于 /var/myapp 目录下,要将其安装为 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
none
important

请记得为你的应用程序更改 DescriptionUserGroupExecStartWorkingDirectory 字段。

备注

ExecStart 字段未声明脚本操作命令,这意味着默认使用 run 命令。

运行应用程序的用户、PID 文件和控制台日志文件由 systemd 自身管理,因此必须通过在 ‘service’ 脚本中使用适当的字段进行配置。更多详细信息,请参阅 service unit 配置手册页

要在系统启动时自动启动应用程序,请使用以下命令:

$ systemctl enable myapp.service
shell

运行 man systemctl 以获取更多详情。

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

要将您的应用程序用作 init.d 服务,请配置其构建以生成完全可执行的 jar

警告

完全可执行的 jar 文件通过在文件头部嵌入一个额外的脚本实现。目前,一些工具不接受这种格式,因此你可能无法总是使用这种技术。例如,jar -xf 可能会在提取一个已经设置为完全可执行的 jar 或 war 文件时静默失败。建议你仅在打算直接执行 jar 或 war 文件时,才将其设置为完全可执行,而不是使用 java -jar 运行它或将其部署到 servlet 容器中。

警告

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>
xml

以下示例展示了等效的 Gradle 配置:

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

然后可以将其符号链接到 init.d 以支持标准的 startstoprestartstatus 命令。

默认添加到完全可执行 jar 包中的启动脚本支持大多数 Linux 发行版,并在 CentOS 和 Ubuntu 上进行了测试。其他平台,如 OS X 和 FreeBSD,需要使用自定义脚本。默认脚本支持以下功能:

  • 以拥有 jar 文件的用户身份启动服务

  • 使用 /var/run/<appname>/<appname>.pid 跟踪应用程序的 PID

  • 将控制台日志写入 /var/log/<appname>.log

假设你的 Spring Boot 应用程序已安装在 /var/myapp 目录中,要将 Spring Boot 应用程序安装为 init.d 服务,请按如下方式创建一个符号链接:

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

安装完成后,你可以以常规方式启动和停止服务。例如,在基于 Debian 的系统上,你可以使用以下命令启动它:

$ service myapp start
shell
提示

如果您的应用程序启动失败,请检查写入 /var/log/<appname>.log 的日志文件以查找错误。

你也可以使用标准的操作系统工具来设置应用程序自动启动。例如,在 Debian 系统上,你可以使用以下命令:

$ update-rc.d myapp defaults <priority>
shell

保护 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
shell

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

提示

为了减少应用程序用户账户被攻破的可能性,您应该考虑阻止其使用登录 shell。例如,您可以将账户的 shell 设置为 /usr/sbin/nologin

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

$ chmod 500 your-app.jar
shell

其次,如果您的应用程序或运行它的账户遭到入侵,您还应采取措施限制损失。如果攻击者确实获得了访问权限,他们可能会使 jar 文件可写并更改其内容。防止这种情况的一种方法是使用 chattr 使其不可变,如下例所示:

$ sudo chattr +i your-app.jar
shell

这将防止任何用户(包括 root)修改该 jar 文件。

如果使用 root 用户来控制应用程序的服务,并且你使用 .conf 文件来自定义其启动,那么该 .conf 文件将由 root 用户读取和评估。因此,应该相应地对其进行保护。使用 chmod 确保该文件只能由所有者读取,并使用 chown 将 root 设为所有者,如下例所示:

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

自定义启动脚本

由 Maven 或 Gradle 插件编写的默认嵌入式启动脚本可以通过多种方式进行自定义。对于大多数人来说,使用默认脚本并配合一些自定义设置通常就足够了。如果你发现无法自定义你所需的内容,可以使用 embeddedLaunchScript 选项完全编写你自己的文件。

自定义启动脚本的编写时机

将启动脚本中的元素自定义为写入 jar 文件的形式通常是有意义的。例如,init.d 脚本可以提供“描述”。由于你提前知道描述(且不需要更改),因此可以在生成 jar 文件时提供它。

要自定义写入的元素,请使用 Spring Boot Maven 插件的 embeddedLaunchScriptProperties 选项或 Spring Boot Gradle 插件的 launchScript 的 properties 属性

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

名称描述Gradle 默认值Maven 默认值
mode脚本模式autoauto
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 52 3 4 5
initInfoDefaultStop“INIT INFO” 的 Default-Stop 部分0 1 60 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 012345 99 01
confFolderCONF_FOLDER 的默认值包含 jar 文件的文件夹包含 jar 文件的文件夹
inlinedConfScript引用应内联到默认启动脚本中的文件脚本。这可以用于在加载任何外部配置文件之前设置环境变量,例如 JAVA_OPTS
logFolderLOG_FOLDER 的默认值。仅对 init.d 服务有效
logFilenameLOG_FILENAME 的默认值。仅对 init.d 服务有效
pidFolderPID_FOLDER 的默认值。仅对 init.d 服务有效
pidFilenamePID_FOLDER 中 PID 文件名称的默认值。仅对 init.d 服务有效
useStartStopDaemonstart-stop-daemon 命令可用时,是否应使用它来控制进程truetrue
stopWaitTimeSTOP_WAIT_TIME 的默认值(以秒为单位)。仅对 init.d 服务有效6060

在脚本运行时自定义脚本

对于需要在 jar 文件写入后自定义的脚本项,你可以使用环境变量或配置文件

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

变量描述
MODE操作的“模式”。默认值取决于 jar 文件的构建方式,但通常为 auto(意味着它会通过检查是否在名为 init.d 的目录中的符号链接来猜测是否为初始化脚本)。您可以显式地将其设置为 service,以便 `stopstartstatusrestart命令正常工作,或者设置为run` 如果您希望在前台运行脚本。
RUN_AS_USER用于运行应用程序的用户。如果未设置,则将使用拥有 jar 文件的用户。
USE_START_STOP_DAEMON是否应使用 start-stop-daemon 命令(当可用时)来控制进程。默认为 true
PID_FOLDERpid 文件夹的根名称(默认为 /var/run)。
LOG_FOLDER用于存放日志文件的文件夹名称(默认为 /var/log)。
CONF_FOLDER从中读取 .conf 文件的文件夹名称(默认为与 jar 文件相同的文件夹)。
LOG_FILENAMELOG_FOLDER 中的日志文件名称(默认为 <appname>.log)。
APP_NAME应用程序的名称。如果 jar 文件是从符号链接运行的,脚本会猜测应用程序名称。如果不是符号链接或您想显式设置应用程序名称,这可能很有用。
RUN_ARGS传递给程序(Spring Boot 应用程序)的参数。
JAVA_HOMEjava 可执行文件的位置默认通过 PATH 发现,但如果有可执行文件位于 $JAVA_HOME/bin/java,您可以显式设置它。
JAVA_OPTS启动 JVM 时传递给它的选项。
JARFILEjar 文件的显式位置,以防脚本用于启动未实际嵌入的 jar 文件。
DEBUG如果不为空,则在 shell 进程上设置 -x 标志,允许您查看脚本中的逻辑。
STOP_WAIT_TIME在强制关闭应用程序之前等待的时间(以秒为单位,默认为 60)。
备注

PID_FOLDERLOG_FOLDERLOG_FILENAME 变量仅对 init.d 服务有效。对于 systemd,通过使用 service 脚本进行等效的自定义配置。更多详细信息请参阅 service unit 配置手册页

使用配置文件

除了 JARFILEAPP_NAME 之外,前面列出的设置都可以通过使用 .conf 文件进行配置。该文件应位于 jar 文件旁边,并且具有相同的名称,但后缀为 .conf 而不是 .jar。例如,名为 /var/myapp/myapp.jar 的 jar 文件使用名为 /var/myapp/myapp.conf 的配置文件,如下例所示:

JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
properties
提示

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

要了解如何正确保护此文件,请参阅保护 init.d 服务的指南

Microsoft Windows 服务

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

一个单独维护的示例详细描述了如何为你的 Spring Boot 应用程序创建 Windows 服务。