一、Tomcat概述

1.tomcat简介

tomcat是基于JDK的web服务器,其能运行Servlet和JSP规范总。Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范。实际上Tomcat 部分是Apache服务器的扩展,但它是独立运行的。运行tomcat时,它实际上作为一个与Apache 独立的进程单独运行的。Apache 为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。tomcat具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

官网:tomcat.apache.org

附录:其他的java web服务器实现

商业版本:WebSphere、WebLogic、Oc4j… …

开源实现:Tomcat、jetty、Resin

2.Tomcat配置文件

(1)配置文件种类

server.xml:主配置文件

context.xml:每个webapp有专用的配置文件,通常位于webapp应用程序目录下的WEB-INF目录中用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置;

web.xml:用于为所有的webapp提供默认部署相关的配置;

tomcat-users.xml:用户认证的账号和密码配置文件;

catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;

catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;

logging.properties:日志相关的配置信息;

(2)主配置文件结构实例:

<?xmlversion='1.0' encoding='utf-8'?>

<Serverport="8005" shutdown="SHUTDOWN">

<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />

<ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" />

<ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>

<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>

<ListenerclassName="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" />

</GlobalNamingResources>

<Service name="Catalina">

<Connector port="8080"protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"/>

<Connectorexecutor="tomcatThreadPool"

port="8080"protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"/>

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

<Engine name="Catalina"defaultHost="localhost">

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

<Engine name="Catalina"defaultHost="localhost">

<RealmclassName="org.apache.catalina.realm.LockOutRealm">

<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"

resourceName="UserDatabase"/>

</Realm>

<Host name="localhost"  appBase="webapps"

unpackWARs="true"autoDeploy="true">

<ValveclassName="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>

</Server>

3.Java Web服务组织结构

javaweb服务有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;

/

web服务的根目录;相对的根路径

WEB-IN

私有资源目录,通常存放当前web服务器自用的web.xml;

META-I

私有资源目录,通常存放当前web服务器自用的context.xml;

classes/

此web服务的私有类;

lib/

此web服务的私有类,被打包为jar格式类;

index.jsp

web服务的主页

webapp归档格式:.war:webapp;.jar:EJB的类库文件;.rar:资源适配器;.ear:企业级应用程序;

二、安装启动Tomcat

1.基于系统源安装RPM格式程序:openjdk + Tomcat

(1)安装jdk(java developmentkit,java开发工具箱)

jdk有两个版本:openjdk(开源版本)、Oracle JDK(商业版本)。此处用openjdk系列组件,需要安装三个程序包:java-1.7.0-openjdk、java-1.7.0-openjdk-devel、java-1.7.0-openjdk-devel

[root@localhost~]# yum install java-1.7.0-openjdk java-1.7.0-openjdk-develjava-1.7.0-openjdk-devel

(2)配置jdk环境变量

/usr/bin/java ->/etc/alternatives/java ->/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64/jre/bin/java,此三个位置是其软连接路径,目的是为了可以方便指向多个版本的JDK文件。

[root@localhost ~]# vim/etc/profile.d/java.sh        # 添加java环境变量

export JAVA_HOME=/user/bin/java

[root@localhost ~]# exec bash                # 重启shell进程以达到重读环境变量目的

[root@localhost ~]# java -version      # 查看java版本确定jdk可用

注意:

Tomcat调用JDK是强依赖于环境变量JAVA_HOME,而不是/usr/bin/java

(3)部署Tomcat

[root@localhost ~]# yum install tomcattomcat-lib      # tomcat-lib在yum源码安装时会依赖安装,不要指明

[root@localhost ~]# yum innstall tomcat-webapps tomcat-admin-webapps    # tomcat自带网页管理组件

(4)启动服务

[root@localhost~]# systemctl start tomcat.service

注意:

1) 监听端口:8080 8009,8005。8005端口可以连接此端口发送关闭命令;8080是http监控端口;8009是ajp协议监控端口。

2) 不能将默认端口8080改为80,但是在httpd反代的模式下可以监听在其他大于1024端口,仅有root用户才能使用1024内端口

3)  java运行无需root权限,tomcat是以普通用户身份运行。

2.使用Oracle JDK+ Tomcat主站编译完成的安装包

(1)下载平台版本适合程序包至本地,安装jdk

[root@localhost~]# rpm -ivh jdk-8u25-linux-x64.rpm

