文档章节

Springboot 应用部署建议

s
 seal_90
发布于 06/12 15:31
字数 939
阅读 1835
收藏 43

简介

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 实现了完整的运维环境,要比人肉运维好多了。

© 著作权归作者所有

共有 人打赏支持
s
粉丝 6
博文 12
码字总数 12099
作品 0
济南
私信 提问
加载中

评论(8)

i
ice_stream
为什么不用java wrapper service
s
seal_90

引用来自“荭署”的评论

并不是,我说有的启动项和配置参数都在shell脚本里,开机启动项只需要引用一下就可以了,何况 shell直接 start -all多棒
1 linux 不同目录应该存放不同类型的文件
2 若是进程出问题后,linux init软件去维护就死掉不能再启动
若是非容器化使用这个方式还是有很多优势的
s
seal_90

引用来自“电阻学长”的评论

这个具备守护进程功能么?开机自启动不
这样配置就和nginx等软件一样了,启动为服务
s
seal_90

引用来自“MockMan”的评论

配合使用docker,效果更佳
docker 单调了点,用上k8s效果才会更明显
MockMan
MockMan
配合使用docker,效果更佳
电阻学长
电阻学长
这个具备守护进程功能么?开机自启动不
xiaour
xiaour
并不是,我说有的启动项和配置参数都在shell脚本里,开机启动项只需要引用一下就可以了,何况 shell直接 start -all多棒
h
httpmad
学习了
springboot开发简单的web应用前篇

你已经会spring了,也非常熟悉springmvc的开发,平时你搭建个web应用简单吗?好像也不难!那么今天我来试试用springboot来开发个简单的web应用来试试。 在正式讲解springboot开发web应用之前...

GeCoder
05/04
0
0
【SpringBoot专题】快速体验

前言 在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正是因为这些问题,Spring开...

张丰哲
08/05
0
0
springboot 开发入门,及问题汇总

1 . springboot简单介绍(http://projects.spring.io/spring-boot/) 现在的web项目几乎都会用到spring框架,而要使用spring难免需要配置大量的xml配置文件,而springboot的出现解 决了这一问...

崔江昆
2015/03/18
0
30
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
springboot情操陶冶-初识springboot

前言:springboot由于其轻便和去配置化等的特性已经被广泛应用,基于时代潮流以及不被鄙视,笔者于是开辟此篇开始认识springboot 前话 springboot是基于spring而开发的轻量级框架,所以在学习...

南柯问天
07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅析微信支付:开通免充值产品功能及如何进行接口升级指引

本文是【浅析微信支付】系列文章的第十五篇,主要讲解如何开通免充值产品功能流程和其中的注意事项,对于接口升级会重要讲解,避免爬坑。 浅析微信支付系列已经更新十五篇了哟~,没有看过的...

YClimb
34分钟前
1
0
看看ArrayDeque源码

之前看了其他实现Deque接口的类,这里再看看ArrayDeque吧,下图可以看到这个类设计的结构层次,其实Deque接口是继承了Queue接口的。用可调整大小的数组实现Deque接口。没有容量限制,他们根据...

woshixin
34分钟前
1
0
如何存储登录cookie,发送一个post类型的api请求?

其实发送post请求和get请求一样,主要就是不知道如何存储登录cookie进行发送请求,请教xx得到如下解决办法 点击右下方的cookies,填写cookies信息,如图 1填写登录的cookie名,2填写cookie的...

七曦777
35分钟前
1
0
利用cefSharp实现网页自动注册登录的需要注册的一些事项

最近朋友有个需要自动注册登录点击的事,我帮着写了写,好久没写过这东西了,在写的过程中总结了需要注意的一些事项。 一、换IP之后要测试一下速度,我目前用的最简单的测试方法就是20-30秒加...

我退而结网
43分钟前
2
0
Go语言中使用 BoltDB数据库

boltdb 是使用Go语言编写的开源的键值对数据库,Github的地址如下: https://github.com/boltdb/bolt boltdb 存储数据时 key 和 value 都要求是字节数据,此处需要使用到 序列化和反序列化。...

Oo若离oO
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部