Tomcat服务

Tomcat是常用的Web服务应用容器,常用于java项目,是Apache的扩展,处理动态网页部分。 Web容器有很多种,JBoss、WebLogic等等,Tomcat是其中一种。

TOC

安装Tomcat

Tomcat需要java环境支持,所以需要安装jdk

安装jdk环境

#解压jdk安装包
tar zxf jdk-8u201-linux-x64.tar.gz
mv jdk1.8.0_201 /usr/local/jdk
#配置环境,优化java命令路径
echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
echo 'export JRE_HOME=${JAVA_HOME}/jre' >> /etc/profile
echo 'export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH' >> /etc/profile
echo 'export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin' >> /etc/profile
echo 'export PATH=$PATH:${JAVA_PATH}' >> /etc/profile
source /etc/profile
#查看jdk版本信息,是否安装成功
java -version

tomcat.001

安装Tomcat

#解压安装
tar zxf apache-tomcat-8.5.55.tar.gz
mv apache-tomcat-8.5.55 /usr/local/tomcat
#启动Tomcat
/usr/local/tomcat/bin/startup.sh

使用浏览器访问8080端口就会出现下面这个网页说明成功

tomcat.001

Tomcat服务配置与管理

Tomcat服务基础知识

tomcat默认的使用端口:8080
Tomcat目录结构
我个人喜好安装在/usr/local/tomcat目录下,可以看到有以下这些目录
bin:命令文件目录
conf:存放配置文件
lib:运行需要的库文件
logs:日志文件
Webapps:存放网站文件的
temp:存放临时文件
work:工作目录 默认情况下存放编译JSP文件生成的servlet类文件

Tomcat的启动和关闭
Tomcat有自带的服务启动关闭管理脚本
启动服务:/usr/local/tomcat/bin/startup.sh
关闭服务:/usr/local/tomcat/bin/shutdown.sh

Tomcat配置文件解析

主要分为以下几类配置文件

1.server.xml配置文件:
Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;

2.web.xml配置文件:
遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;

3.配置文件tomcat-user.xml:
Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;

4.catalina.policy配置文件:
Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;

5.catalina.properties配置文件:
Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内容的控制;Tomcat6在启动时会事先读取此文件的相关设置;

6.logging.properties配置文件:
Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;

7.context.xml配置文件:
所有host的默认配置信息;

注意:server.xml文件中可定义的元素非常多,我们主要看这个配置文件
其中元素包括包括Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager,Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource,GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等

配置文件整体结构:

  <Server>
   <Service>
         <Connector />
         <Connector />
         <Engine>
            <Host>
                 <Context />
             </Host>
         </Engine>
     </Service>
</Server>

详细组件解析
1.顶层元素:server和service
元素是整个配置文件的根元素,元素则代表一个Engine元素以及一组与之相连的Connector元素

2.连接器:Connector
代表了外部客户端发送请求到特定Service的接口;同时也是外部客户端从特定Service接收响应的接口。
通过配置Connector,可以控制请求Service的协议及端口号。在第一部分的例子中,Service包含两个Connector:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
#port:访问端口为8080
#protocol:规定了请求的协议
#connectionTimeout:表示连接的超时时间
#redirectPort:表示当强制要求https而请求是http时,重定向至端口号为8443的Connector
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
#客户端可以通过8009端口号使用AJP协议访问Tomcat。AJP协议负责和其他的HTTP服务器(如Apache)建立连接;在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。之所以使用Tomcat和其他服务器集成,是因为Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器;因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接

3.容器:Engine、Host和Context
容器的功能是处理Connector接收进来的请求,并产生相应的响应。Engine、Host和Context都是容器,但它们不是平行的关系,而是父子关系:Engine包含Host,Host包含Context。一个Engine组件可以处理Service中的所有请求,一个Host组件可以处理发向一个特定虚拟主机的所有请求,一个Context组件可以处理一个特定Web应用的所有请求。
Engine配置属性:

 <Engine name="Catalina" defaultHost="localhost">
 #name:用于日志和错误信息,在整个Server中应该唯一
 #defaultHost:指定默认的host名称,当发往本机的请求指定的host名称不存在时,一律使用defaultHost指定的host进行处理

Host配置属性:

 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
 #name:指定虚拟主机的主机名,一个Engine中有且仅有一个Host组件的name属性与Engine组件的defaultHost属性相匹配;一般情况下,主机名需要是在DNS服务器中注册的网络名,但是Engine指定的defaultHost不需要,原因在前面已经说明。
