springboot应用的人越来越多,看到许多人在部署的时候依旧热衷于使用 nohup,& 等手段(可在 https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 查看更多手段,developerWorks 有人说是IBM 的一大彩蛋,确实不少好文章)来运行程序,问题都很明显,系统重启后不会自动启动,为何我们的应用不能像 nginx,haproxy,redis 等应用一样,注册为服务呢!查看springboot官网也有提到如何注册为服务启动,地址为 https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#deployment-service ,在参考其安装过程中遇到一些问题,并有一些自己想法,故写篇文章记录下。下面是为了说明问题使用命令,在生产上建议不要使用shell脚本执行,而要使用ansible脚本执行安装过程。
环境准备
主机一台,系统centos7 以上
应用一个 seal-app-1.0.1.jar
安装规划
应用启动用户,家目录 tomcat:tomcat /var/lib/tomcat
应用放置目录 /var/lib/tomcat/app
应用日志目录 /var/log/tomcat
应用打包
安装
卸载openjdk,请根据自己情况卸载
安装 oracle jdk,请根据自己情况安装,建议 rpm 包安装
至于问为何不用 openjdk 我了解到的是 oracle jdk 目前来看,大家都用,并且没问题
创建启动用户
useradd -m -d /var/lib/tomcat -s /sbin/nologin tomcat
创建 app存储目录
mkdir /var/lib/tomcat/app
将 seal-app-1.0.1.jar 移动到 /var/lib/tomcat/app 中,并改变属主属组
chown tomcat:tomcat -R /var/lib/tomcat/app/seal-app-1.0.1.jar
chmod 500 /var/lib/tomcat/app/seal-app-1.0.1.jar
若想保存历史版本,则创建硬连接,否则重命名此文件
ln /var/lib/tomcat/app/seal-app-1.0.1.jar /var/lib/tomcat/app/seal-app.jar
创建软链接,放到 /usr/bin 目录下供 service 配置文件使用。
ln -sv /var/lib/tomcat/app/seal-app.jar /usr/bin/seal-app.jar
注意 此处做两次链接的原因。
1 启动文件大多放在 /usr/bin 目录下
2 springboot 在启动时可以加载一个配置文件,来影响tomcat及自己应用的配置。其规则为
1 springboot 默认会在和启动应用的同目录下,找一个同名且后缀名为 .conf 配置文件
2 springboot 会在启动的时候将软连接解析为对应真实地址
3 springboot 会从环境变量中读取 CONF_FOLDER 指定的路径
根据以上规则,springboot 默认会解析到 /var/lib/tomcat/app/seal-app.jar,
并且会找 /var/lib/tomcat/app/seal-app.conf 配置文件
所以一定要保证硬链接的名为 seal-app.jar
禁止改动 jar 文件
chattr +i /var/lib/tomcat/app/seal-app.jar
# 注意 更新程序需要如下操作
允许修改 jar 文件
chattr -i /var/lib/tomcat/app/seal-app.jar
删除文件
rm /var/lib/tomcat/app/seal-app.jar
更新 jar 文件
ln /var/lib/tomcat/app/seal-app-${NEW_VERSION}-exec.jar /var/lib/tomcat/app/seal-app.jar
禁止改动 jar 文件
chattr +i /var/lib/tomcat/app/seal-app.jar
创建日志目录
mkdir /var/log/tomcat
chown tomcat:tomcat /var/log/tomcat
创建配置文件目录,因操作用户为 root,则下面目录若不修改都是 root用户的
mkdir /etc/tomcat
chmod 755 /etc/tomcat
配置文件
vim /etc/tomcat/seal-app.conf
JAVA_OPTS=-Xms1024M -Xmx1024M
设置为 tomcat 只读
chmod 644 /etc/tomcat/seal-app.conf
配置启动文件,注意此处 CONF_FOLDER=/etc/tomcat
vim /etc/systemd/system/seal-app.service
[Unit]
Description=seal-app
After=syslog.target
[Service]
User=tomcat
Environment="CONF_FOLDER=/etc/tomcat"
ExecStart=/usr/bin/seal-app.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
------------
systemctl daemon-reload
systemctl enable seal-app
systemctl start seal-app
后记
这样实现的部署感觉更符合linxu系统的规划,写成这样我想 ansible 脚本应该不难实现了吧。当然容器化目前看是未来,而 kubernetes 实现了完整的运维环境,要比人肉运维好多了。