此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-doc.cadn.net.cn

安装 Spring Boot 应用程序

除了使用 Spring Boot 应用程序运行 Spring Boot 应用程序java -jar也可以将它们作为systemd,init.d或 Windows 服务。spring-doc.cadn.net.cn

作为 systemd 服务安装

systemd是 System V init 系统的后继者,现在被许多现代 Linux 发行版使用。 Spring Boot 应用程序可以使用systemd'service' 脚本。spring-doc.cadn.net.cn

假设您有一个 Spring Boot 应用程序打包为 uber jar/var/myapp,将其安装为systemdservice 中,创建一个名为myapp.service并将其放入/etc/systemd/system目录。 以下脚本提供了一个示例:spring-doc.cadn.net.cn

[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字段。
ExecStartfield 没有声明 script action 命令,这意味着run命令。

运行应用程序的用户、PID 文件和控制台日志文件由systemd本身,因此必须使用 'service' 脚本中的相应字段进行配置。 有关更多详细信息,请参阅 Service Unit configuration 手册页spring-doc.cadn.net.cn

要将应用程序标记为在系统引导时自动启动,请使用以下命令:spring-doc.cadn.net.cn

$ systemctl enable myapp.service

man systemctl了解更多详情。spring-doc.cadn.net.cn

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

若要将应用程序用作init.d服务中,配置其 build 以生成完全可执行的 jarspring-doc.cadn.net.cn

完全可执行的 jar 通过在文件前面嵌入额外的脚本来工作。 目前,某些工具不接受此格式,因此您可能并不总是能够使用此技术。 例如jar -xf可能会以静默方式无法提取已完全执行的 JAR 或 WAR。 建议仅在您打算直接执行 jar 或 war 时才将其设置为完全可执行,而不是使用java -jar或将其部署到 servlet 容器。
无法使 zip64 格式的 jar 文件完全可执行。 尝试这样做将导致 jar 文件在直接执行或使用java -jar. 包含一个或多个 zip64 格式嵌套 jar 的标准格式 jar 文件可以完全执行。

要使用 Maven 创建“完全可执行”的 jar,请使用以下插件配置:spring-doc.cadn.net.cn

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

以下示例显示了等效的 Gradle 配置:spring-doc.cadn.net.cn

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

然后可以将其符号链接到init.d支持标准start,stop,restartstatus命令。spring-doc.cadn.net.cn

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

假设您在/var/myapp,将 Spring Boot 应用程序安装为init.dservice 中,创建一个符号链接,如下所示:spring-doc.cadn.net.cn

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

安装后,您可以按照通常的方式启动和停止服务。 例如,在基于 Debian 的系统上,您可以使用以下命令启动它:spring-doc.cadn.net.cn

$ service myapp start
如果您的应用程序无法启动,请检查写入/var/log/<appname>.logfor errors 的 FOR Errors。

您还可以使用标准作系统工具将应用程序标记为自动启动。 例如,在 Debian 上,您可以使用以下命令:spring-doc.cadn.net.cn

$ update-rc.d myapp defaults <priority>

保护 init.d 服务

以下是有关如何保护作为 init.d 服务运行的 Spring Boot 应用程序的一组准则。 它并不是为强化应用程序及其运行环境而应执行的所有作的详尽列表。

当以 root 身份执行时,就像使用 root 启动 init.d 服务时一样,默认可执行脚本以RUN_AS_USER环境变量。 如果未设置环境变量,则使用拥有 jar 文件的用户。 您永远不应将 Spring Boot 应用程序作为root所以RUN_AS_USER永远不应该是 root,并且应用程序的 jar 文件永远不应该归 root 所有。 相反,请创建一个特定用户来运行您的应用程序,并将RUN_AS_USER环境变量或使用chown使其成为 jar 文件的所有者,如以下示例所示:spring-doc.cadn.net.cn

$ chown bootapp:bootapp your-app.jar

在这种情况下,默认可执行脚本将应用程序作为bootapp用户。spring-doc.cadn.net.cn

为了减少应用程序用户帐户被盗用的几率,您应该考虑阻止它使用登录 shell。 例如,您可以将账户的 shell 设置为/usr/sbin/nologin.

您还应该采取措施来防止修改应用程序的 jar 文件。 首先,配置其权限,使其无法写入,只能由其所有者读取或执行,如下例所示:spring-doc.cadn.net.cn

$ chmod 500 your-app.jar

其次,您还应该采取措施来限制您的应用程序或运行它的账户被盗用时的损害。 如果攻击者确实获得了访问权限,他们可以使 jar 文件可写并更改其内容。 防止这种情况的一种方法是通过使用chattr,如以下示例所示:spring-doc.cadn.net.cn

$ sudo chattr +i your-app.jar

这将阻止任何用户(包括 root)修改 jar。spring-doc.cadn.net.cn

如果使用 root 来控制应用程序的服务,并且您使用.conf文件要自定义其启动,.conf文件由 root 用户读取和评估。 它应该得到相应的保护。 用chmod这样文件就只能由所有者读取并使用chown使 root 成为所有者,如以下示例所示:spring-doc.cadn.net.cn

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

自定义启动脚本

可以通过多种方式自定义 Maven 或 Gradle 插件编写的默认嵌入式启动脚本。 对于大多数人来说,使用默认脚本和一些自定义通常就足够了。 如果您发现无法自定义所需的内容,请使用embeddedLaunchScript选项来完全编写您自己的文件。spring-doc.cadn.net.cn

在编写 start 脚本时对其进行自定义

在将启动脚本写入 jar 文件时,自定义启动脚本的元素通常是有意义的。 例如,init.d 脚本可以提供 “description”。 由于您预先知道描述(并且不需要更改),因此您也可以在生成 jar 时提供它。spring-doc.cadn.net.cn

要自定义写入元素,请使用embeddedLaunchScriptPropertiesSpring Boot Maven 插件的选项或propertiesSpring Boot Gradle 插件的launchScript.spring-doc.cadn.net.cn

默认脚本支持以下属性替换:spring-doc.cadn.net.cn

名字 描述 Gradle 默认 Maven 默认

modespring-doc.cadn.net.cn

脚本模式。spring-doc.cadn.net.cn

autospring-doc.cadn.net.cn

autospring-doc.cadn.net.cn

initInfoProvidesspring-doc.cadn.net.cn

Provides“INIT INFO” 部分spring-doc.cadn.net.cn

${task.baseName}spring-doc.cadn.net.cn

${project.artifactId}spring-doc.cadn.net.cn

initInfoRequiredStartspring-doc.cadn.net.cn

Required-Start“INIT INFO” 部分中。spring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

initInfoRequiredStopspring-doc.cadn.net.cn

Required-Stop“INIT INFO” 部分中。spring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

$remote_fs $syslog $networkspring-doc.cadn.net.cn

initInfoDefaultStartspring-doc.cadn.net.cn

Default-Start“INIT INFO” 部分中。spring-doc.cadn.net.cn

2 3 4 5spring-doc.cadn.net.cn

2 3 4 5spring-doc.cadn.net.cn

initInfoDefaultStopspring-doc.cadn.net.cn

Default-Stop“INIT INFO” 部分中。spring-doc.cadn.net.cn

0 1 6spring-doc.cadn.net.cn

0 1 6spring-doc.cadn.net.cn

initInfoShortDescriptionspring-doc.cadn.net.cn

Short-Description“INIT INFO” 部分中。spring-doc.cadn.net.cn

单行版本${project.description}(回退到${task.baseName})spring-doc.cadn.net.cn

${project.name}spring-doc.cadn.net.cn

initInfoDescriptionspring-doc.cadn.net.cn

Description“INIT INFO” 部分中。spring-doc.cadn.net.cn

${project.description}(回退到${task.baseName})spring-doc.cadn.net.cn

${project.description}(回退到${project.name})spring-doc.cadn.net.cn

initInfoChkconfigspring-doc.cadn.net.cn

chkconfig“INIT INFO” 部分spring-doc.cadn.net.cn

2345 99 01spring-doc.cadn.net.cn

2345 99 01spring-doc.cadn.net.cn

confFolderspring-doc.cadn.net.cn

的默认值CONF_FOLDERspring-doc.cadn.net.cn

包含 jar 的文件夹spring-doc.cadn.net.cn

包含 jar 的文件夹spring-doc.cadn.net.cn

inlinedConfScriptspring-doc.cadn.net.cn

对应在默认启动脚本中内联的文件脚本的引用。 这可用于设置环境变量,例如JAVA_OPTS在加载任何外部配置文件之前spring-doc.cadn.net.cn

logFolderspring-doc.cadn.net.cn

的默认值LOG_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

logFilenamespring-doc.cadn.net.cn

的默认值LOG_FILENAME. 仅对init.d服务spring-doc.cadn.net.cn

pidFolderspring-doc.cadn.net.cn

的默认值PID_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

pidFilenamespring-doc.cadn.net.cn

中 PID 文件名称的默认值PID_FOLDER. 仅对init.d服务spring-doc.cadn.net.cn

useStartStopDaemonspring-doc.cadn.net.cn

无论start-stop-daemon命令(如果可用)应用于控制进程spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

stopWaitTimespring-doc.cadn.net.cn

的默认值STOP_WAIT_TIME在几秒钟内。 仅对init.d服务spring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

60spring-doc.cadn.net.cn

在脚本运行时自定义脚本

对于在编写 jar 需要自定义的脚本项,您可以使用环境变量或配置文件spring-doc.cadn.net.cn

默认脚本支持以下环境属性:spring-doc.cadn.net.cn

变量 描述

MODEspring-doc.cadn.net.cn

作的 “模式”。 默认值取决于 jar 的构建方式,但通常是auto(这意味着它试图通过检查它是否是名为init.d). 您可以将其显式设置为service这样,stop|start|status|restart命令 work 或 torun如果要在前台运行脚本。spring-doc.cadn.net.cn

RUN_AS_USERspring-doc.cadn.net.cn

将用于运行应用程序的用户。 如果未设置,则将使用拥有 jar 文件的用户。spring-doc.cadn.net.cn

USE_START_STOP_DAEMONspring-doc.cadn.net.cn

无论start-stop-daemon命令(如果可用)应用于控制进程。 默认为true.spring-doc.cadn.net.cn

PID_FOLDERspring-doc.cadn.net.cn

pid 文件夹的根名称 (/var/run默认情况下)。spring-doc.cadn.net.cn

LOG_FOLDERspring-doc.cadn.net.cn

要放置日志文件的文件夹的名称 (/var/log默认情况下)。spring-doc.cadn.net.cn

CONF_FOLDERspring-doc.cadn.net.cn

要从中读取 .conf 文件的文件夹的名称(默认情况下与 jar-file 相同)。spring-doc.cadn.net.cn

LOG_FILENAMEspring-doc.cadn.net.cn

日志文件在LOG_FOLDER (<appname>.log默认情况下)。spring-doc.cadn.net.cn

APP_NAMEspring-doc.cadn.net.cn

应用程序的名称。 如果 jar 是从符号链接运行的,则脚本会猜测应用程序名称。 如果它不是符号链接,或者你想显式设置应用程序名称,这可能很有用。spring-doc.cadn.net.cn

RUN_ARGSspring-doc.cadn.net.cn

要传递给程序(Spring Boot 应用程序)的参数。spring-doc.cadn.net.cn

JAVA_HOMEspring-doc.cadn.net.cn

的位置javaexecutable 是使用PATH默认情况下,但如果$JAVA_HOME/bin/java.spring-doc.cadn.net.cn

JAVA_OPTSspring-doc.cadn.net.cn

启动 JVM 时传递给 JVM 的选项。spring-doc.cadn.net.cn

JARFILEspring-doc.cadn.net.cn

jar 文件的显式位置,以防脚本用于启动实际上并未嵌入的 jar。spring-doc.cadn.net.cn

DEBUGspring-doc.cadn.net.cn

如果不为空,则设置-x标志,允许您查看脚本中的逻辑。spring-doc.cadn.net.cn

STOP_WAIT_TIMEspring-doc.cadn.net.cn

在强制关闭应用程序之前停止应用程序时等待的时间(以秒为单位) (60默认情况下)。spring-doc.cadn.net.cn

PID_FOLDER,LOG_FOLDERLOG_FILENAME变量仅对init.d服务。 为systemd,则使用 'service' 脚本进行等效的自定义。 有关更多详细信息,请参阅 Service Unit configuration 手册页
使用 Conf 文件

除了JARFILEAPP_NAME,可以使用.conf文件。 该文件应位于 jar 文件旁边,具有相同的名称,但后缀为.conf而不是.jar. 例如,名为/var/myapp/myapp.jar使用名为/var/myapp/myapp.conf,如以下示例所示:spring-doc.cadn.net.cn

myapp.conf
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
如果您不喜欢将配置文件放在 jar 文件旁边,则可以设置CONF_FOLDER环境变量来自定义配置文件的位置。

要了解如何适当地保护此文件,请参阅保护 init.d 服务的准则spring-doc.cadn.net.cn

Microsoft Windows 服务

Spring Boot 应用程序可以作为 Windows 服务启动winsw.spring-doc.cadn.net.cn

一个(单独维护的示例)逐步描述了如何为 Spring Boot 应用程序创建 Windows 服务。spring-doc.cadn.net.cn