spring-boot 需要启动nginx吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-boot 需要启动nginx吗相关的知识,希望对你有一定的参考价值。

参考技术A 在开发Spring Boot应用的过程中,Spring Boot直接执行public static void main()函数并启动一个内嵌的应用服务器(取决于类路径上的以来是Tomcat还是jetty)来处理应用请求。对于生产环境,这样的部署方式同样有效,同时Spring Boot也支持传统的部署方式——将war包放入应用服务器中启动运行。
内嵌应用服务器
在使用Maven或Gradle构建Spring Boot应用的过程中,Spring Boot插件提供了巨大的帮助,除了生命各类预定义的依赖,它还能够构建可以直接运行的jar包——包含了所有的依赖以及内嵌应用服务器。应用的分发也就变得非常简单,任何人拿到了这个jar包,只需要简单运行java -jar your.jar就可以启动应用,无需任何构建工具、安装过程以及应用服务器。
内嵌应用服务器配置
在生产环境中,应用服务器需要各类配置,Spring Boot本身提供了一种非常简单的配置机制——application.properties:

server.port=8080 # 监听端口
server.address= # 绑定的地址
server.session-timeout= #session有效时长
server.context-path= #默认为/
server.ssl.* #ssl相关配置

Tomcat
默认情况下,Spring Boot启动的内嵌容器就是Tomcat,对于Tomcat有几个非常重要的配置:

server.tomcat.basedir=/tmp

tomcat的baseDir,日志、dump等文件都存在于这个目录中,一般是系统的临时文件夹/tmp,但也可以按照自己的需求变更位置。

server.tomcat.access-log-pattern= # log pattern of the access log
server.tomcat.access-log-enabled=false # is access logging enabled

这两个配置打开Tomcat的Access日志,并可以设置日志格式。
Jetty
如果你不喜欢Tomcat,Jetty也是一个非常不错的选择。使用Jetty的方式也非常简单——把tomcat依赖从Maven或Gradle中移除,加入Jetty内嵌容器的依赖:

org.springframework.boot
spring-boot-starter-web

org.springframework.boot
spring-boot-starter-tomcat

org.springframework.boot
spring-boot-starter-jetty

Java EE应用服务器
除了内嵌容器的部署模式,Spring Boot也支持将应用部署至已有的Tomcat容器, 或JBoss, WebLogic等传统Java EE应用服务器。
以Maven为例,首先需要将从jar改成war,然后取消spring-boot-maven-plugin,然后修改Application.java:

package demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer

public static void main(String[] args)
SpringApplication.run(applicationClass, args);


@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
return application.sources(applicationClass);


private static Class applicationClass = Application.class;


接下来打包应用,将生成的war包放入应用服务器目录即可。
使用外部配置文件
在应用程序中有很多配置项,例如数据库连接地址、日志文件位置、应用服务器配置等等。为了安全与灵活性,我们推荐将Spring Boot的配置文件放在生产环境的服务器上,并严格控制访问权限。在运行应用时可以通过命令行参数指定配置文件:

java -jar location_of_your_jar_file.jar --spring.config.location=location_of_your_config_file.properties

这样做的好处是:
配置位于生产环境中,数据库连接等私密信息不容易泄露
灵活性强,同一份代码(包括构建的jar包)可以应用于不同的环境配置(开发、测试、生产)
使用Profile区分环境
在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:

@Service
@Profile("dev")
class DevEmailService implements EmailService

public void send(String email)
//Do Nothing



@Service
@Profile("prod")
class ProdEmailService implements EmailService

public void send(String email)
//Real Email Service Logic



@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢看
在配置文件中指定
在application.properties中加入:

spring.profiles.active=dev

通过命令行参数

java -jar app.jar --spring.profiles.active=dev

以服务的形式运行应用
使用java命令运行应用非常简单,但是通常我们都是通过ssh命令连接到服务器并运行它,一旦ssh连接断开,那么由它fork的java子进程也就随之销毁了。所以我们必须借助工具将应用作为服务运行在服务器上:
Systemd
systemd 是Linux 下的一款系统和服务管理器。可以为Spring Boot应用编写启动脚本:

