如何在 Tomcat 8.5 上部署 Broadleaf 5.2

How do I deploy Broadleaf 5.2 on Tomcat 8.5

我正在使用 Eclipse (photon) 和 Broadleaf 社区演示项目(站点、管理、api 和核心)。

我已经能够 运行 siteadminapi 在我的本地开发机器上使用嵌入式 Eclipse Web 服务器,现在我正在尝试将站点、管理和 api 项目部署为 AWS EC2 实例上的 WAR 运行宁 Tomcat 8.5 (JVM 1.7).

我已遵循 Broadleaf 文档:

plus many other Google search sites on the subject,但都没有成功。那它们都是从 2012 年到 2015 年的,并且参考了 BL 的旧版本(Servlet 3.0 之前)。

我什至尝试过 "web.xml" 方法:

Maven clean/install 生成的 WAR 文件(我也试过 "package"),看起来不像典型的 WAR 文件我'已经习惯了:

站点:(ROOT.war)

META-INF
org
WEB-INF

有人可以提供示例或网站,说明如何在 Tomcat 服务器上将 BLC 项目部署为 WAR 吗?

我得到的结果要么是端口 8443 上的 404,要么是空白页(使用 web.xml 方法时)。

很抱歉提出这个 open/vague 问题,但是关于 BLC 5.2 的文档很少甚至没有,我已经转向 Stack Overflow 寻求帮助。

谢谢


站点应用程序

@SpringBootApplication
@EnableAutoConfiguration
public class SiteApplication extends SpringBootServletInitializer {

    @Configuration
    @EnableBroadleafSiteAutoConfiguration
    public static class BroadleafFrameworkConfiguration {}

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SiteApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(SiteApplication.class, args);
    }

}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.mycompany-community</groupId>
        <artifactId>boot-community-demo</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>boot-community-demo-site</artifactId>
    <packaging>war</packaging>

    <name>Community Demo Site</name>
    <description>Web Module For Customized Broadleaf Commerce Site</description>

    <properties>
        <debug.port>8000</debug.port>
    </properties>

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.mycompany-community</groupId>
            <artifactId>boot-community-demo-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.broadleafcommerce</groupId>
            <artifactId>broadleaf-framework-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.broadleafcommerce</groupId>
            <artifactId>broadleaf-boot-starter-solr</artifactId>
        </dependency>
        <!--
        <dependency>
            <groupId>com.broadleafcommerce</groupId>
            <artifactId>broadleaf-boot-starter-hsql-database</artifactId>
        </dependency>
        -->
        <dependency>
            <groupId>com.broadleafcommerce</groupId>
            <artifactId>broadleaf-boot-starter-database</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>  
        <dependency>
            <groupId>org.broadleafcommerce</groupId>
            <artifactId>broadleaf-thymeleaf3-presentation</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.zhanhb</groupId>
            <artifactId>thymeleaf-layout-dialect</artifactId>
            <version>2.1.2</version>
        </dependency>
        <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>        
    </dependencies>

</project>

好的,我们想通了。我想分享我们采取的步骤,因为它是来自不同来源(BLC 和 Spring 引导站点)的 steps/information 的组合。


步骤 1:BLC 代码库

从以下位置下载源代码:https://github.com/BroadleafCommerce/DemoSite

我使用的文件是"DemoSite-develop-5.2.x".

将其解压缩到您的 IDE 可以 view/access 的位置。


步骤 2:IDE(本例中为 Eclipse)

按照本网站的步骤(几乎一字不差):

https://www.broadleafcommerce.com/docs/core/current/getting-started/ide-setup/eclipse-setup

您现在应该拥有站点管理员api 运行在本地连接,与内部 HSQL 数据库对话。

  • 管理员:https://localhost:8444/admin
  • 站点:https://localhost:8443/
  • API: https://localhost:8445/api/v1/swagger-ui.html

步骤 3:更改为 MySQL 数据库。

我几乎遵循了这些说明,step-by-step(尽管我的机器上已经有 MySQL):

https://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/key-aspects-and-configuration/database-configuration/mysql#


步骤 4:BLC 项目 code/xml 更改

一切都从这个开始 link:

https://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/key-aspects-and-configuration/app-server-configuration/deploying-a-.war-file

你在哪里找到:

  • 正在部署 .war 文件
  • 我的web.xml在哪里?

按照以下 87.1 中的步骤操作:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html#howto-create-a-deployable-war-file

基本上:

  • SpringSiteApplication.java
  • 中的 BootServletInitializer
  • <packaging>war</packaging>
  • pom.xml 文件中的 "spring-boot-starter-tomcat" 行。

然后我创建了一个 "web.xml" 文件,(虽然我不是 100% 确定我需要这个,因为我的 servlet 容器是 Servlet 3.1,BLC 文档说所有这些 web.xml 配置现在由注释处理)。

