Skip to content

Instantly share code, notes, and snippets.

@tangrui
Last active January 18, 2016 09:35
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tangrui/0c1ba4cc9145c47ba634 to your computer and use it in GitHub Desktop.
Save tangrui/0c1ba4cc9145c47ba634 to your computer and use it in GitHub Desktop.
如何在生产环境下为 CDEIO 应用部署 Jetty 服务器

简介

本文主要介绍如何以域模式为 CDE.IO 应用部署 Jetty 服务器。截止到本文编写时,Jetty 的最新版本为 9.3.6.v20151106,以下所有内容均是基于此版本描述的。

开始

官方网站下载 Jetty 压缩包,并解压到某个本地目录,下文将此解压目录以 $JETTY_HOME 代替。

应用程序

创建一个区别于 $JETTY_HOME 的其他目录,作为应用程序的根目录(下文以 $JETTY_BASE 代替此目录)。在这个目录下创建如下一些文件夹 etc, lib/btm, resources, start.d, webapps

将应用程序部署包放置到 $JETTY_BASE/webapps 目录下,为了配合 Jetty 的使用,需要删除如下一些文件:

  • WEB-INF/lib/slf4j-api-1.7.12.jar
  • WEB-INF/lib/logback-core-1.1.3.jar
  • WEB-INF/lib/logback-classic-1.1.3.jar

如果不存在,则忽略。

用 SLF4J 来管理日志

添加 module

$JETTY_HOME/modules 目录下,创建 logging.mod 文件(备份原有文件),内容如下:

#
# Jetty Module for SLF4J and Logback
#

[name]
logging

[depend]
resources

[lib]
lib/logging/*.jar

[files]
logs/
http://central.maven.org/maven2/org/slf4j/slf4j-api/1.7.12/slf4j-api-1.7.12.jar|lib/logging/slf4j-api-1.7.12.jar
http://central.maven.org/maven2/ch/qos/logback/logback-core/1.1.3/logback-core-1.1.3.jar|lib/logging/logback-core-1.1.3.jar
http://central.maven.org/maven2/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar|lib/logging/logback-classic-1.1.3.jar
https://raw.githubusercontent.com/jetty-project/logging-modules/master/logback/jetty-logging.properties|resources/jetty-logging.properties

复制 logback.xml 配置文件

将应用程序部署包中的 WEB-INF/classes/logback.xml 文件复制到 $JETTY_BASE/resources/ 目录下。

添加 JTA 支持

添加 jar 包

$JETTY_BASE/lib/btm 目录添加如下一些 jar 包(这些 jar 包都可以在编译过 cdeio-runtime 项目以后在本地的 Maven 库中找到):

  • btm-2.1.4.jar
  • btm-jetty9-lifecycle-2.1.4.jar
  • connector-api-1.5.jar
  • jta-1.1.jar
  • mysql-connector-java-5.1.34.jar

如果需要连接 Oracle 数据库,还要添加 ojdbc6-11.2.0.4.jar 文件。

添加 module

$JETTY_HOME/modules 目录下,创建 btm.mod 文件,内容如下:

#
# Jetty Module for Bitronix Transaction Manager
#

[name]
btm

[xml]
etc/btm.xml

[depend]
resources

[lib]
lib/btm/*.jar

添加 Jetty 配置文件

$JETTY_BASE/etc 目录下,创建 btm.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">
    <Call name="getConfiguration" class="bitronix.tm.TransactionManagerServices">
        <Set name="serverId">jetty-btm-node0</Set>
        <Set name="logPart1Filename"><SystemProperty name="jetty.home" default="." />/work/btm1.tlog</Set>
        <Set name="logPart2Filename"><SystemProperty name="jetty.home" default="." />/work/btm2.tlog</Set>
    </Call>

    <Call name="addManaged">
        <Arg>
            <New class="bitronix.tm.integration.jetty9.BTMLifeCycle"/>
        </Arg>
    </Call>
</Configure>

添加 BTM 配置文件

如果需要调整 BTM 的一些参数,可以在 $JETTY_BASE/resources 目录下创建 bitronix-default-config.properties 文件,并根据 BTM 的官方文档对参数进行配置与调整。

加密密码

当配置文件中需要出现明文密码的时候(例如数据库连接信息),可以使用如下方法对密码进行混淆或加密:

java -cp $JETTY_HOME/lib/jetty-util-9.3.6.v20151106.jar org.eclipse.jetty.util.security.Password <User> <Password>

注:jetty-util-9.3.6.v20151106.jar 文件名中的版本号会随着使用 Jetty 版本的不同而相应变化。

  • User 参数表示用户名
  • Password 参数表示该用户名的密码

例如,要对 MySQL 数据库的密码为 asecretpassword 的用户 cdeio 加密的话,就使用如下命令:

java -cp $JETTY_HOME/lib/jetty-util-9.3.6.v20151106.jar org.eclipse.jetty.util.security.Password cdeio asecretpassword

产生结果如下:

2015-07-09 14:31:19.403:INFO::main: Logging initialized @175ms
asecretpassword
OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m
MD5:fbb760b7dbf82666856500d4fd4a02c9
CRYPT:cdF3GWe/OBlQ2

因为数据库密码需要在程序运行的时候以原始形式与服务器进行校验,因此这里我们只能选择混淆以后的密码结果(OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m),该混淆后的密码对普通用户而言是不易读的,但是并不具有真正意义上的安全性,因为在程序运行期间会被转换为原始密码。

在配置文件中要使用混淆后的密码要如下配置:

<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
  <Arg></Arg>
  <Arg>jdbc/DSTest</Arg>
  <Arg>
    <New class="com.jolbox.bonecp.BoneCPDataSource">
      <Set name="driverClass">com.mysql.jdbc.Driver</Set>
      <Set name="jdbcUrl">jdbc:mysql://localhost:3306/foo</Set>
      <Set name="username">dbuser</Set>
      <Set name="password">
        <Call class="org.eclipse.jetty.util.security.Password" name="deobfuscate">
          <Arg>OBF:1s3g1yf41v1x1w8b1yf21vu91v9u1xfj1v8s1vv11yf41w9f1v2h1yf21s3m</Arg>
        </Call>
      </Set>
      <Set name="minConnectionsPerPartition">5</Set>
      <Set name="maxConnectionsPerPartition">50</Set>
      <Set name="acquireIncrement">5</Set>
      <Set name="idleConnectionTestPeriod">30</Set>
    </New>
  </Arg>
</New>

启动

$JETTY_BASE 目录下运行命令:

java -jar $JETTY_HOME/start.jar --add-to-startd=http,https,deploy,plus,logging,jsp,btm,ext,gzip,requestlog

如果是 Windows 用户,还需要在 $JETTY_BASE 目录下创建 start.ini 文件,并添加如下内容:

--Dfile.encoding=UTF-8

$JETTY_BASE 目录下运行 java -jar $JETTY_HOME/start.jar 即可启动系统。如果是 Windows 系统需要使用 java -jar $JETTY_HOME/start.jar --exec 来运行,因为在 start.ini 文件中添加了启动参数。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment