Start

和tomcat相比

  1. Jetty更轻量级
  2. Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server。
  3. 当支持大规模企业级应用时,Jetty也许需要扩展,在这场景下Tomcat便是更优的。
    总结:Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。

版本选择

jetty(官方文档翻译9.2)_jar

In Maven

7.0之前:http://mvnrepository.com/artifact/org.mortbay.jetty/jetty 
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>7.0.0.pre5</version>
</dependency>
7.0之后:http://central.maven.org/maven2/org/eclipse/jetty/jetty-project/
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId>
<version>${project.version}</version>
</dependency>

启动-win

C:\Users\liuli>cd D:\jetty\jetty-distribution-9.2.9
C:\Users\liuli>d:
D:\jetty\jetty-distribution-9.2.9>java -jar start.jar

jetty(官方文档翻译9.2)_jar_02

启动-linux

tar -zxvf jetty-distribution-9.2.9.v20150224.tar.gz
mv jetty-distribution-9.2.9.v20150224 jetty-distribution-9.2.9
配置环境变量(可选)
vim /etc/profile
export JETTY_HOME=/home/jetty-distribution-9.2.9
#source /etc/profile
启动:
#cd $JETTY_HOME
#java -jar start.jar
or
#java -jar $JETTY_HOME/start.jar
指定端口
#java -jar $JETTY_HOME/start.jar jetty.port=8081
#java -jar $JETTY_HOME/start.jar jettys.port=8843

Configuration

查看系统配置:

#java -jar start.jar --list-config

配置顺序:

ini files

mod files

XML files

web.xml

Property Files

配置服务器【org.eclipse.jetty.server.Server etc/jetty.xml】:

ThreadPool

Handlers

Server Attributes

Server fields

Connectors (etc/jetty-https.xml)

Services

配置连接器【etc/jetty-http.xml, jetty-https.xml和 jetty-spdy.xm】

Port

Host

Idle Timeout(空闲超时)

HTTP Configuration

SSL Context Factory

配置上下文(${jetty.base}/webapps/myjetty.xml)

contextPath (设置war路径)

virtualHost(用于绑定域名)

classPath()

attributes(参数配置)

resourceBase(静态资源的目录)

Logging配置

查找方式:

首先从一个Classpath Resource调用 jetty-logging.properties(如果找到)。

然后从System.getProperties()。

配置

在 ${jetty.base}/start.ini 添加 --module=logging

jetty(官方文档翻译9.2)_mongodb_03

启动:

日志输出的默认配置将创建一个文件${jetty.logs}/yyyy_mm_dd.stderrout.log

参考:

${jetty.base}/jetty.conf

${jetty.base}/jetty-logging.xml

默认部署

临时目录

Jetty本身没有临时目录,在根下创建work

将WAR文件放入${jetty.base}/webapps/目录中

http://{host}:8080/{warname}/

jetty(官方文档翻译9.2)_eclipse_04

访问路径

“jetty-”+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits+".dir"

jetty(官方文档翻译9.2)_java_05

自定义部署

指定目录:

${jetty.base}/webapps/目录中,创建xml文件(为方便识别,最好用项目名称myjetty.xml)

jetty(官方文档翻译9.2)_mongodb_06

文件服务器

${jetty.home}/webapps/scratch.xml

jetty(官方文档翻译9.2)_xml_07

jetty(官方文档翻译9.2)_eclipse_08

<Set name="directoriesListed">false</Set>

jetty(官方文档翻译9.2)_xml_09

绑定域名

绑定域(可以是多个):

  <Set name="virtualHosts">
<Array type="java.lang.String">
<Item>www.test.com</Item>
</Array>
</Set>

修改端口

start.ini   
## HTTP port to listen on
jetty.port=8080

动态部署

路径:${jetty.home}/webapps/

${jetty.home}/etc/jetty-deploy.xml

jetty(官方文档翻译9.2)_eclipse_10

monitoredDirName要扫描Web应用程序的目录的文件路径或URL。

scanInterval用于更改的扫描周期(以秒为单位)

extractWars 如果参数为true,则任何打包的WAR或zip文件在部署前首先被提取到临时目录。如果Web应用程序中存在未编译的JSP,设置为true

FormSize

Max Form Size 限制客户到服务器提交数据大小,有助于保护服务器免受发送大量数据的恶意客户端的拒绝服务攻击.。默认200000字节

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<!-- - - - - - - - - - - - - - - - - - - - - - - - -- - -->
<!-- Max Form Size -->
<!-- - - - - - - - - - - - - - - - - - - - - - -->
<Set name="maxFormContentSize">200000</Set>
</Configure>

