5.5. UberJAR 的代理服务配置

本章节介绍配置 Nginx HTTP-server 作为 CUBA Uber JAR 应用程序的代理。

NGINX

对于 Nginx,下面有两种配置方法,所有示例都在 Ubuntu 16.04 测试通过。

  1. Direct Proxy - 直接代理

  2. Redirect to Path - 转发路径

假设,web 应用程序运行在 http://localhost:8080/app

Uber JAR 应用程序使用 Jetty 9.2 web 服务器。需要提前在 JAR 中配置 Jetty 用来分发 Nginx headers。

Jetty 配置
  • 使用内部的 jetty.xml

    首先,在项目根目录创建 Jetty 配置文件 jetty.xml,拷贝以下代码:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
    
    <Configure id="Server" class="org.eclipse.jetty.server.Server">
    
        <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
            <Set name="outputBufferSize">32768</Set>
            <Set name="requestHeaderSize">8192</Set>
            <Set name="responseHeaderSize">8192</Set>
    
            <Call name="addCustomizer">
                <Arg>
                    <New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/>
                </Arg>
            </Call>
        </New>
    
        <Call name="addConnector">
            <Arg>
                <New class="org.eclipse.jetty.server.ServerConnector">
                    <Arg name="server">
                        <Ref refid="Server"/>
                    </Arg>
                    <Arg name="factories">
                        <Array type="org.eclipse.jetty.server.ConnectionFactory">
                            <Item>
                                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
                                    <Arg name="config">
                                        <Ref refid="httpConfig"/>
                                    </Arg>
                                </New>
                            </Item>
                        </Array>
                    </Arg>
                    <Set name="port">8080</Set>
                </New>
            </Arg>
        </Call>
    </Configure>

    build.gradle 中添加 webJettyConfPath 属性到 buildUberJar 任务:

    task buildUberJar(type: CubaUberJarBuilding) {
        singleJar = true
        coreJettyEnvPath = 'modules/core/web/META-INF/jetty-env.xml'
        appProperties = ['cuba.automaticDatabaseUpdate' : true]
        webJettyConfPath = 'jetty.xml'
    }

    可以在 Studio 中通过 Deployment > UberJAR Settings 来生成 jetty-env.xml 文件,或者用以下代码:

    <?xml version="1.0"?>
    <!DOCTYPE Configure PUBLIC "-" "http://www.eclipse.org/jetty/configure_9_0.dtd">
    <Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext">
        <New id="CubaDS" class="org.eclipse.jetty.plus.jndi.Resource">
            <Arg/>
            <Arg>jdbc/CubaDS</Arg>
            <Arg>
                <New class="org.apache.commons.dbcp2.BasicDataSource">
                    <Set name="driverClassName">org.postgresql.Driver</Set>
                    <Set name="url">jdbc:postgresql://<Host>/<Database></Set>
                    <Set name="username"><User></Set>
                    <Set name="password"><Password></Set>
                    <Set name="maxIdle">2</Set>
                    <Set name="maxTotal">20</Set>
                    <Set name="maxWaitMillis">5000</Set>
                </New>
            </Arg>
        </New>
    </Configure>

    使用以下命令构建 Uber JAR:

    gradlew buildUberJar

    应用程序 JAR 包会被放置在 build/distributions/uberJar 目录,名称为 app.jar

    运行应用程序:

    java -jar app.jar

    按照 Tomcat 部分的介绍安装和配置 Nginx。

    按照选择配置 Nginx 的方法不同,可以通过 http://localhost/app 或者 http://localhost 地址访问应用。

  • 使用外部的 jetty.xml

    按照上面的描述使用和项目根目录的 jetty.xml 文件相同的配置文件。将这个文件放在其它目录,比如说用户主目录,不需要修改 build.gradle 里的 buildUberJar 任务。

    使用下列命令构建 Uber JAR:

    gradlew buildUberJar

    应用程序打包完了放在 build/distributions/uberJar 目录,默认名称是 app.jar

    首先,用带参数 -jettyConfPath 运行程序:

    java -jar app.jar -jettyConfPath jetty.xml

    然后按照 Tomcat 部分的介绍安装和配置 Nginx。

    按照选择配置 Nginx 的方法和 jetty.xml 文件的配置不同,可以通过 http://localhost/app 或者 http://localhost 地址访问应用。