[Unit]
Description=Spring Boot Application

[Service]
ExecStart=/usr/bin/java -jar location_of_jar_file.jar --spring.config.location=location_of_config.properties --spring.profiles.active=profile
User=$your expected user

[Install]
WantedBy=multi-user.target

Supervisord
Supervisord是用Python实现的一款非常实用的进程管理工具。可以为Spring Boot应用编写:

[program:app]
command=/usr/bin/java -jar location_of_jar_file.jar --spring.config.location=location_of_config.properties --spring.profiles.active=profile
user=$your expected user
autostart=true
autorestart=true
startsecs=10
startretries=3

spring-boot项目需要单独安装Tomcat吗?

【中文标题】spring-boot项目需要单独安装Tomcat吗?【英文标题】:Do I need to install Tomcat separately for spring-boot project? 【发布时间】:2019-02-21 20:47:39 【问题描述】:

我有一个 spring-boot 项目,我有以下设置:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
        </dependency>

我问这个的原因是,有一次我可以在 IntelliJ IDE 和终端 (mvn spring-boot:run) 上运行我的 web(war 包)应用程序来启动应用程序,然后我可以使用 localhost将http请求发送到restful服务。我没有单独安装Tomcat。

过了一段时间,我仍然可以在 IntelliJ 中成功运行我的 Web 应用程序,但无法通过“mvn spring-boot:run”运行它。我想这是由于我的 pom 文件发生了一些变化。错误信息似乎与 Tomcat 相关:

[WARNING] 
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:506)
    at java.lang.Thread.run (Thread.java:748)
Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh (EmbeddedWebApplicationContext.java:137)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:536)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:761)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:371)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1186)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1175)
    at com.jd.jnlu.qe.boot.JnluQEWebStart.main (JnluQEWebStart.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:506)
    at java.lang.Thread.run (Thread.java:748)
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat

如果我在我的机器上安装 Tomcat 以便能够通过 'mvn spring-boot:run' 运行它会有帮助吗?另外,目前我没有安装 Tomcat 或 Apache 服务器,我是否可以在 IntelliJ 中成功安装 Web 应用程序?

【问题讨论】:

不,不会。它启动一个嵌入式容器。不要尝试随机的事情来解决问题。相反,请阅读异常的完整堆栈跟踪以找出问题所在。另外,请阅读 spring boot 文档:它解释了 spring boot 的工作原理。 问题是我不知道是什么问题。我用谷歌搜索了很多,但找不到解决问题的线索。 堆栈跟踪中应该有更多关于嵌入式 tomcat 没有启动的原因 你能不能把你的 pom 从 war 换成 jar,然后从 cod 行重新开始。您可能还需要删除 tomcat 依赖项,因为 web 有一个或需要从 web 中排除 【参考方案1】:

您已注释掉为 tomcat 提供的范围。 在这种状态下,它默认为编译范围,这意味着当您启动应用程序时(无论您使用哪种方法),它都会在类路径中可用。

当您取消注释并将其置于提供的范围内时,这意味着它仅在编译时可用,并且您希望 JDK 或容器提供对类路径的依赖。如果您将其部署到独立的 tomcat 实例,这是有道理的。

就像 JB Nizet 已经说过的,Spring-boot 使用并启动一个嵌入式 tomcat 容器。但是为了做到这一点,它需要依赖!

按照其他人的建议,您应该阅读 spring-boot 的文档以了解它的工作原理。让您入门:这是一个很好的方法,它解释了使用 maven https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started-first-application.html#getting-started-first-application-run 运行 spring-boot 应用程序的基础知识 希望您能够从那里重新制作它。

注意 spring-boot-starter-web 依赖于 spring-boot-starter-tomcat!

【讨论】:

以上是关于spring-boot 需要启动nginx吗的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot 需要启动nginx吗

为什么整合jsp后必须通过spring-boot:run方式启动?

nginx 部署多个 spring-boot jar 方式项目

spring-boot项目需要单独安装Tomcat吗?

如何在不依赖 MongoDB 的情况下启动 spring-boot 应用程序?

Tomcat需要很长时间才能识别spring-boot应用程序的启动