在部署应用程序时,Spring Boot的灵活打包选项提供了大量选择。您可以将Spring Boot应用程序部署到各种云平台、虚拟/真实机器上,或者使它们在Unix系统上完全可执行。

本节介绍一些更常见的部署方案。

1. Deploying to the Cloud

Spring Boot的可执行JAR是为大多数流行的云PaaS(平台即服务)提供商现成的。这些供应商往往要求你“自带集装箱”。它们管理应用程序进程(不是专门的Java应用程序),因此它们需要一个中间层来使您的应用程序适应云的运行进程的概念。

两个流行的云提供商Heroku和Cloud Foundry采用了“构建包”方法。构建包将部署的代码包装在启动应用程序所需的任何内容中。它可能是一个JDK和对Java、嵌入式Web服务器或功能齐全的应用程序服务器的调用。构建包是可插拔的,但理想情况下,您应该能够对其进行尽可能少的定制。这减少了不受您控制的功能的占用空间。它最大限度地减少了开发和生产环境之间的差异。

理想情况下,您的应用程序(如Spring Boot可执行JAR)将运行所需的一切打包在其中。

在本节中,我们将了解如何在云中启动和运行我们在“入门”一节中开发的应用程序。

1.1. Cloud Foundry

Cloud Foundry提供了默认的构建包,如果没有指定其他构建包,这些构建包就会生效。Cloud FoundryJava构建包对Spring应用程序有很好的支持,包括Spring Boot。您可以部署独立的可执行JAR应用程序以及传统的.war打包应用程序。

一旦您构建了您的应用程序(例如,通过使用MVN Clean Package)并安装了cf命令行工具,使用cf ush命令部署您的应用程序,替换为编译后的.jar的路径。在推送应用程序之前,请确保已使用cf命令行客户端登录。下面这行显示了如何使用cf推送命令部署应用程序:

$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
            
            
In the preceding example, we substitute acloudyspringtime for whatever value you give cf as the name of your application.

有关更多选项,请参阅cf推送文档。如果同一目录中存在Cloud Foundrymark.yml文件,则会考虑该文件。

此时,cf开始上传您的应用程序,并产生与以下示例类似的输出:

Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M)
-----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-buildpack.git#6f25b7e
-----> Downloading Open Jdk JRE
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
       Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -XX:MetaspaceSize=104857K
-----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar (found in cache)
       Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.6s)
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache)
Checking status of app 'acloudyspringtime'...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  0 of 1 instances running (1 starting)
  ...
  1 of 1 instances running (1 running)

App started

祝贺你!应用程序现已上线!

一旦您的应用程序处于活动状态,您就可以使用cf app命令来验证已部署应用程序的状态,如下例所示:

$ cf apps
Getting applications in ...
OK

name                 requested state   instances   memory   disk   urls
...
acloudyspringtime    started           1/1         512M     1G     acloudyspringtime.cfapps.io
...
            
            

一旦Cloud Foundry确认您的应用程序已经部署,您应该能够在给定的URI处找到该应用程序。在前面的示例中,您可以在https://acloudyspringtime.cfapps.io/.找到它

1.1.1. Binding to Services

默认情况下,关于正在运行的应用程序的元数据以及服务连接信息作为环境变量向应用程序公开(例如:$VCAP_SERVICES)。这一架构决策是由于Cloud Foundry的多语言特性(任何语言和平台都可以作为构建包来支持)。进程范围的环境变量是语言不可知的。

环境变量并不总是提供最简单的API,因此Spring Boot会自动提取它们,并将数据拼合到可通过Spring的Environment抽象访问的属性中,如下例所示:

