Java体系结构:
Java编程语言:
Java Class文件格式:
java API
java VM;
JVM的核心组成部分:
CLass Loader
执行引擎
java编程语言的特性:
面向对象,多线程,结构化错误处理
垃圾收集,动态链接,动态拓展
JVM运行时区域:运行为多个线程
方法区:线程共享;用于存储杯虚拟机加载的类信息,常量,静态变量等:永久代;;
堆:Java堆是JVM所管理的内存中最大的一部分;也是GC管理的主要区域,主流的算法都基于分代收集方式进行:新生代和老生代;线程共享
java栈:线程私有,存放线程自己的局部变量等信息;
PC寄存器(Program Counter Register),线程独占的内存空间
本地方法栈:
Web Container:
JDK,Servlet,JSP
商业实现:
WebSphere
WebLogic
Oc4j
Glassfish
JOnAs
JBoss
开源实现:
Tomcat
jetty
resin
JAVA 2 EE APIs:
EJB:JAVA相关的诸多高级功能的实现,如RMI,对象/关系映射,跨越多个数据源的分布式事务等;
JMS:高性能异步消息服务,实现JAVA EE应用程序与非JAVA程序的“透明”;
JMX:在程序运行时对其进行交互式监控和管理的机制
JTA:允许应用程序
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
服务类组件:service
容器类组件:即可以部署webapp的组件,engine,host,context
连接器组件:connector
被嵌套类组件:value,logger,realm
tomcat运行模式:
standalone:通过内置的web server来接收客户端请求。
proxy:由专门的web server服务客户端的http请求;
in-process:部署于同一主机;
network:部署于不同主机
按照tomcat:
官方站点:http://tomcat.apache.org
部署前提是JDK
java环境
vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin
tomcat环境:
export CATALINA_HOME=/usr/local/tomcat
export PATH=
C
A
T
A
L
I
N
A
H
O
M
E
/
b
i
n
CATALINA_HOME/bin
CATALINAHOME/binPATH
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:当使用-sercurity选项启动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;
classed/:此webapp的私有类
lib/:此webapp的私有类,被打包为jar格式类;
index.jsp:webappd的主页
webapp的归档格式:
.war:webapp;
.jar:EJB的类;
.rar:资源适配器
.ear:企业级应用程序;
手动添加一个测试应用程序:
·1.创建webapp特有的目录结构
mkdir myapp/{lib,classes,WEB-INF,META-INF} -pv
2.提供webapp各文件
myapp/index.jsp
<%@ page language=“java” %>
<%@ page import=“java.util.*” %>
tomcat自带的应用程序:
manager app:webapp管理工具
host manager:Virtual Hosts管理工具
网页管理需要修改:
conf目录下的tomcat-users.xml
另外如果是tomcat9版本 需要修改
/webapps/manager/META-INF下的context.xml
在
加入|\d+.\d+.\d+.\d+
tomcat的主配置文件结构:
各常用组件:
1.服务器(server):tomcat的一个实例。通常一个JVM之内只能包含一个Tomcat实例:因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM启动一个实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
2.服务(service):一个服务组件通常包含一个引擎和与此引擎项关联的一个或多个连接器。给服务器命名可以方便管理员在日志文件中识别不同服务产生的日志。一个server可以包含多个service组件,但通常情况下只为一个service指派一个server;
连接器类组件:
3.连接器(connectors):负责链接客户端(可以是浏览器或web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。默认的连接器是基于HTTP/1.1的Coyote。同时,Tomcat也支持AJP,JServ和JK2连接器。
容器类组件:
4.引擎(Engine):引擎通常是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它检查每一个请求的HTTP首部信息以辨别此请求应该发往那个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果Tomcat被配置成独立服务器,默认引擎就是已经定义好的引擎。而如果tomcat被配置为Apache web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
5.主机(host):主机组件类似于Apache中的虚拟主机,但在Tomcat中只支持基于FQDN的”虚拟主机“。一个引擎至少要包含一个主机组件。
6.上下文(Context):Context组件是最内层次的组件,它表示Web应用程序本身。配置一个context最主要的是指定Web应用程序的根目录,以便Servlet容器能够将用户请求发往正确的位置。context组件也可以包含自定义的错误页,以实现在用户访问发生错误时提供友好的提示信息。
被嵌套类(nested)组件
这类组件通常包含于容器类组件中以提供具有管理功能的服务,它们不能包含其他组件,但有些却可以由不同层次的容器各自配置。
7.阀门(Value):用来拦截请求在将其转至目标之前进行某种操作,类似于Servlet规范中定义的过滤器。Value可以定义在如何容器类的组件中。Value长被用来记录客户端请求、客服端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储value记录请求客户端请求数据包中的http首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
8.日志记录器(Logger):用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
9.领域(Realm):用于用户的认证和授权:在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源,同时,Realm可以呗其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
引擎(engine):引擎是指处理请求的Servlet引擎组件,即Catalina Servlet引擎,它从HTTPconnector接受请求并响应请求。它检查每一个请求的Http首部信息以辨别此请求应该发往那个host或context,并将请求处理后的结果返回的相应的客户端。严格意义上来说,容器不必非得通过引擎来实现,它也可以是只是一个容器。如果tomcat被配置称为独立服务器,默认引擎就是已经定义好的引擎。而如果tomcat被配置为Apcahe Web服务器的提供Serverlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
AJP:apache jserv proto,二级制协议;
tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是apache,IIS,nginx等
tomcat作为独立服务器:请求来自于web浏览器
tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
定义连接器可以连接多种属性,有些属性也只适用于某特定的连接器类类型。一般来说,常见于server.xml中的连接器类型通常有4种:
1)HTTP连接器
2)SSL连接器
3)AJP 1.3连接器
如上图示例server.xml种定义的HTTP连接器
定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port”,定义AJP连接器时必须定义的属性只有"protocol",因为默认的协议为HTTP,以下为常用属性的说明:
1)address:指定连接器监控的地址,默认为所有地址,即0.0.0.0;
2)maxThreds:支持的最大并发连接数,默认为200
3)port:监听的端口,默认为0
4)protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;
5)redirectPort:如果某连接器支持的协议时HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
6)connectionTimeout:等客户端发送请求的超时时间,单位为毫秒,默认为60000,即一分钟
7)enablLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true;
8)acceptCount:设置等待队列的最大长度:通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列种;
下面是一个定义了多个属性的SSL连接器:
Engine组件:
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义再server.xml种的Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件,如前面示例中定义的:
常用的属性定义:
defaultHost:tomcat支持基于FQDN的虚拟主机,这些虚拟主机可以通过在Engine容器中定义多个不同的Host组件来实现:但如果此引擎的连接器收到一个发往非明确定义虚拟主机的请求时则需要将此请求发往一个默认的虚拟主机进行处理,因此,在engine中定义的多个虚拟主机的主机名称中至少要有一个跟defaultHost定义的主机名称同名:
name:Engine组件的名称,用于日志和错误信息记录时区别不同的引擎
jvmRoute=
engine容器中可以包含realm,host,Listener和value子容器。
Host组件:
位于engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:
常用属性说明:
1)appBase:此Host的webapps目录,即存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以使用基于¥CATALINA_HOME的相对路径;
2)autoDeplay:在tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy:默认为true
3)unpackWars:在启用此webapps时是否对WAF格式的归档文件先进行展开,默认为true;
虚拟主机定义示例:
主机别名定义:
如果一个主机有两个或两个以上的主机名,额外的名称均可以别名的形式进行定义,如下:
test.com
context组件:
context在某些意义上类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个web应用程序,如下面的定义:
Realm组件:
一个Realm表示一个安全上下文,它是一个授权访问某个给定Contest的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时唯一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。
JAASRealm:基于java Authintication and Authorizaton Service实现用户认证;
JDBCRealm:通过JDBC访问某关系型数据库实现用户认证;
JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;
MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;
UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)
实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现;
下面是一个常见的使用UserDatabase的配置:
下面是一个使用JDBC方式获取用户认证信息的配置:
Valve组件:
Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间,一个容器内可以建立多个Valve,而且Value定义的次序也决定了它们生效的次序。Tomcat6中实现了多种不同的Valve:
AccessLogValve:访问日志Valve
ExtendedAccessValve:拓展功能的访问日志valve
JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中:
RequestDumperValve:请求转储Valve
RemoteAddrValve:基于远程地址的访问控制:
RemoteHostValve:基于远程主机名称的访问控制:
SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量:
JvmRouteBinderValve:在配置上多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定向至备用节点:使用此Valve,必须使用JvmRouteSessionIDBinderListenner;
ReplicationValve:专用于tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制:
SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证既可访问所有连接在一起的webapp:
clusterSingleSingOn:对SingleSingOn的扩展,专用于Tomcat集群当中,需要结合ClushterSignleSignOnListenrt进行工作:
RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的访问控制功能,如下面的value则实现了仅允许本机访问/probe:
其中相关的属性定义有:
1)className:相关的java实现的类名,相应于分别应该为org.apache.catalina.values.RemoteHostValve或org.apache.catalina.values.RemoteAddrValve:
2))allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点好“。
3)deny:以逗号分开的禁止访问的IP地址列表,支持正则表达式:使用方式痛allow:
自定义Host及Contest示例:
注意:path给定的路径不能以”/“结尾
LNMT:
client–>nginx -->reverse_proxy --> http -->tomcat (http connector)
Tomcat Cluster(3)
会话保持:
session sticky
source IP
cookie
session cluster:
session server:
kv:memcached,redis
apache:tomcats
(1)apache:
mod_proxy
mod_proxy_http
mod_proxy_balancer
tomcat:
http cocnector
(2)apache:
mod_proxy
mod_proxy_ajp
mod_proxy_balancer
tomcat:
ajp cocnector
(3)apache:
mode_jk
tocmat:
ajp connector