(2)配置java环境变量

[root@localhost ~]# vim /etc/profile.d/java.sh

JAVA_HOME=/usr/java/latest

PATH=$JAVA_HOME/bin:$PATH

exportJAVA_HOME PATH

[root@localhost~]# exec bash

[root@localhost~]# java -version

(3) 安装官网下载Tomcat

[root@localhost~]# tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local

[root@localhost~]# cd /usr/local

[root@localhostlocal]# ln -sv apache-tomcat-8.0.23/ tomcat

[root@localhostlocal]# cd tomcat/

注释:Tomcat的目录结构

bin:脚本及启动时用到的类

lib: 提供的j类库

man: 帮助手册

conf:配置文件

logs:日志文件

webapps:应用程序默认部署目录

work:工作目录,jsp代码编译成class文件装入JVM运行,临时放置编译文件位置

temp:临时文件目录

(4)启动环境变量

[root@localhost ~]# vim/etc/profile.d/tomcat.sh    # 需要配置一个环境变量:CATALINA_BASE

CATALINA_BASE=/usr/local/tomcat

PATH=$CATALINA_BASE/bin:$PATH

export CATALINA_BASE PATH

[root@localhostbin]# exec bash

[root@localhost~]# catalina.sh start

此时可以调用/usr/local/tomcat/bin下的catalina.sh脚本运行,但是此时启动的tomcat进程是以root身份运行,不安全

(5)查看Tomcat和其调用的JDK版本信息

[root@localhost~]# catalina.sh version

三、tomcat配置组件

1.server:服务器组件

这是一个顶级组件,其是一个tomcat实例,即运行一个jvm进程。每个server监听的端口不能相同,一个物理主机上启动多个server实例应该使用不同的端口。

属性定义:port、shutdown、className,8005端口为关闭所使用

<Serverport="8005" shutdown="SHUTDOWN">

<ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />

2.service:服务组件

一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。属性:name

<Service name="Catalina">

3.connector:连接器组件

负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。

(1) tomcat作为独立的应用程序服务器,直接接受来自于浏览器的请求,此时仅能支持http、https协议传输

(2) tomcat实现反代模式,其请求将来自于前面的反代主机

当前端主机为httpd服务器可接受:http,https,ajp

当前端主机为nginx服务器:http,ajp

属性定义:

address

连接器监听的IP地址,不给出

maxThreads

最大并发线程数,默认为150

port

监听的TCP端口

protocol

连接器使用的协议,一般为HTTP/1.1或AJP/1.3

redirectPort

重定向端口

connectionTimeout

连接超时时长,单位为毫秒,默认为60000,一分钟

enableLookups

是否通过DNS服务实现查询

acceptCount

定义等待队列的长度

scheme

客户端请求对应映射的协议

debug

连接器是否启用调试功能

secure

工作在安全模式下

clientAuth

是否要验证客户端证书

sslProcotol

ssl协议版本

实例:

<Connectorport="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"/>

<Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"

maxThreads="150"SSLEnabled="true" scheme="https" secure="true"

clientAuth="false"sslProtocol="TLS" />

<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />

注意:

1) 采用前端代理的方式且在httpd时候禁用tomcat的http功能能极大的提高安全性;且客户端访问http端口为80,而tomcat定义端口只能为任意大于1024的端口

2) 实际生产中一般tomcat都是接受前端代理发来的请求,前端服务器和Tomcat之间通信不会是https加密,所以端口重定向不会使用。在连接器中定义redirectPort重定向规则,若端口未定义被Tomcatcat监听,定义也是无效的

3) AJP: apachejserv protocol, 二进制协议

ajp方式的连接器只有在前端主机时httpd服务时候才能启用。ajp传输比http文本类型协议传输效率更高。ajp方式和http方式不能同时使用。

4.Engine:引擎(容器)组件

Servive的一个实例,即servlet引擎,默认引擎是catalina。其内部可以有一个或多个Host组件来定义站点;通常需要通过defaultHost的属性定义默认虚拟主机,defaultHost后定义选项需要在Host中对应定义

<Enginename="Catalina" defaultHost="localhost">

<Host name="localhost"  appBase="webapps"

unpackWARs="true"autoDeploy="true">

</Engine>

常用属性:name、default、JvmRoute(定义路由用户请求的方式是否附加一些条件)

5.Host:虚拟主机组件

