Springboot 应用部署建议

Java框架

浏览数:249

2020-6-1

简介

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

应用打包

  <!-- 切记一定要添加 executable -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    	<executable>true</executable>
    </configuration>
  </plugin>

安装

# 创建启动用户
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 实现了完整的运维环境,要比人肉运维好多了。

作者:seal_90