https

所有密码:123456

相关文件: start.ini etc/jetty-ssl.xml etc/jetty-https.xml

• dname的值详解:

  CN(Common Name名字与姓氏【域名】)

  OU(Organization Unit组织单位名称)

  O(Organization组织名称)

  L(Locality城市或区域名称)

  ST(State州或省份名称)

  C(Country国家名称)

一、生成密钥对和证书

使用JDK的keytool生成密钥和证书

(以下命令直接将密钥对和证书生成到文件中keystore:)

#keytool -keystore keystore -alias jetty -validity 3650 -genkey -keyalg RSA

您现在具有运行SSL连接的最低要求,并可以直接进行配置SSL连接器

使用xml

修改start.ini 在 jetty.dump.stop=:后添加:

etc/jetty-ssl.xml

etc/jetty-https.xml

修改端口etc/jetty-https.xml:

注意:https默认端口为443 ,如果启动不起来,看下是否被占用,建议修改成其他,这里使用8843

jetty(官方文档翻译9.2)_java_11

启动(系统默认证书)

jetty(官方文档翻译9.2)_eclipse_12

配置证书etc/jetty-ssl.xml:

jetty(官方文档翻译9.2)_xml_13

1.替换 /etc/keystore文件

2.在配置文件中修改证书的密码

jetty(官方文档翻译9.2)_mongodb_14

使用start.ini

--module=ssl
jetty.secure.port=8443
jetty.keystore=etc/keystore
jetty.truststore=etc/keystore
jetty.keystore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4
jetty.keymanager.password=OBF:1u2u1wml1z7s1z7a1wnl1u2g
jetty.truststore.password=OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4

密码安全

$ java -cp lib/jetty-util-$JETTY_VERSION.jar org.eclipse.jetty.util.security.Password
Usage - java org.eclipse.jetty.util.security.Password [<user>] <password>
If the password is ?, the user will be prompted for the password
#java -cp lib/jetty-util-9.2.9.v20150224.jar org.eclipse.jetty.util.security.Password jrtty 123456

jetty(官方文档翻译9.2)_mongodb_15

123456
OBF:19iy19j019j219j419j619j8
MD5:e10adc3949ba59abbe56e057f20f883e
CRYPT:jrBNjeORtvBWo

(https配置安全升级)

jetty(官方文档翻译9.2)_java_16

linux-进程管理

#ps -ef|grep java
#ps -ef|grep jetty
#kill -9
#killall java

nginx+jetty+https

Administration

start