位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:

<Host name="localhost"appBase="webapps"

unpackWARs="true"autoDeploy="true"

xmlValidation="false"xmlNamespaceAware="false">

</Host>

常用属性:

name

虚拟主机名称

appBase

存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以为相对路径或绝对路径

autoDeploy

Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动部署;默认为true;

unpackWars

在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

xmlValidation

是否验证xml语法合格性

xmlNamespaceAware

关注xml名称空间

实例:

<Enginename="Catalina" defaultHost="localhost">

<Host name="localhost"appBase="webapps">

<Context path=""docBase="ROOT"/>

<Context path="/bbs"docBase="/web/bss"

reloadable="true"crossContext="true"/>

</Host>

<Hostname="mail.magedu.com" appBase="/web/mail">

<Context path="/"docBase="ROOT"/>

</Host>

</Engine>

注意:

主机别名定义:如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义<Alias></Alias>

6.context:上下文组件

类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;如下面的定义:

<!-- Tomcat Root Context -->

<Context path=""docBase="/web/webapps"/>

<!-- buzzin webapp -->

<Context path="/bbs"

docBase="/web/threads/bbs"

reloadable="true">

</Context>

<!-- chat server -->

<Context path="/chat"docBase="/web/chat"/>

<!-- darian web -->

<Context path="/darian"docBase="darian"/>

常用的属性定义:

1)docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系

2)path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;

如果context定义在一个单独的xml文件中,此属性不需要定义;

3)reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;

注意:

1) 在Tomcat6中,每一个context定义也可以使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf/<enginename>/<hostname>。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

2) path给定的路径不能以“/”结尾;

7.Realm组件:

一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。

JAASRealm:基于JavaAuthintication and Authorization Service实现用户认证;

JDBCRealm:通过JDBC访问某关系型数据库表实现用户认证;

JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;

MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;

UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现;

配置实例:

UserDatabase的配置:

<RealmclassName=”org.apache.catalina.realm.UserDatabaseRealm”

resourceName=”UserDatabase”/>

JDBC方式获取用户认证信息的配置:

<RealmclassName="org.apache.catalina.realm.JDBCRealm" debug="99"

driverName="org.gjt.mm.mysql.Driver"

connectionURL="jdbc:mysql://localhost/authority"

connectionName="test"connectionPassword="test"

userTable="users"userNameCol="user_name"

userCredCol="user_pass"

userRoleTable="user_roles"roleNameCol="role_name" />

8.Valve:阀门组件

Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。

Tomcat6中实现了多种不同的Valve:

AccessLogValve:访问日志Valve

ExtendedAccessValve:扩展功能的访问日志Valve

JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中;

RequestDumperValve:请求转储Valve;

RemoteAddrValve:基于远程地址的访问控制;

RemoteHostValve:基于远程主机名称的访问控制;

SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;

JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;

ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制;

SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp;

ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作;

相关属性定义:

1)className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;

2)allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny;

3) deny:以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;

注意:

RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的访问控制功能;如下面的Valve则实现了仅允许本机访问/probe:

<Context path="/probe"docBase="probe">

<ValveclassName="org.apache.catalina.valves.RemoteAddrValve"

allow="127\.0\.0\.1"/>

</Context>

实例:

<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"

prefix="localhost_access_log" suffix=".txt"

pattern="%h %l %u %t&quot;%r&quot; %s %b" />

className

类名称,常用公司域名反写的方式。

directory

默认相对路径,也可改为绝对路径

prefix

日志文件的前缀

suffix

日志文件的后缀

pattern

记录的值日信息包含的内容

9.Listener

Listener用于创建和配置LifecycleListener对象,而LifecycleListener通常被开发人员用来创建和删除容器。

10.Loader

Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖类。Loader可以用于Context中控制java类的加载。

四、Tomcat的Web CUI控制接口配置

tomcat自带的应用程序实现管理功能:manager app: webapp管理工具、host manager:虚拟主机管理工具

1.manager app: webapp管理工具

(1)配置

[root@localhost tomcat]# vim./conf/tomcat-users.xml   添加如下:

<rolerolename="manager-gui"/>

<userusername="tomcat" password="s3cret"roles="manager-gui"/>

[root@localhosttomcat]# catalina.sh stop

[root@localhosttomcat]# catalina.sh start

说明:

1) 支持角色:

manager-gui

