回顾: java, tomcat
java:
servlet: java 2 ee的一个特殊类;
jsp: java 2 ee的一个特殊类;
java 2 ee: java 2 se, servlet, jsp, jmx, javamail, ...
jsp --> jasper --> servlet --> complie --> bytecodes --> jvm
tomcat: JWS(Sun) + Jserv(ASF)
tomcat: jdk + tomcat
tomcat:server.xml
server, service, connector, engine, host, context
部署:
jvm:
运行时区域:
堆:对象;
栈
Tomcat(2)
tomcat:
CentOS 6:
Oracle JDK, Tomcat
yum repo:
jdk
tomcat6
tomcat
CentOS 7:
OpenJDK 7
Tomcat 7
JDK:
1.6,1.7,1.8 注:1.6为采用的最经典的版本,不同的应用程序对jdk的版本要求是不一样的,要注意
注:很多应用程序在运行时都会去寻找一个JAVA_HOME的环境变量,以确定jdk所在的路径
java程序如果监听在一个小于1023的端口上,才需要root用户去启用它,否则我们完全可以使用普通用户运行该程序。
engine早期的代码叫catalina,所以在java内部把engine叫做catalina
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:企业级应用程序;
手动添加一个测试应用程序:
1、创建webapp特有的目录结构;
# mkdir -pv myapp/{lib,classes,WEB-INF,META-INF}
2、提供webapp各文件;
#vim 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管理工具
配置manager app管理工具的用户名和密码
#/usr/local/tomcat/conf/tomcat-users.xml
配置完执行:
# catalina.sh stop
# catalina.sh start
再次访问172.16.0.131:8080/manger/html
配置host manager的账号密码
#/usr/local/tomcat/conf/tomcat-users.xml
配置完执行:
# catalina.sh stop
# catalina.sh start
tomcat的主配置文件结构:
Tomcat的架构:
Tomcat 6支持Servlet 2.5和JSP 2.1的规范,它由一组嵌套的层次和组件组成,一般可分为以下四类:
顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系;
连接器:连接客户端(可以是浏览器或Web服务器)请求至Servlet容器,
容器:包含一组其它组件;
被嵌套的组件:位于一个容器当中,但不能包含其它组件;
各常见组件:
1、服务器(server):Tomcat的一个实例,通常一个JVM只能包含一个Tomcat实例;因此,一台物理服务器上可以在启动多个JVM的情况下在每一个JVM中启动一个Tomcat实例,每个实例分属于一个独立的管理端口。这是一个顶级组件。
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、阀门(Valve):用来拦截请求并在将其转至目标之前进行某种处理操作,类似于Servlet规范中定义的过滤器。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的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被配置为Apache Web服务器的提供Servlet功能的后端,默认引擎将被忽略,因为Web服务器自身就能确定将用户请求发往何处。一个引擎可以包含多个host组件。
【以上段的内容来自马哥教育】
配置文件详解:
1、server.xml
<Server port="8005" shutdown="SHUTDOWN"> 注:可以通过telnet登录本机,执行shutdow关闭8005端口
<Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 注:资源监控组件
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources> 注:定义全局命名格式的
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" http连接器,如果改端口可以把8080直接改成80就行
connectionTimeout="20000"
redirectPort="8443" />
<Connector executor="tomcatThreadPool" 线程池连接器
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" https连接器
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 只有apache的专用组件支持,AJP: apache jserv protocol, 二进制协议;
<Engine name="Catalina" defaultHost="localhost"> 默认虚拟主机为本地主机
自定义Host及Context示例:
<Host name="web1.magedu.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true">
注:appBase指的是主机的应用库 unpackWARs:能否自动展开WAR文件 autoDeploy:是否支持自动部署
<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给定的路径不能以“/”结尾;