文档章节

Spring Boot 生产环境部署

侯法超
 侯法超
发布于 2017/04/25 15:50
字数 1615
阅读 1510
收藏 80

欢迎加群交流(Spring Boot技术交流):490788638

原文:http://blog.geekidentity.com/spring/spring_boot_production_deploy/

Part V. Spring Boot Actuator: 生产准备功能

Spring Boot包括一些额外的功能,可帮助您在应用程序推送到生产环境时对其进行监控和管理。 您可以选择使用HTTP端点,JMX或甚至远程shell(SSH或Telnet)来管理和监视应用程序。 审计,健康和指标收集可以自动应用于您的应用程序。

执行器HTTP端点仅适用于基于Spring MVC的应用程序。 特别是,除了启用Spring MVC之外,它也不适用于Jersey。

59. 安装Spring Boot应用程序

除了使用java -jar运行Spring Boot应用程序外,还可以为Unix系统打包完全可执行的应用程序。 这使得在常见的生产环境中安装和管理Spring Boot应用程序非常容易。

要使用Maven创建“完全可执行”的jar,请使用以下插件配置:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

使用Gradle:

springBoot {
    executable = true
}

然后,您可以通过键入./my-application.jar(其中my-application是您工程的artifact的名称)来运行应用程序。

完全可执行的jar通过在文件的前面嵌入一个额外的脚本来工作。 并不是所有的工具目前都接受这种格式,所以你可能并不总是能够使用这种技术。

默认脚本支持大多数Linux发行版,并在CentOS和Ubuntu上进行了测试。 其他平台,如OS X和FreeBSD,将需要使用自定义的embeddedLaunchScript。

当运行完全可执行的jar时,它将使用jar的目录作为工作目录。

59.1 Unix/Linux 服务

Spring Boot应用程序可以使用init.d或systemd轻松地作为Unix / Linux服务启动。

59.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

假设你有一个Spring Boot应用程序安装在 /var/myapp 中,安装Spring Boot应用程序作为init.d服务只需创建一个符号链接:

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

一旦安装,您可以按照Linux系统常用的方式启动和停止服务。 例如,在基于Debian的系统上:

$ service myapp start

如果您的应用程序无法启动,请检查写入/var/log/<appname>.log的日志文件是否有错误日志。

您还可以将应用程序标记为使用标准操作系统工具自动启动。 例如Debian:

$ update-rc.d myapp defaults <priority>

保护init.d服务

以下是关于如何保护作为init.d服务运行的Spring Boot应用程序的一组指导。 它并不是为了强化应用程序和运行环境而应该做的所有事情的详尽列表。

当以root身份执行时,如使用root用于启动init.d服务的情况,默认可执行脚本将以拥有该jar文件的用户身份运行应用程序。 您不应该以root身份运行Spring Boot应用程序,因此您的应用程序的jar文件不应该由root拥有。 相反,创建一个特定的用户来运行应用程序,并使用chown将其作为jar文件的所有者。 例如:

$ chown bootapp:bootapp your-app.jar

在这种情况下,默认的可执行脚本将作为bootapp用户运行应用程序。

为了减少应用程序的用户帐户遭到入侵的机会,您应该考虑防止其使用登录shell。 例如,将帐户的shell设置为 /usr/sbin/nologin 。

您还应该采取措施来阻止修改jar文件。 首先,配置其权限,使其不能被写入,并且只能由其所有者读取或执行:

$ chmod 500 your-app.jar

其次,如果您的应用程序或运行它的帐户被泄露,您还应该采取措施限制jar包被损坏。如果攻击者获得访问权限,他们可以使jar文件可写,并更改其内容。防止这种情况的一种方法是使用chattr使其变得不可变:

$ sudo chattr +i your-app.jar

这将阻止任何用户(包括root)修改该jar。

如果使用root来控制应用程序的服务,并且使用.conf文件来自定义其启动,那么root用户将读取和评估该.conf文件。 应该保证相应的安全。 使用chmod,以便该文件只能由所有者读取,并使用chown使root成为所有者:

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

59.1.2 作为systemd服务进行安装

Systemd是System V init系统的后继者,现在被许多现代Linux发行版使用。尽管您可以继续使用systemd的init.d脚本,但也可以使用systemd'service'脚本启动Spring Boot应用程序。

假设您在 /var/myapp 中安装了一个Spring Boot应用程序,要将Spring Boot应用作为系统服务安装为使用以下示例创建名为myapp.service的脚本,并将其放在 /etc/systemd/system 目录中:

[Unit]
Description=myapp
After=syslog.target

[Service]
User=myapp
ExecStart=/var/myapp/myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

请记住更改应用程序的Description,User 和ExecStart 字段。

请注意,ExecStart字段不声明脚本操作命令,这意味着默认情况下使用run命令。

请注意,与运行init.d服务不同,运行应用程序,PID文件和控制台日志文件的用户由systemd本身管理,因此必须使用“service”脚本中的相应字段进行配置。 有关详细信息,请参阅服务单元配置手册页。

请注意,与运行init.d服务不同,运行应用程序,PID文件和控制台日志文件的用户由systemd本身管理,因此必须使用“service”脚本中的相应字段进行配置。 有关详细信息,请参阅服务单元配置手册页

要将应用程序标记为在系统启动时自动启动,请使用以下命令:

$ systemctl enable myapp.service

有关详细信息,请参阅man systemctl。

© 著作权归作者所有

侯法超
粉丝 154
博文 57
码字总数 105341
作品 0
大兴
程序员
私信 提问
加载中

评论(3)

abcijkxyz
abcijkxyz
收藏
polly
polly
不错
w
weir2016
Systemd 方式启动顺序怎么来设置的
Apollo:微服务架构下的配置管理

问题背景 在实际工作中,我们的开发环境,测试环境,生产环境对应的 Mysql 数据库,Redis 这些信息都不一样,每个环境都有对应的一套配置,在 Spring Boot 中我们通常会编写多个配置文件,也...

尹吉欢
03/25
0
0
即将到来的金三银四,这10道springboot常见面试题你需要了解下

1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。 ...

别打我会飞
02/18
2.4K
2
为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
2018/09/18
484
3
springboot maven 多环境配置 jenking构建发布配置

在后端开发中,应用程序在不同的环境可能会有不同的配置,例如数据库连接、日志级别等,开发,测试,生产每个环境可能配置都不一致。 使用Spring Boot的Profile可以实现多场景下的配置切换,方...

Elson
2018/09/05
118
2
SpringBoot 学习:(一)快速搭建项目

一、简介 从 Spring Boot 项目名称中的 Boot 可以看出来,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目。它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Sp...

Element0506
2015/07/25
555
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt程序打包发布方法(使用官方提供的windeployqt工具)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/toTheUnknown/article/details/81748179 如果使用到了Qt ...

shzwork
35分钟前
7
0
MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
56分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
今天
6
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
今天
7
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部