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

如果你配置Spring Boot的Maven或Gradle插件产生一个完全可执行jar,并且没有使用自定义的embeddedLaunchScript,那你的应用可以作为init.d服务使用。只要简单的建立jar到init.d的符号连接就能获取标准的startstoprestartstatus命令支持。

该脚本支持以下特性:

  • 以拥有该jar文件的用户启动服务。
  • 使用/var/run/<appname>/<appname>.pid跟踪应用的PID。
  • 将控制台日志输出到/var/log/<appname>.log

假设你在/var/myapp目录安装了一个Spring Boot应用,只需要建立符号连接就能将Spring Boot应用安装成init.d服务:

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

一旦安装成功,你就可以像平常那样启动和停止服务,例如,在一个基于Debian的系统:

  1. $ service myapp start

如果应用启动失败,检查下/var/log/<appname>.log中的错误日志。

你也可以标识应用使用标准的操作系统工具自启动,例如,在Debian上:

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

保护init.d服务

当使用root用户启动init.d服务时,默认的执行脚本将以拥有该jar文件的用户来运行应用。你最好不要使用root启动Spring Boot应用,也就是你的应用jar文件拥有者不能是root,而是创建一个特定用户运行应用,并使用chown指定该用户拥有jar文件,示例:

  1. $ chown bootapp:bootapp your-app.jar

本示例中,默认执行脚本将使用bootapp用户运行应用。

为减少应用用户账号冲突,你可以考虑防止它使用登陆shell,例如将账号shell设置为/usr/sbin/nologin

你也要采取措施防止修改应用jar文件,首先配置jar文件权限只能被拥有者读取和执行,不能写入:

  1. $ chmod 500 your-app.jar

然后,你也应该采取措施限制应用或账号运行时的冲突造成的损坏。如果攻击者获取访问权,他们可能会让jar文件可写并改变它的内容,使用chattr让它变为不可变是唯一的保护措施:

  1. $ sudo chattr +i your-app.jar

这会防止任何用户修改jar文件,包括root。

如果root用户用来控制应用服务,并且你使用.conf文件自定义它的启动,该.conf文件将被root用户读取和评估,因此它也需要保护。使用chmod改变文件权限只能被拥有者读取,然后使用chown改变文件拥有者为root:

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