56.1.1 安装为init.d服务(System 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服务
当使用root
用户启动init.d
服务时,默认的执行脚本将以拥有该jar文件的用户来运行应用。你最好不要使用root
启动Spring Boot应用,也就是你的应用jar文件拥有者不能是root
,而是创建一个特定用户运行应用,并使用chown
指定该用户拥有jar文件,示例:
$ chown bootapp:bootapp your-app.jar
本示例中,默认执行脚本将使用bootapp
用户运行应用。
注 为减少应用用户账号冲突,你可以考虑防止它使用登陆shell,例如将账号shell设置为/usr/sbin/nologin
。
你也要采取措施防止修改应用jar文件,首先配置jar文件权限只能被拥有者读取和执行,不能写入:
$ chmod 500 your-app.jar
然后,你也应该采取措施限制应用或账号运行时的冲突造成的损坏。如果攻击者获取访问权,他们可能会让jar文件可写并改变它的内容,使用chattr
让它变为不可变是唯一的保护措施:
$ sudo chattr +i your-app.jar
这会防止任何用户修改jar文件,包括root。
如果root用户用来控制应用服务,并且你使用.conf文件自定义它的启动,该.conf
文件将被root用户读取和评估,因此它也需要保护。使用chmod
改变文件权限只能被拥有者读取,然后使用chown
改变文件拥有者为root:
$ chmod 400 your-app.conf
$ sudo chown root:root your-app.conf