64.安装Spring Boot应用程序
除了使用 java -jar 运行Spring Boot应用程序之外,还可以为Unix系统创建完全可执行的应用程序。完全可执行的jar可以像任何其他可执行
二进制文件一样执行,也可以 使用 init.d 或 systemd 注册。这使得在常见生产环境中安装和管理Spring Boot应用程序变得非常容易。
警告
完全可执行的jar通过在文件的前面嵌入额外的脚本来工作。目前,某些工具不接受此格式,因此您可能无法始终使用此
技术。例如, jar -xf 可能无法提取已完全可执行的jar或战争。建议您只有在打算直接执行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的目录用作应用程
序的工作目录。
64.1支持的操作系统
默认脚本支持大多数Linux发行版,并在CentOS和Ubuntu上进行测试。其他平台,如OS X和FreeBSD,需要使用自定
义 embeddedLaunchScript 。
64.2 Unix / Linux服务
Spring Boot应用程序可以使用 init.d 或 systemd 轻松启动为Unix / Linux服务。
64.2.1作为 init.d 服务安装(系统V)
如果您配置了Spring Boot的Maven或Gradle插件来生成完全可执行的jar,并且您没有使用自定义 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服务的情况一样,默认可执行脚本以拥有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