Tomcat基础详解
组件原理图如下:
任何tomcat实例就是一个server,而一个server内部要想能够解析jsp页面转义编译serlet程序,要靠其引擎来实现
而引擎才是真正意义上执行jsp代码的容器,都是tomcat用类来描述这些组件的
同时,为了接受用户的请求,需要基于connector组件,所谓监听的套接字的程序,能够接手用户的请求,被称为连接器
一个server内部可以完全运行N个引擎,无非就是运行多个虚拟机而已
war包的概念
放在网页目录可以直接访问,而部署的时候可以自动将其展开装载,而这是部署本身所完成的工作
在实现web站点的时候,在出程序之下有目录比如/web/htdoc,而在其目录下有一子目录/web/htdoc/bbs 而在其下有个论坛程序
这个目录程序跟其他程序可能不在同一组,而新加的子目录则需要重新部署,因为其属于独立的应用程序,因为每个独立程序都需要独立部署
对于tomcat来讲每一个host内部还有一子组件,叫做conntest,其作用是为了实现程序的独立部署
对于tomcat来讲要想记录日志的话,因此这些都需要使用特殊接口来实现,所以,任何一个需要操作硬件资源的进程,资源都有一个类在实现我们的需求,tomcat也一样。
常见组件
1.服务器(server)
实例,通常一个jvm只能包含一个实例,一般情况下,一个物理服务器可以启动多个jvm,从而启动多个实例,但一般不这么做
2.服务(service)
一个服务组件通常包含一个引擎和此引擎相关联的一个或多个链接服务器
3.连接器(connectors)
一个引擎能配置多个连接器 但是每个连接器的端口不能冲突
同时,tomcat也支持AJP JSERV和JK2连接器,实现让apache反向代理到后端服务器的非常高效的传输协议
容器类组件
4.引擎
可以自己接收用户的http请求,并构建响应报文,而且可以在内部处理java程序的整个套间
5.主机
6.上下文
被嵌套类组件
7.阀门
能够过滤也可以做访问控制
8.日志记录器
9.领域(Realm)
用来实现用户的认证和授权
对tomcat来讲,每种模型上的实现必须开发一种程序,才能完成相应组件的功能,而java中任何程序都是一个类
Tomcat安装
查看文件:
# cat /usr/local/tomcat/conf/server.xml
Listener 为侦听器,通常实现tomcat内部进行通信的,可在各组件之间完成通信
<Serverport="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener"/> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
全局命名资源,方便全局引用,所以为其起完名称后可以随便调用的
<GlobalNamingResources> <Resource name="UserDatabase"auth="Container" type="org.apache.catalina.UserDatabase" description="User databasethat can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> #其调用tomcat-user.xml配置文件进行用户认证 </GlobalNamingResources>
服务类组件配置信息,将连接器关联至引擎上
<Servicename="Catalina"> <Connector port="8080" protocol="HTTP/1.1" #所在监听端口,以及协议版本号 connectionTimeout="20000" #连接超时时间,单位毫秒 redirectPort="8443" /> #必要的时候可以做重定向,定义在8443 <Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true" #端口监听在8443,协议http1.1 maxThreads="150" scheme="https" secure="true" #最大线程,协议版本,安全的 clientAuth="false" sslProtocol="TLS" /> #不验证客户端 ssl协议用的是tls <Connector port="8009" protocol="AJP/1.3"redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> #引擎,名为catalina <RealmclassName="org.apache.catalina.realm.LockOutRealm"> <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" #应用程序存放的位置,相对路径 unpackWARs="true" autoDeploy="true"> #如果是war文件格式,是否解压,是否自动部署 #定义阀门,java中类的记录方式,当前所处域名反过来写的记录方式 <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs" prefix="localhost_access_log." suffix=".txt" #日志的命名 suffix表示时间戳 pattern="%h %l %u %t "%r" %s %b" /> #访问日志的格式 </Host> </Engine> </Service> </Server>
Connector组件:
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。
连接器类型:
定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
1) HTTP连接器
2) SSL连接器
3) AJP 1.3连接器
4) proxy连接器
HTTP连接器:
如上面示例server.xml中定义的HTTP连接器:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443"/>
AJP连接器:
定义连接器时可以配置的属性非常多,但通常定义HTTP连接器时必须定义的属性只有“port”,定义AJP连接器时必须定义的属性只有"protocol",因为默认的协议为HTTP。以下为常用属性的说明:
1) address:指定连接器监听的地址,默认为所有地址,即0.0.0.0;
2) maxThreads:支持的最大并发连接数,默认为200;
3) port:监听的端口,默认为0;
4) protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3;
5) redirectPort:如果某连接器支持的协议是HTTP,当接收客户端发来的HTTPS请求时,则转发至此属性定义的端口;
6) connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为60000,即1分钟;
7) enableLookups:是否通过request.getRemoteHost()进行DNS查询以获取客户端的主机名;默认为true;
8) acceptCount:设置等待队列的最大长度;通常在tomcat所有处理线程均处于繁忙状态时,新发来的请求将被放置于等待队列中;
HTTPS连接器:
下面是一个定义了多个属性的SSL连接器:
<Connector port="8443" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
启用manager功能:
编辑tomcat-user.xml,添加如下行:
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="standard"/> <user username="tomcat" password="secret" roles="manager-gui,manager-script,standard"/>
启用host-manager和server status功能:
<role rolename="admin-gui"/> <user username="tomcat" password="s3cret" roles="admin-gui"/>
而后重启tomcat。
Manager的四个管理角色:
manager-gui - allows access to the HTML GUI and the status pages
manager-script - allows access to the text interface and the status pages
manager-jmx - allows access to the JMX proxy and the status pages
manager-status - allows access to the status pages only