start.jar
服务类路径
# java -jar start.jar --list-classpath
启用的模块
# java -jar start.jar --list-modules
查看系统配置:
# java -jar start.jar --list-config
其他(# java -jar start.jar --help)
--version
--dry-run
--exec
--start-log-file=<filename>
--module=<name>,(<name>)*
-add-to-start=<name>,(<name>)*
--add-to-startd=<name>,(<name>)*
--write-module-graph=<filename>
--stop
STOP.PORT=<number>
STOP.KEY=<alphanumeric>
STOP.WAIT=<number>

init.sh

# cp bin/jetty.sh /etc/init.d/jetty
#在jetty根目录下执行
# echo JETTY_HOME=`pwd` > /etc/default/jetty
#(可在在所有目录下执行,前提是配置了JETTY_HOME)
# echo JETTY_HOME=$JETTY_HOME > /etc/default/jetty
# cat /etc/default/jetty (查看结果)

jetty(官方文档翻译9.2)_jar_17

启动# service jetty start

jetty(官方文档翻译9.2)_eclipse_18

prunsrv.exe

prunsrv 配置为windows 服务
http://commons.apache.org/proper/commons-daemon/procrun.html
安装服务(//IS)
prunsrv //IS//TestService --DisplayName="Test Service" \
--Install=prunsrv.exe --Jvm=auto --StartMode=jvm --StopMode=jvm \
--StartClass=org.apache.SomeStartClass --StartParams=arg1;arg2;arg3 \
--StopClass=org.apache.SomeStopClass --StopParams=arg1#arg2
更新服务(//US)
prunsrv //US//TestService --Description="Some Dummy Service" \
--Startup=auto --Classpath=%CLASSPATH%;test.jar
删除服务(//DS)
prunsrv //DS//TestService
测试服务(//TS)
prunsrv //TS//TestService [additional arguments]

init.bat

安装为一个win服务 install-jetty-service.bat

  1. 配置路径
C:\>mkdir opt
C:\>cd opt
C:\opt>mkdir jetty logs myappbase temp
C:\opt>dir

jetty(官方文档翻译9.2)_xml_19

2. 安装jdk

3. 获取ProcRun(commons-daemon-1.0.15-bin-windows.zip)

把prunmgr.exe 和 prunsrv.exe

jetty(官方文档翻译9.2)_mongodb_20

4. 解压jetty 到C:\opt\jetty

jetty(官方文档翻译9.2)_java_21

5. 初始化工作目录

cd myappbase java -jar …\jetty\start.jar
–add-to-start=deploy,http,logging

jetty(官方文档翻译9.2)_mongodb_22

  1. 配置脚本并执行(注意要已管理员身份运行)
@echo off
set SERVICE_NAME=JettyService
set JETTY_HOME=C:\opt\jetty
set JETTY_BASE=C:\opt\myappbase
set STOPKEY=secret
set STOPPORT=50001

set PR_INSTALL=C:\opt\prunsrv.exe

@REM Service Log Configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=C:\opt\logs
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_LOGLEVEL=Debug

@REM Path to Java Installation
set JAVA_HOME=D:\DataBase\Java1.7\jdk1.7.0_79
set PR_JVM=D:\DataBase\Java1.7\jre7\bin\server\jvm.dll
set PR_CLASSPATH=%JETTY_HOME%\start.jar;%JAVA_HOME%\lib\tools.jar

@REM JVM Configuration
set PR_JVMMS=128
set PR_JVMMX=512
set PR_JVMSS=4000
set PR_JVMOPTIONS=-Duser.dir="%JETTY_BASE%";-Djava.io.tmpdir="C:\opt\temp";-Djetty.home="%JETTY_HOME%";-Djetty.base="%JETTY_BASE%"
@REM Startup Configuration
set JETTY_START_CLASS=org.eclipse.jetty.start.Main

set PR_STARTUP=auto
set PR_STARTMODE=java
set PR_STARTCLASS=%JETTY_START_CLASS%
set PR_STARTPARAMS=STOP.KEY="%STOPKEY%";STOP.PORT=%STOPPORT%

@REM Shutdown Configuration
set PR_STOPMODE=java
set PR_STOPCLASS=%JETTY_START_CLASS%
set PR_STOPPARAMS=--stop;STOP.KEY="%STOPKEY%";STOP.PORT=%STOPPORT%;STOP.WAIT=10

%PR_INSTALL% //IS/%SERVICE_NAME% ^
--DisplayName="%SERVICE_NAME%" ^
--Install="%PR_INSTALL%" ^
--Startup="%PR_STARTUP%" ^
--LogPath="%PR_LOGPATH%" ^
--LogPrefix="%PR_LOGPREFIX%" ^
--LogLevel="%PR_LOGLEVEL%" ^
--StdOutput="%PR_STDOUTPUT%" ^
--StdError="%PR_STDERROR%" ^
--JavaHome="%JAVA_HOME%" ^
--Jvm="%PR_JVM%" ^
--JvmMs="%PR_JVMMS%" ^
--JvmMx="%PR_JVMMX%" ^
--JvmSs="%PR_JVMSS%" ^
--JvmOptions="%PR_JVMOPTIONS%" ^
--Classpath="%PR_CLASSPATH%" ^
--StartMode="%PR_STARTMODE%" ^
--StartClass="%JETTY_START_CLASS%" ^
--StartParams="%PR_STARTPARAMS%" ^
--StopMode="%PR_STOPMODE%" ^
--StopClass="%PR_STOPCLASS%" ^
--StopParams="%PR_STOPPARAMS%"

if not errorlevel 1 goto installed
echo Failed to install "%SERVICE_NAME%" service. Refer to log in %PR_LOGPATH%
goto end

:installed
echo The Service "%SERVICE_NAME%" has been installed

:end

效果

jetty(官方文档翻译9.2)_java_23

SERVICE_NAME

这是Windows看到的服务的名称。“服务”窗口中的名称将显示该名称。

STOPKEY

这是ShutdownMonitor的密钥(密码),用于发出停止服务器的正式命令。

STOPPORT

Shutdown Monitor侦听停止命令的端口。

如果您在同一台计算机上有多个Jetty服务器,则每个服务的此端口将需要不同

使用:

net start JettyService
net stop JettyService
net restart JettyService

jetty(官方文档翻译9.2)_jar_24

JNDI

(Java Naming and Directory Interface,Java命名和目录接口)
启用:--module=jndi 【start.ini】

java -jar ../start.jar --add-to-startd=jndi
数据源
**mysql**
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
<Set name="Url">jdbc:mysql://localhost:3306/databasename</Set>
<Set name="User">user</Set>
<Set name="Password">pass</Set>
</New>
</Arg>
</New>
**oracle**
<New id="DSTest" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg></Arg>
<Arg>jdbc/DSTest</Arg>
<Arg>
<New class="oracle.jdbc.pool.OracleDataSource">
<Set name="DriverType">thin</Set>
<Set name="URL">jdbc:oracle:thin:@fmsswdb1:10017:otcd</Set>
<Set name="User">xxxx</Set>
<Set name="Password">xxxx</Set>
<Set name="connectionCachingEnabled">true</Set>
<Set name="connectionCacheProperties">
<New class="java.util.Properties">
<Call name="setProperty">
<Arg>MinLimit</Arg>
<Arg>5</Arg>
</Call>
<!-- put the other properties in here too -->
</New>
</Set>
</New>
</Arg>
</New>

Optimizing

【调整JVM垃圾收集(GC)可以极大地改善Jetty的性能,GC的最佳调整取决于应用程序的行为,需要详细的分析,但有一般的建议。】

要打印用于配置JVM的隐式标志:
-XX:+ PrintCommandLineFlags
禁用RMI定期执行的显式GC:
-XX:+ DisableExplicitGC
打印详细信息GC活动的日期和时间戳:
-XX:+ PrintGCDateStamps \
-XX:+ PrintGCTimeStamps \
-XX:+ PrintGCDetails \
-XX:+ PrintTenuringDistribution
将GC详细信息记录到文件中:
-Xloggc:[path/to/gc.log]
以较少的细节打印GC活动:
-verbose:gc
要在80%的老一代满的情况下使用完全GC的并发marksweep GC:
-XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=80

Session 持久化

持久化(如果启用持久性,则在关闭完成之前将所有现有的有效会话保存到磁盘。在重新启动时,Jetty恢复保存的会话)

<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler">
<Arg>
<New class="org.eclipse.jetty.server.session.HashSessionManager">
<Set name="storeDirectory">your/chosen/directory/goes/here</Set>
</New>
</Arg>
</New>
</Set>

延时加载(确保在servlet环境启动之后加载会话):

<Set name="lazyLoad">true</Set>

在Jetty Maven启用

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.0.0.RC2 (or current version)</version>
<configuration>
<!-- ... -->
<webAppConfig implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<defaultsDescriptor>${project.build.outputDirectory}/META-INF/webdefault.xml</defaultsDescriptor>
<contextPath>${jetty.contextRoot}</contextPath>
<sessionHandler implementation="org.eclipse.jetty.server.session.SessionHandler">
<sessionManager implementation="org.eclipse.jetty.server.session.HashSessionManager">
<storeDirectory>${project.basedir}/target/jetty-sessions</storeDirectory>
<idleSavePeriod>1</idleSavePeriod>
</sessionManager>
</sessionHandler>
</webAppConfig>
<!-- ... -->
</configuration>
</plugin>

Session 共享

准备:

  1. 部署2个应用(myjetty.war 端口分别 8060 800,分别访问查看效果)
    用nginx做负载,之后访问查看效果

Mongodb

准备:配置好mongodb 并启动

  1. 在jetty.xml配置(org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager)
<!--mongodb  session共享  start-->
<New id="mongodb" class="com.mongodb.MongoClient">
<Arg type="java.lang.String">127.0.0.1</Arg>
<Arg type="int">27017</Arg>
<Call name="getDB">
<Arg>jetty_session</Arg>
<Call id="sessionDocument" name="getCollection">
<Arg>jetty_session_collection</Arg>
</Call>
</Call>
</New>
<Set name="sessionIdManager">
<New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager">
<Arg>
<Ref id="Server" />
</Arg>
<Arg>
<Ref id="sessionDocument" />
</Arg>
<Set name="workerName">fred</Set>
<Set name="scavengePeriod">60</Set>
</New>
</Set>
<Call name="setAttribute">
<Arg>mongoIdMgr</Arg>
<Arg>
<Ref id="mongoIdMgr" />
</Arg>
</Call>
<!--mongodb session共享 end -->

  1. 配置应用映射(myjetty.xml)
   <!--mongodb  session共享  start-->  
<Ref name="Server" id="Server">
<Call id="mongoIdMgr" name="getSessionIdManager"/>
</Ref>
<Set name="sessionHandler">
<New class="org.eclipse.jetty.server.session.SessionHandler">
<Arg>
<New id="mongoMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionManager">
<Set name="sessionIdManager">
<Ref id="mongoIdMgr"/>
</Set>
</New>
</Arg>
</New>
</Set>
<!--mongodb session共享 end -->

DB

不推荐