允许访问HTMl图形化界面和状态页,最大权限

manager-script

允许访问文本接口和状态页

manager-jmx

JMX代理实现对状态管理

manager-status

仅授权你用户访问状态页面

2) 配置后服务必须重启,应为java程序需要加载到内存

(2)展示

2.host manager:虚拟主机管理工具

(1)配置

[root@localhost tomcat]# vim./conf/tomcat-users.xml   添加如下:

<rolerolename="admin-gui"/>

<userusername="tomcat" password="s3cret"roles="admin-gui"/>

[root@localhosttomcat]# catalina.sh stop

[root@localhosttomcat]# catalina.sh start

支持角色:

admin-gui- allows access to the HTML GUI

admin-script- allows access to the text interface

(2)展示

注意:

当定义相同的用户同时能够使用这两个工具需要按照如下定义

<rolerolename="manager-gui" />

<rolerolename="admin-gui"/>

<userusername="tomcat" password="tomcat"roles="manager-gui,admin-gui"/>

配置完任意一个后都可查看状态页:

Tomcat:Java Web服务器配置详解的更多相关文章

  1. Mac下Intellij IDea发布Java Web项目详解五 开始测试

    测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...

  2. Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)

    Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...

  3. Mac下Intellij IDea发布Java Web项目详解四 为所有Module配置Tomcat Deployment

    准备工作1:新建第一个JavaWeb项目 准备工作2:新建Module step5 为所有项目配置Deployment 5.1 如图 5.2 [+][Artifact] 5.3 将这里列出的所有内容选 ...

  4. 【Tomcat】Tomcat容器 web.xml详解

      Tomcat的安装目录下的conf目录下的web.xml文件有许多配置,例如: <init-param> <param-name>debug</param-name& ...

  5. Undertow,Tomcat和Jetty服务器配置详解与性能测试

    undertow,jetty和tomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验.然而:当下微服务兴起,s ...

  6. Java Web servlet 详解

    执行原理 当服务器接收到客户端浏览器的访问时,会解析请求的URL路径,获取访问的Servlet的资源路径 查找web.xml文件,看是否有对应的<url-pattern>标签体内容 如果有 ...

  7. Mac下Intellij IDea发布Java Web项目详解三 新建Module

    准备工作1:新建第一个JavaWeb项目 Step4 添加两个module 4.1 右键[WebWorkSpace]-[New]-[Module] 4.2 重复 准备工作1:新建第一个JavaWeb项 ...

  8. Mac下Intellij IDea发布Web项目详解一

    Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...

  9. Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程

    Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 ser ...

随机推荐

  1. java中的Timer

    一个java中用Timer做的简单定时器小程序. package com.test.lx; import java.util.TimerTask; public class TimeTaskTest ...

  2. .ini配置CAN信息

    #include <iostream> #include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使 ...

  3. Intel与Motorola区别

    Intel低字节在前 Motorola高字节在前    在进行CAN总线通信设计或者测试过 程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有什 ...

  4. poj 3729 Facer’s string

    Facer’s string Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2155   Accepted: 644 Des ...

  5. Java中同一个类中不同的synchronized方法是否可以并发执行?

    答案是: 不可以,因为都是获取到对象本身的锁. 多个线程访问同一个类的synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了类java的 ...

  6. win8.1 安装sql2008 启动报错.net framework 应用程序的组件中发生了异常unable to read the previous list

    解决方案:删除 RegSrvr.xml C:\Documents and Settings\Administrator\Application Data\Microsoft\Microsoft SQL ...

  7. 【linux高级程序设计】(第十二章)Linux多线程编程

    线程与进程对比 1.用户空间对比 2.内核空间资源对比 在创建线程时,Linux内核仍然创建一个新的PCB来标识这个线程.内核并不认为进程与线程有差别. 进程是操作系统管理资源的基本单元,线程时Lin ...

  8. Python基础-列表、元祖

    1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ['Alex',"Tenglan",'Eric ...

  9. CDH-5.7.0:基于Parcels方式离线安装配置

    http://shiyanjun.cn/archives/1728.html https://www.waitig.com/cdh%E5%AE%89%E8%A3%85.html

  10. AC日记——开关灯 codevs 1690

    开关灯 思路: 线段树: bool懒标记维护: 更新区间时是区间总值减去当前值: 来,上代码: #include <cstdio> #include <cstring> #in ...