返回介绍

6.2 安装Spring Boot应用程序

发布于 2021-03-17 13:07:53 字数 8414 浏览 998 评论 0 收藏 0

完全可执行的jar通过在文件的前面嵌入额外的脚本来工作。 目前,某些工具不接受此格式,因此您可能无法始终使用此技术。 例如,jar -xf可能会无声地提取已完全可执行的jar或war。 建议您只有在打算直接执行jar或war时才能使jar或war完全可执行,而不是使用java -jar运行它或将其部署到servlet容器。

要使用Maven创建“完全可执行”jar,请使用以下插件配置:

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

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

bootJar {
	launchScript()
}

然后,您可以通过键入./my-application.jar(其中my-application是您的工件的名称)来运行您的应用程序。 包含jar的目录用作应用程序的工作目录。

6.2.1 支持的操作系统

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

6.2.2 Unix/Linux服务

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

6.2.2.1 作为init.d服务安装(系统V)

如果您配置了Spring Boot的Maven或Gradle插件来生成完全可执行的jar,并且您没有使用自定义embeddedLaunchScript,那么您的应用程序可以用作init.d服务。 为此,请将jar符号链接到init.d以支持标准的启动,停止,重新启动和状态命令。

该脚本支持以下功能:

  • 以拥有jar文件的用户身份启动服务
  • 使用/var/run//.pid跟踪应用程序的PID
  • 将控制台日志写入/var/log/.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/.log的日志文件是否有错误。

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

$ update-rc.d myapp defaults <priority>

1)保护init.d服务

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

当以root身份执行时,就像root用于启动init.d服务的情况一样,默认可执行脚本以拥有jar文件的用户身份运行应用程序。 您永远不应该以root身份运行Spring Boot应用程序,因此应用程序的jar文件永远不应该由root拥有。 相反,创建一个特定用户来运行您的应用程序并使用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用户将读取并评估.conf文件。 它应该得到相应的保护。 使用chmod以便文件只能由所有者读取并使用chown使root成为所有者,如以下示例所示:

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

6.2.2.2 作为系统服务安装

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。

6.2.2.3 自定义启动脚本

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

1)在编写时自定义启动脚本

在将脚本写入jar文件时自定义启动脚本的元素通常是有意义的。 例如,init.d脚本可以提供“描述”。 由于您事先了解了描述(并且无需更改),因此您可以在生成jar时提供它。

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

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

NameDescriptionGradle defaultMaven default
modescript的模式autoauto
initInfoProvidesINIT INFO的Provides部分\${task.baseName}\${project.artifactId}
initInfoRequiredStartINIT INFO的Required-Start部分\$remote_fs \$syslog \$network\$remote_fs \$syslog \$network
initInfoRequiredStopINIT INFO的Required-Stop部分\$remote_fs \$syslog \$network\$remote_fs \$syslog \$network
initInfoDefaultStartINIT INFO的Default-Start部分2 3 4 52 3 4 5
initInfoDefaultStopINIT INFO的Default-Stop部分0 1 60 1 6
initInfoShortDescriptionINIT INFO的Short-Description部分Single-line version of \${project.description}(falling back to \${task.baseName})\${project.name}
initInfoDescriptionINIT INFO的Description部分\${project.description}(falling back to \${task.baseName})\${project.description}(falling back to \${project.name})
initInfoChkconfigINIT INFO的chkconfig部分2345 99 012345 99 01
confFolderCONF_FOLDER的默认属性Folder containing the jarFolder containing the 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

2)在它运行时自定义脚本

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

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

VariableDescription
MODE操作的“mode”。 默认值取决于jar的构建方式,但通常是auto(意味着它通过检查它是否是名为init.d的目录中的符号链接来尝试猜测它是否是init脚本)。 您可以显式将其设置为service,以便stop | start | status | restart命令可以在前台运行脚本时运行或运行。
USE_START_STOP_DAEMONstart-stop-daemon命令是否可用,应该用于控制进程。 默认为true。
PID_FOLDERpid文件夹的根名称(默认情况下为/var/run)。
LOG_FOLDER放置日志文件的文件夹的名称(默认情况下为/var/log)。
CONF_FOLDER从中读取.conf文件的文件夹的名称(默认情况下与jar文件相同)。
LOG_FILENAMELOG_FOLDER中的日志文件的名称(默认情况下为<appname&rt;.log)。
APP_NAME应用程序的名称。 如果jar从符号链接运行,则脚本会猜测应用程序名称。 如果它不是符号链接或您想要显式设置应用程序名称,这可能很有用。
RUN_ARGS传递给程序的参数(Spring Boot应用程序)。
JAVA_HOME默认情况下使用PATH发现java可执行文件的位置,但如果$ JAVA_HOME/bin/java中存在可执行文件,则可以显式设置它。
JAVA_OPTS启动时传递给JVM的选项。
JARFILEjar文件的显式位置,以防脚本用于启动实际上未嵌入的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的配置文件,如以下示例所示:

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

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

要了解有关正确保护此文件的信息,请参阅保护init.d服务的准则。

6.2.3 Microsoft Windows服务

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

单独维护的示例逐步介绍了如何为Spring Boot应用程序创建Windows服务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文