#unpackWARs:指定是否将代表Web应用的WAR文件解压;如果为true,通过解压后的文件结构运行该Web应用,如果为false,直接使用WAR文件运行Web应用。
#autoDeploy和appBase:与Host内Web应用的自动部署有关;此外,本例中没有出现的xmlBase和deployOnStartup属性,也与Web应用的自动部署有关

4.内嵌组件:除了以上三个其他的都可以称为内嵌组件
可以内嵌到容器中的组件
Listener(即监听器)定义的组件:
可以在特定事件发生时执行特定的操作;被监听的事件通常是Tomcat的启动和停止
下面依次介绍例子中配置的监听器:
VersionLoggerListener:当Tomcat启动时,该监听器记录Tomcat、Java和操作系统的信息。该监听器必须是配置的第一个监听器

AprLifecycleListener:Tomcat启动时,检查APR库,如果存在则加载。APR,即Apache Portable Runtime,是Apache可移植运行库,可以实现高可扩展性、高性能,以及与本地服务器技术更好的集成

JasperListener:在Web应用启动之前初始化Jasper,Jasper是JSP引擎,把JVM不认识的JSP文件解析成java文件,然后编译成class文件供JVM使用

JreMemoryLeakPreventionListener:与类加载器导致的内存泄露有关

GlobalResourcesLifecycleListener:通过该监听器,初始化< GlobalNamingResources>标签中定义的全局JNDI资源;如果没有该监听器,任何全局资源都不能使用。< GlobalNamingResources>将在后文介绍

ThreadLocalLeakPreventionListener:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。当线程执行完任务被收回线程池时,活跃线程会一个一个的更新。只有当Web应用(即Context元素)的renewThreadsWhenStoppingContext属性设置为true时,该监听器才有效。

GlobalNamingResources与Realm:
如下配置:

<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>

Realm,可以把它理解成“域”,Realm提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用。在本例中,Realm的配置使用name为UserDatabase的资源实现。而该资源在Server元素中使用GlobalNamingResources配置:

<GlobalNamingResources>
 <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>

GlobalNamingResources元素定义了全局资源,通过配置可以看出,该配置是通过读取$TOMCAT_HOME/ conf/tomcat-users.xml实现的

Valve组件:
配置如下:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

意思是“阀门”,在Tomcat中代表了请求处理流水线上的一个组件;Valve可以与Tomcat的容器(Engine、Host或Context)关联
例如下面的AccessLogValve
AccessLogValve的作用是通过日志记录其所在的容器中处理的所有请求

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

className:规定了Valve的类型,是最重要的属性;本例中,通过该属性规定了这是一个AccessLogValve。
directory:指定日志存储的位置,本例中,日志存储在$TOMCAT_HOME/logs目录下。
prefix:指定了日志文件的前缀。
suffix:指定了日志文件的后缀。通过directory、prefix和suffix的配置,在$TOMCAT_HOME/logs目录下,可以看到如下所示的日志文件
pattern:指定记录日志的格式,本例中各项的含义如下:
%h:远程主机名或IP地址;如果有nginx等反向代理服务器进行请求分发,该主机名/IP地址代表的是nginx,否则代表的是客户端。后面远程的含义与之类似,不再解释。
%l:远程逻辑用户名,一律是”-”,可以忽略。
%u:授权的远程用户名,如果没有,则是”-”。
%t:访问的时间。
%r:请求的第一行,即请求方法(get/post等)、uri、及协议。
%s:响应状态,200,404等等。
%b:响应的数据量,不包括请求头,如果为0,则是””-。

多个服务的配置

配置如下:

   <Service name="Catalina">
     <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
     <Engine name="Catalina" defaultHost="localhost">
       <Realm className="org.apache.catalina.realm.LockOutRealm">
         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                resourceName="UserDatabase"/>
</Realm>
       <Host name="localhost"  appBase="/opt/project/webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       </Host>
     </Engine>
   </Service>

   <Service name="Catalina2">
     <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
     <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
     <Engine name="Catalina2" defaultHost="localhost">
       <Realm className="org.apache.catalina.realm.LockOutRealm">
         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                resourceName="UserDatabase"/>
       </Realm>
       <Host name="localhost"  appBase="/opt/project/webapps2" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       </Host>
     </Engine>
</Service>

如上配置就可以看出配置了两个站点,端口分别是8081和8082,网页路径分别不同