Java
Kotlin
import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class MyBean implements EnvironmentAware { private String instanceId; @Override public void setEnvironment(Environment environment) { this.instanceId = environment.getProperty("vcap.application.instance_id"); } // ... } 
             
             

所有Cloud Foundry属性都以VCap为前缀。您可以使用VCap属性来访问应用程序信息(如应用程序的公共URL)和服务信息(如数据库凭据)。有关完整的详细信息,请参阅‘CloudFoundryVcapEnvironmentPostProcessor’Java。

The Java CFEnv project is a better fit for tasks such as configuring a DataSource.

1.2. Kubernetes

Spring Boot通过检查环境中的“*_SERVICE_HOST”“*_SERVICE_PORT”变量来自动检测Kubernetes部署环境。您可以使用spring.main.Cloud-Platform配置属性覆盖此检测。

Spring Boot帮助您管理应用程序的状态,并使用HTTP Kubernetes Probe使用Actuator将其导出。

1.2.1. Kubernetes Container Lifecycle

当Kubernetes删除应用程序实例时,关机过程同时涉及几个子系统:关机钩子、注销服务、从负载均衡器…移除实例​因为这种关闭处理是并行进行的(并且由于分布式系统的性质),所以存在一个窗口,在该窗口期间,流量可以被路由到也已经开始其关闭处理的Pod。

您可以在preStop处理程序中配置休眠执行,以避免将请求路由到已经开始关闭的Pod。此休眠时间应足以让新请求停止被路由到Pod,其持续时间因部署而异。可以在Pod的配置文件中使用PodSpec配置preStop处理程序,如下所示:

spec:
  containers:
  - name: "example-container"
    image: "example-image"
    lifecycle:
      preStop:
        exec:
          command: ["sh", "-c", "sleep 10"]
             
             

一旦停止前钩子完成,SIGTERM将被发送到容器,并且正常关闭将开始,允许任何剩余的动态请求完成。

When Kubernetes sends a SIGTERM signal to the pod, it waits for a specified time called the termination grace period (the default for which is 30 seconds). If the containers are still running after the grace period, they are sent the SIGKILL signal and forcibly removed. If the pod takes longer than 30 seconds to shut down, which could be because you have increased spring.lifecycle.timeout-per-shutdown-phase, make sure to increase the termination grace period by setting the terminationGracePeriodSeconds option in the Pod YAML.

1.3. Heroku

Heroku是另一个流行的PaaS平台。要定制Heroku构建,您需要提供一个Procfile,它提供了部署应用程序所需的咒语。Heroku为Java应用程序分配一个端口,然后确保路由到外部URI工作。

您必须将应用程序配置为侦听正确的端口。下面的示例显示了我们的Starter REST应用程序的Procfile

web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar

Spring Boot使-D参数可以作为可从SpringEnvironment实例访问的属性使用。server.port配置属性被提供给嵌入的Tomcat、Jetty或Undertow实例,然后在启动时使用该端口。$PORT环境变量由Heroku PaaS分配给我们。

这应该是你需要的一切。Heroku部署最常见的部署工作流程是git推送代码到生产环境,如下例所示:

$ git push heroku main
            
            

这将导致以下情况:

Initializing repository, done.
Counting objects: 95, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (78/78), done.
Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done.
Total 95 (delta 31), reused 0 (delta 0)

-----> Java app detected
-----> Installing OpenJDK... done
-----> Installing Maven... done
-----> Installing settings.xml... done
-----> Executing: mvn -B -DskipTests=true clean install

       [INFO] Scanning for projects...
       Downloading: https://repo.spring.io/...
       Downloaded: https://repo.spring.io/... (818 B at 1.8 KB/sec)
        ....
       Downloaded: https://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec)
       [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/...
       [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ...
       [INFO] ------------------------------------------------------------------------
       [INFO] BUILD SUCCESS
       [INFO] ------------------------------------------------------------------------
       [INFO] Total time: 59.358s
       [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014
       [INFO] Final Memory: 20M/493M
       [INFO] ------------------------------------------------------------------------

-----> Discovering process types
       Procfile declares types -> web

-----> Compressing... done, 70.4MB
-----> Launching... done, v6
       https://agile-sierra-1405.herokuapp.com/ deployed to Heroku

To [email protected]:agile-sierra-1405.git
 * [new branch]      main -> main

您的应用程序现在应该已在Heroku上启动并运行。有关更多详细信息,请参阅将Spring Boot应用程序部署到Heroku

1.4. OpenShift

OpenShift有很多资源描述如何部署Spring Boot应用程序,包括:

1.5. Amazon Web Services (AWS)

Amazon Web Services提供了多种安装基于Spring Boot的应用程序的方法,既可以作为传统的Web应用程序(WAR),也可以作为带有嵌入式Web服务器的可执行JAR文件。选项包括:

  • AWS弹性豆茎

  • AWS代码部署

  • AWS OPS工作正常

  • AWS云形成

  • AWS容器注册表

每种产品都有不同的功能和定价模式。在本文档中,我们介绍了使用AWS弹性豆茎的方法。

1.5.1. AWS Elastic Beanstalk

正如官方Elastic Beanstrik Java指南中所述,部署Java应用程序有两种主要选择。您可以使用“Tomcat平台”或“Java SE平台”。

Using the Tomcat Platform

此选项适用于生成WAR文件的Spring Boot项目。不需要特殊配置。你只需要遵循官方指南就可以了。

Using the Java SE Platform

此选项适用于生成JAR文件并运行嵌入式Web容器的Spring Boot项目。弹性豆茎环境在端口80上运行一个nginx实例来代理在端口5000上运行的实际应用程序。要对其进行配置,请将以下行添加到Application.Properties文件中:

server.port=5000
Upload binaries instead of sources

默认情况下,弹性豆茎上载源代码并在AWS中编译它们。但是,最好是上载二进制文件。为此,请将类似于以下内容的行添加到您的.elasticbeanstrik/config.yml文件中:

deploy:
    artifact: target/demo-0.0.1-SNAPSHOT.jar
                   
                   
Reduce costs by setting the environment type

默认情况下,弹性豆茎环境是负载平衡的。负载均衡器的成本很高。要避免该成本,请将环境类型设置为“单实例”,如Amazon文档所述。您还可以使用CLI和以下命令创建单实例环境:

eb create -s

1.5.2. Summary

这是访问AWS最简单的方法之一,但还有更多内容需要介绍,例如如何将Elastic Beanstak集成到任何CI/CD工具中,使用Elastic Beanstak Maven插件而不是CLI,等等。有一篇博客文章更详细地介绍了这些主题。

1.6. CloudCaptain and Amazon Web Services

CloudCap的工作原理是将您的Spring Boot可执行JAR或WAR转换为一个最小的VM镜像,可以不加更改地部署在VirtualBox或AWS上。CloudCap提供了对Spring Boot的深度集成,并使用您的Spring Boot配置文件中的信息来自动配置端口和运行状况检查URL。CloudQueue将此信息用于其生成的图像以及其提供的所有资源(实例、安全组、弹性负载均衡器等)。

一旦您创建了CloudCapth帐户,将其连接到您的AWS帐户,安装了最新版本的CloudCap客户端,并确保应用程序是由Maven或Gradle构建的(例如,通过使用MVN Clean Package),您就可以使用类似于以下命令的命令将您的Spring Boot应用程序部署到AWS:

$ boxfuse run myapp-1.0.jar -env=prod
            
            

有关更多选项,请参阅boxfuse run文档。如果当前目录中存在boxfuse.conf文件,则认为是该文件。

By default, CloudCaptain activates a Spring profile named boxfuse on startup. If your executable jar or war contains an application-boxfuse.properties file, CloudCaptain bases its configuration on the properties it contains.

此时,CloudCap为您的应用程序创建一个映像,上传它,并在AWS上配置和启动必要的资源,从而产生与以下示例类似的输出:

Fusing Image for myapp-1.0.jar ...
Image fused in 00:06.838s (53937 K) -> axelfontaine/myapp:1.0
Creating axelfontaine/myapp ...
Pushing axelfontaine/myapp:1.0 ...
Verifying axelfontaine/myapp:1.0 ...
Creating Elastic IP ...
Mapping myapp-axelfontaine.boxfuse.io to 52.28.233.167 ...
Waiting for AWS to create an AMI for axelfontaine/myapp:1.0 in eu-central-1 (this may take up to 50 seconds) ...
AMI created in 00:23.557s -> ami-d23f38cf
Creating security group boxfuse-sg_axelfontaine/myapp:1.0 ...
Launching t2.micro instance of axelfontaine/myapp:1.0 (ami-d23f38cf) in eu-central-1 ...
Instance launched in 00:30.306s -> i-92ef9f53
Waiting for AWS to boot Instance i-92ef9f53 and Payload to start at https://52.28.235.61/ ...
Payload started in 00:29.266s -> https://52.28.235.61/
Remapping Elastic IP 52.28.233.167 to i-92ef9f53 ...
Waiting 15s for AWS to complete Elastic IP Zero Downtime transition ...
Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at https://myapp-axelfontaine.boxfuse.io/

您的应用程序现在应该已在AWS上启动并运行。

请参阅在EC2上部署Spring Boot应用程序的博客文章以及CloudCap Spring Boot集成的文档,以开始使用Maven构建来运行该应用程序。

1.7. Azure

入门指南将指导您完成将您的Spring Boot应用程序部署到Azure Spring Cloud或Azure App Service的过程。

1.8. Google Cloud

Google Cloud有几个选项可用于启动Spring Boot应用程序。最容易入门的可能是App Engine,但您也可以找到方法在带有Container Engine的容器中或在带有Compute Engine的虚拟机上运行Spring Boot。

要在App Engine中运行,您可以首先在UI中创建一个项目,该项目将为您设置唯一的标识符,并设置HTTP路由。向项目中添加一个Java应用程序并将其留空,然后使用Google Cloud SDK从命令行或CI版本将您的Spring Boot应用程序推送到该插槽中。

App Engine标准版要求您使用WAR包。按照以下步骤将App Engine标准应用部署到Google Cloud。

或者,App Engine Flex要求您创建一个app.yaml文件来描述您的应用程序需要的资源。通常,您将该文件放在src/main/appEngine中,它应该类似于以下文件:

service: "default"

runtime: "java"
env: "flex"

runtime_config:
  jdk: "openjdk8"

handlers:
- url: "/.*"
  script: "this field is required, but ignored"

manual_scaling:
  instances: 1

health_check:
  enable_health_check: false

env_variables:
  ENCRYPT_KEY: "your_encryption_key_here"
            
            

您可以通过将项目ID添加到构建配置来部署应用程序(例如,使用Maven插件),如下例所示:

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>1.3.0</version>
    <configuration>
        <project>myproject</project>
    </configuration>
</plugin>
            
            

然后使用MVN appEngine:Deploy进行部署(如果需要先进行身份验证,则构建失败)。

2. Installing Spring Boot Applications

除了使用Java-jar运行Spring Boot应用程序外,还可以为Unix系统制作完全可执行的应用程序。完全可执行的JAR可以像任何其他可执行二进制文件一样执行,也可以init.dsystem d注册。这对在常见生产环境中安装和管理Spring Boot应用程序很有帮助。

Fully executable jars work by embedding an extra script at the front of the file. Currently, some tools do not accept this format, so you may not always be able to use this technique. For example, jar -xf may silently fail to extract a jar or war that has been made fully executable. It is recommended that you make your jar or war fully executable only if you intend to execute it directly, rather than running it with java -jar or deploying it to a servlet container.
A zip64-format jar file cannot be made fully executable. Attempting to do so will result in a jar file that is reported as corrupt when executed directly or with java -jar. A standard-format jar file that contains one or more zip64-format nested jars can be fully executable.

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

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

以下示例显示了等效的Gradle配置:

tasks.named('bootJar') {
    launchScript()
}
           
           

然后,您可以通过键入./my-Applation.jar(其中my-application是您的构件的名称)来运行应用程序。包含JAR的目录用作应用程序的工作目录。

2.1. Supported Operating Systems

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

2.2. Unix/Linux Services

通过使用init.dsystemd,可以轻松地将Spring Boot应用程序作为Unix/Linux服务启动。

2.2.1. Installation as an init.d Service (System V)

如果您将Spring Boot的Maven或Gradle插件配置为生成完全可执行的JAR,并且您没有使用定制的embeddedLaunchScrip,则您的应用程序可以用作init.d服务。为此,将JAR符号链接到init.d以支持标准的启动停止重新启动状态命令。

该脚本支持以下功能:

  • 以拥有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
             
             
If your application fails to start, check the log file written to /var/log/<appname>.log for errors.

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

$ update-rc.d myapp defaults <priority>
             
             
Securing an init.d Service
The following is a set of guidelines on how to secure a Spring Boot application that runs as an init.d service. It is not intended to be an exhaustive list of everything that should be done to harden an application and the environment in which it runs.

当以超级用户身份执行时,就像使用超级用户启动init.d服务时一样,默认的可执行脚本将以RUN_AS_USER环境变量中指定的用户身份运行应用程序。如果未设置环境变量,则使用拥有JAR文件的用户。您永远不应该以超级用户身份运行一个Spring Boot应用程序,因此run_as_user永远不应该是超级用户,并且您的应用程序的JAR文件永远不应该由超级用户拥有。相反,您可以创建一个特定用户来运行您的应用程序,并设置RUN_AS_USER环境变量,或使用chown使其成为JAR文件的所有者,如下例所示:

$ chown bootapp:bootapp your-app.jar
              
              

在本例中,默认的可执行脚本以bootapp用户身份运行应用程序。

To reduce the chances of the application’s user account being compromised, you should consider preventing it from using a login shell. For example, you can set the account’s shell to /usr/sbin/nologin.

您还应该采取措施防止修改应用程序的JAR文件。首先,配置其权限,使其不能写入,只能由其所有者读取或执行,如下例所示:

$ chmod 500 your-app.jar
              
              

其次,如果您的应用程序或运行该应用程序的帐户遭到破坏,您还应该采取措施限制损害。如果攻击者确实获得了访问权限,他们可能会使JAR文件可写并更改其内容。防止这种情况发生的一种方法是使用chattr使其不可变,如下例所示:

$ sudo chattr +i your-app.jar
              
              

这将防止任何用户(包括超级用户)修改JAR。

如果根用户用于控制应用程序的服务,并且您使用.conf文件来自定义其启动,则根用户将读取和评估.conf文件。它应该得到相应的保障。使用chmod使文件只能由所有者读取,并使用chown将根用户设置为所有者,如下例所示:

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

2.2.2. Installation as a systemd Service

system d是system V init系统的后续版本,现在许多现代Linux发行版都在使用它。虽然您可以继续将init.d脚本与systemd一起使用,但也可以使用systemd‘service’脚本启动Spring Boot应用程序。

假设您在/var/myapp中安装了一个Spring Boot应用程序,要将一个Spring Boot应用程序作为systemd服务安装,请创建一个名为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
Remember to change the Description, User, and ExecStart fields for your application.
The ExecStart field does not declare the script action command, which means that the run command is used by default.

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

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

$ systemctl enable myapp.service
             
             

运行man system ctl以获取更多详细信息。

2.2.3. Customizing the Startup Script

由Maven或Gradle插件编写的默认嵌入式启动脚本可以通过多种方式进行定制。对于大多数人来说,使用默认脚本和一些定制通常就足够了。如果您发现无法定制所需的内容,请使用embeddedLaunchScrip选项完全编写您自己的文件。

Customizing the Start Script When It Is Written

在将启动脚本写入JAR文件时,定制启动脚本的元素通常是有意义的。例如,init.d脚本可以提供“描述”。既然您预先知道描述(并且不需要更改),那么您也可以在生成JAR时提供它。

要定制写入的元素,请使用Spring Boot Maven插件的embeddedLaunchScriptProperties选项或Spring Boot Gradle插件的属性属性。

默认脚本支持以下属性替换:

Name Description Gradle default Maven default

模式

脚本模式。

自动

自动

initInfoProvides

提供“INIT信息”的部分

${task.base Name}

${project t.artifactId}

initInfoRequiredStart

必填-“INIT INFO”的开始部分。

$Remote_FS$syslog$Network

$Remote_FS$syslog$Network

initInfoRequiredStop

必需-“INIT INFO”的停止部分。

$Remote_FS$syslog$Network

$Remote_FS$syslog$Network

initInfoDefaultStart

默认-“INIT INFO”的开始部分。

2 3 4 5

2 3 4 5

initInfoDefaultStop

“INIT INFO”的默认停止部分。

0 1 6

0 1 6

initInfoShortDescription

“INIT信息”的简短描述部分。

${project t.Description}的单行版本(回退到${task.base Name})

${project t.name}

initInfoDescription

“INIT信息”的说明部分。

${project t.Description}(回退到${task.base Name})

${project t.Description}(回退到${project t.name})

initInfoChkconfig

“INIT信息”的chkconfig部分

2345 99 01

2345 99 01

配置文件夹

conf_Folders的默认值

包含罐子的文件夹

包含罐子的文件夹

内联会议脚本

对应内联到默认启动脚本中的文件脚本的引用。这可用于在加载任何外部配置文件之前设置环境变量,如JAVA_OPTS

日志文件夹

LOG_Folders的默认值。仅对init.d服务有效

日志文件名

log_filename的默认值。仅对init.d服务有效

pidFolders

PID_Folders的默认值。仅对init.d服务有效

pidFilename

PID_Folders中的PID文件的名称的默认值。仅对init.d服务有效

useStartStopDaemon

是否应使用Start-Stop-daemon命令(如果可用)来控制进程

True

True

停止等待时间

STOP_WAIT_TIME的默认值(秒)。仅对init.d服务有效

60

60

Customizing a Script When It Runs

对于在编写JAR之后需要定制的脚本项,可以使用环境变量或配置文件

默认脚本支持以下环境属性:

Variable Description

模式

操作的“模式”。缺省值取决于构建JAR的方式,但通常是AUTO(这意味着它试图通过检查它是否是名为init.d的目录中的符号链接来猜测它是否是init脚本)。您可以显式地将其设置为SERVICE,以便STOP|START|STATUS|RESTART命令起作用,或者如果您想要在前台运行脚本,则设置为Run

Run_As_User

将用于运行应用程序的用户。如果未设置,则将使用拥有JAR文件的用户。

Use_Start_Stop_Daemon

是否应使用Start-Stop-daemon命令(如果可用)来控制该进程。默认为True

Pid_Folders

Pid文件夹的根名称(默认情况下为/var/run)。

日志文件夹

放置日志文件的文件夹的名称(默认为/var/log)。

conf_Folders

从中读取.conf文件的文件夹的名称(默认情况下与jar-file相同的文件夹)。

日志文件名

日志文件夹中日志文件的名称(默认为<;appname>;.log)。

APP_NAME

应用程序的名称。如果JAR是从符号链接运行的,则脚本猜测应用程序名称。如果它不是符号链接,或者您想要显式设置应用程序名称,这可能会很有用。

run_args

要传递给程序(Spring Boot应用程序)的参数。

JAVA_HOME

默认情况下,使用路径发现Java可执行文件的位置,但如果$JAVA_HOME/bin/Java中有可执行文件,则可以显式设置它。

JAVA_OPTS

在JVM启动时传递给它的选项。

JARFILE

JAR文件的显式位置,以防脚本用于启动实际上未嵌入的JAR。

调试

如果不为空,则在外壳进程上设置-x标志,允许您查看脚本中的逻辑。

STOP_WAIT_TIME

强制关闭前停止应用程序时等待的时间(以秒为单位)(默认为60)。

The PID_FOLDER, LOG_FOLDER, and LOG_FILENAME variables are only valid for an init.d service. For systemd, the equivalent customizations are made by using the ‘service’ script. See the service unit configuration man page for more details.

除了JARFILEAPP_NAME之外,可以使用.conf文件配置上一节中列出的设置。该文件应该位于JAR文件旁边,并且具有相同的名称,但后缀是.conf,而不是.jar。例如,名为/var/myapp/myapp.jar的JAR使用名为/var/myapp/myapp.conf的配置文件,如下例所示:

myapp.conf
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
If you do not like having the config file next to the jar file, you can set a CONF_FOLDER environment variable to customize the location of the config file.

要了解如何正确保护此文件,请参阅保护init.d服务的指南

2.3. Microsoft Windows Services

通过使用winsw,可以将Spring Boot应用程序作为Windows服务启动。

A(单独维护的示例)描述了如何为您的Spring Boot应用程序创建Windows服务。

3. What to Read Next

有关PaaS可以提供的功能类型的更多信息,请参阅Cloud FoundryHerokuOpenShiftBoxfuse网站。这只是四个最流行的Java PaaS提供程序。由于Spring Boot非常适合基于云的部署,您也可以自由考虑其他提供商。