Start
和tomcat相比
- Jetty更轻量级
- Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server。
- 当支持大规模企业级应用时,Jetty也许需要扩展,在这场景下Tomcat便是更优的。
总结:Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。
版本选择
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
启动-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.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-”+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits+".dir"
自定义部署
指定目录:
${jetty.base}/webapps/目录中,创建xml文件(为方便识别,最好用项目名称myjetty.xml)
文件服务器
${jetty.home}/webapps/scratch.xml
<Set name="directoriesListed">false</Set>
绑定域名
绑定域(可以是多个):
<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
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
启动(系统默认证书)
配置证书etc/jetty-ssl.xml:
1.替换 /etc/keystore文件
2.在配置文件中修改证书的密码
使用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
123456
OBF:19iy19j019j219j419j619j8
MD5:e10adc3949ba59abbe56e057f20f883e
CRYPT:jrBNjeORtvBWo
(https配置安全升级)
linux-进程管理
#ps -ef|grep java
#ps -ef|grep jetty
#kill -9
#killall java
nginx+jetty+https
Administrationstart
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 (查看结果)
启动# service jetty start
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
- 配置路径
C:\>mkdir opt
C:\>cd opt
C:\opt>mkdir jetty logs myappbase temp
C:\opt>dir
2. 安装jdk
3. 获取ProcRun(commons-daemon-1.0.15-bin-windows.zip)
把prunmgr.exe 和 prunsrv.exe
4. 解压jetty 到C:\opt\jetty
5. 初始化工作目录
cd myappbase java -jar …\jetty\start.jar
–add-to-start=deploy,http,logging
- 配置脚本并执行(注意要已管理员身份运行)
@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
效果
SERVICE_NAME
这是Windows看到的服务的名称。“服务”窗口中的名称将显示该名称。
STOPKEY
这是ShutdownMonitor的密钥(密码),用于发出停止服务器的正式命令。
STOPPORT
Shutdown Monitor侦听停止命令的端口。
如果您在同一台计算机上有多个Jetty服务器,则每个服务的此端口将需要不同
使用:
net start JettyService
net stop JettyService
net restart JettyService
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 共享
准备:
- 部署2个应用(myjetty.war 端口分别 8060 800,分别访问查看效果)
用nginx做负载,之后访问查看效果
Mongodb
准备:配置好mongodb 并启动
- 在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 -->
- 配置应用映射(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
不推荐