Start

和tomcat相比

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

版本选择

下载地址:http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/
在这里插入图片描述

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

参考 https://github.com/472732787/jetty

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 (查看结果)

在这里插入图片描述

启动# 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

  1. 配置路径
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

在这里插入图片描述

  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

效果
在这里插入图片描述

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 共享

准备:

  1. 部署2个应用(myjetty.war 端口分别 8060 800,分别访问查看效果)
    http://localhost:8060/HelloServlet?name=liuli
    http://localhost:8070/HelloServlet?name=liuli
  2. 用nginx做负载,之后访问查看效果
    http://localhost/HelloServlet?name=liuli

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

不推荐

Redis

https://github.com/ovea-deprecated/jetty-session-redis 2012之后就没更新了,不推荐使用。

本文中用到的脚本,资料 请移步:https://github.com/472732787/jetty

参考资料:
http://www.eclipse.org/jetty/documentation/current/ 当前版本
http://www.eclipse.org/jetty/previousversions.html 历史版本
http://www.eclipse.org/jetty/documentation/9.2.22.v20170531/ 9.2版本
http://www.eclipse.org/jetty/documentation/9.3.22.v20171030/ 9.3版本
文档下载:
http://central.maven.org/maven2/org/eclipse/jetty/jetty-documentation/

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