https://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/key-aspects-and-configuration/app-server-configuration/using-a-web.xml

基本上:

  • SiteApplication.java 中的 BroadleafBootServletContextInitializer
    • 您会注意到我们之前添加了 "SpringBootServletInitializer"。
    • 现在我们将 "SpringBootServletInitializer" 替换为 "BroadleafBootServletContextInitializer"。
  • 添加页面底部的 "web.xml"。
  • 不要忘记将 "context-param" 标签的 "param-value" 更改为正确的包裹位置。

第 5 步:Tomcat 更改

另一个 link 拥有您需要的大部分(如果不是全部):

https://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/key-aspects-and-configuration/app-server-configuration/tomcat

/bin

  • 新 "setenv.sh" 文件包含:

    export CATALINA_OPTS="-Xmx1536M -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
    

/conf

  • context.xml - 取消注释以下行

    `<Manager pathname="" />`
    
  • somenamehere-keystore(需要生成,或者抓取BLC代码库中的那个)

  • server.xml - 添加了 HTTPS 连接器:

    <Connector SSLEnabled="true" 
            clientAuth="false" 
            keystoreFile="/path/to/server/apache-tomcat-8.5.29/conf/*somenamehere*.keystore" 
            keystorePass="BLCPassword" 
            keyPass="BLCPassword" 
            keystoreType="PKCS12"
            ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA"
            maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLSv1.2"/>
    
    
    
    Note that I had to add the "keystoreType" attribute due to 
    my keystore being in the PKCS12 format, as opposed to JKS.
    
    The "ciphers" attribute was added as I got an exception 
    complaining about the TLS I was using.
    
  • tomcat-users.xml

    Added the following two lines:
    
    <role rolename="manager-gui"/>
    <user username="admin" password="ReallyHardToGuessPW" roles="manager-gui,admin-gui"/>
    
    I'm not sure if this step was 100% needed, but it allows me 
    to see the BLC projects within the "manager" app of Tomcat.
    

/webapps

  • host-managermanager apps

    In the "META-INF" of these apps I commented out both the "Valve" and "Manager" 
    tags in the "Context".
    
    This was extracted from this link:
    
        https://www.howtoforge.com/tutorial/how-to-install-apache-tomcat-8-5-on-ubuntu-16-04/
    
    (Look at "Step 6")
    
    This appears to be the only difference in my earlier attempts in 
    getting this running (pre-cry-for-SO-help), as yesterday and this 
    morning I had already performed all the steps in this post.   
    

步骤 6:Maven 清理和安装

在 Eclipse 中,在每个站点和管理项目上("boot-community-site" 和 "boot-community-admin"),right-click 和 select 运行 作为 >> Maven clean。一旦完成 运行 运行 As >> Maven install.

现在在每个项目的 "target" 目录中,您应该会看到一个 WAR 文件,(站点项目为 "ROOT",管理项目为 "admin")。


步骤 7:启动 Tomcat 服务器

我启动了 Tomcat 服务器,其中的常驻应用程序(文档、示例、host-manager、管理器和 ROOT)保持不变。然后我 hot-deployed BLC "admin.war" 和 "ROOT.war" (站点)到 Tomcat /webapps 目录。

如果这对您不起作用,您可以随时停止 Tomcat 服务器并将 ROOT.war 和 admin.war 文件放在 /webapps 目录中。然后启动服务器。

如果一切顺利,在启动时查看 "catalina.out" 日志文件,您将看到一条 ASCII "Broadleaf Commerce" 消息滚动,每个 BLC 应用程序一次,然后是一堆 MySQL 休眠消息。 "m5.large" AWS EC2 实例上站点和管理员的整个启动时间似乎约为 4 分钟。

我会在想到我错过的内容时添加到这里,但我现在在 Tomcat 8.5 容器上安装了 BLC 5.2 运行ning。

希望它对其他遇到同样问题的人有用。

非常有帮助的指南。我想添加一些关于 步骤 5 的内容,尤其是关于负载平衡器环境中的 spring 安全性的内容。

由于 SSL 将发生在前端代理上,spring 的安全性 requiresSecure() 可能会导致无休止的重定向循环。

这个解释的很深入here and here

一个解决方案是:

在前端代理上安装 ssl 证书后,将这两个请求 headers 包含在您的 .properties 文件中:

server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto

不需要从 tomcat 进行重定向,因此您不必按照第 5 步所述在 server.xml 中包含 https 连接器。

只需添加这两行

secure="true"

scheme="https"

在您 tomcat 的 server.xml

的默认连接器上
<Connector port="hereisyourdefaultportofyourtomcat" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           secure="true"
           scheme="https" 
           />

请注意:front-end 代理应发送上述请求 headers。大多数 cases.Check here

默认情况下会发生这种情况