Tomcat
编程语言:
系统级:C, C++, go, erlang 应用级:C#, Java, Python, Perl, Ruby, php 虚拟机:jvm, pvm 动态网站:asp .net, jsp
Java编程语言:
SUN, James Gosling, Green Project, Oak, Java, SunWorld 1995: Java 1.0, Write Once, Run Anywhere 1996: JDK (Java Development Kit),包含一个JVM(Sun Classic VM) JDK 1.0: JVM, Applet, AWT 1997:JDK 1.1 JAR文档格式、JDBC、JavaBeans 1998:JDK 1.2 Sun把Java技术分拆为三个方向:Java 2 J2SE: Standard Edition J2EE:Enterprise Edition J2ME:Mobile Edition 代表性技术:EJB, Java Plug-in, Swing, JIT编译器: Just In Time,即时编译器 2000:JDK 1.3 1999:HotSpot虚拟机 2002:JDK 1.4 2006年,Sun开源了Java技术;遵循GPL规范;并建立了OpenJDK组织管理此些代码; 虚拟机:JRockit, HostSpot;
编程语言的类别:指令+数据
- 面向过程:以指令为中心,围绕指令组织数据
- 面向对象:以数据为中心,围绕数据组织指令
Java体系结构:
- Java编程语言
- Java Class文件格式
- Java API
- Java VM
JVM的核心组成部分:
- Class Loader
- 执行引擎
Java编程语言的特性:
- 面向对象、多线程、结构化错误处理
- 垃圾收集、动态链接、动态扩展
三个技术流派:
- J2SE ==> Java 2 SE
- J2EE ==> Java 2 EE
- J2ME ==> Java 2 ME
JVM运行时区域:运行为多个线程
- 方法区:线程共享;用于存储被虚拟加载的类信息、常量、静态变量等;永久代;
- 堆:Java堆是jvm所管理的内存中最大的一部分;也是GC管理的主要区域,主流的算法都基于分代收集方式进行:新生代和老年代;线程共享
- Java栈:线程私有,存放线程自己的局部变量等信息;
- PC寄存器(Program Counter Register),线程独占的内存空间;
- 本地方法栈
JAVA 2 EE:
JAVA 2 SE Servlet, JSP, EJB, JMS, JMX, JavaMail Servlet Contaier: println("<h1>") html标签要硬编码在应用程序中; JSP: <html> <body> <h1>...</h1> <% %> </body> </html>
Web Container: JDK, Servlet, JSP 商业实现: WebSphere(IBM) WebLogic (BEA --> Oracle) Oc4j Glassfish Geronimo JOnAS JBoss 开源实现: Tomcat jetty resin
Tomcat的核心组件:
- catalina: servlet container
- Coyote: http connection
- Jasper: JSP Engine
- Tomcat的开发语言:JAVA
Tomcat Instance: 运行中的tomcat进程(java进程)
- Server: 即一个tomcat实例;
- Service: 用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;
- Engine:Tomcat的核心组件,用于运行jsp或servlet代码;
- Connector:接入并解析用户请求,将请求映射为Engine中运行的代码;之后,将运行结果构建成响应报文;
使用协议:http, ajp
- Host:类似httpd中的虚拟主机;
- Context:类似于httpd中的alias;
- 注意:每个组件都由“类”来实现,有些组件的实现还不止一种;
顶级类组件:server,Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
服务类组件:service,一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。给服务命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情下只为一个service指派一个server。
容器类组件:即可以部署webapp的组件
engine,引擎通是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往哪个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成为独立服务器,默认引擎就是已经定义好的引擎。而如果Tomcat被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
host,主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的“虚拟主机”。一个引擎至少要包含一个主机组件。
context,Context组件是最内层次的组件,它表示Web应用程序本身。配置一个Context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。Context组件也可包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
连接器组件:connector,负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP、JServ和JK2连接器。
被嵌套类组件:
valve,用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
logger,用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
realm,用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
<server> <service> <connector /> <connector /> ... <engine> <host> <context /> ... </host> ... </engine> </service> </server>
Tomcat的运行模式:
- standalone:通过内置的web server (http connector)来接收客户端请求;
- proxy:由专门的web server服务客户端的http请求;
- in-process: 部署于同一主机;
- network: 部署于不同主机;
安装Tomcat:
- 官方站点:http://tomcat.apache.org
- 部署前提:
- jdk:1.6,1.7,1.8
- Oracel JDK
- OpenJDK
- jdk:1.6,1.7,1.8
- 部署Tomcat:tomcat6(jdk 1.6). tomcat7(jdk 1.7). tomcat8 jdk 1.8)
Tomcat的目录结构:
bin: 脚本及启动时用到的类 lib: 类库 conf: 配置文件 logs: 日志文件 webapps: 应用程序默认部署目录 work:工作目录 temp:临时文件目录
配置文件:
server.xml: 主配置文件 context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置; web.xml:每个webapp“部署”之后才能被访问;此文件则用于为所有的webapp提供默认部署相关的配置; tomcat-users.xml:用户认证的账号和密码配置文件; catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略; catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数; logging.properties:日志相关的配置信息;
Java WebAPP 组织结构:
- 有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;
- /usr/local/tomcat/webapps/app1/
/: webapp的根目录; WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml; META-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的context.xml; classes/: 此webapp的私有类; lib/: 此webapp的私有类,被打包为jar格式类; index.jsp:webapp的主页
- webapp归档格式:
.war:webapp; .jar:EJB的类; .rar:资源适配器; .ear:企业级应用程序;
手动添加一个测试应用程序:
- 创建webapp特有的目录结构;
mkdir -pv myapp/{lib,classes,WEB-INF,META-INF}
- 提供webapp各文件;
# cat myapp/index.jsp <%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>JSP Test Page</title> </head> <body> <% out.println("Hello, world."); %> </body> </html>
部署(deployment)webapp相关的操作:
deploy:部署,将webapp的源文件旋转于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp; 将其特有类通过class loader装载至tomcat; 有两种方式: 自动部署:auto deploy 手动部署: 1、冷部署:把webapp复制到指定位置,而后才启动tomcat; 2、热部署:在不停止tomcat的前提下进行的部分: 部署工具:manager、ant脚本、tcd(tomcat client deployer)等; undeploy:反部署,停止webapp,并从tomcat实例拆除其部分文件和部署名; stop:停止,不再向用户提供服务; start:启动处于“停止”状态的webapp; redeploy:重新部署;
tomcat自带的应用程序:
- manager app: webapp管理工具
- host manager:Virtual Hosts管理工具
tomcat的主配置文件结构:
<server attribute="value" attribute2="value"> <service> <connector /> <connector /> <engine > <host name=""> </host> <host name=""> </host> <host name=""> <context /> <context /> </host> </engine> </service> </server> AJP: apache jserv protocol, 二进制协议;
自定义Host及Context示例:
<Host name="web1.magedu.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="ROOT" reloadable="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.100"/> </Context> <Context path="/shop" docBase="shopxx" reloadable="true" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="web1_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> 注意:path给定的路径不能以“/”结尾;