Tomcat基础简介

tomcat基础简介与示例

    Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会
    的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
    由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现,
    Tomcat 5支持最新的Servlet 2.4和JSP 2.0规范。因为Tomcat技术先进、性能稳定,
    而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。
    Tomcat软件是java所编写的,所以要运行tomcat程序需要java编译环境。
准备Java环境,yum安装(此文档使用的是openJDK1.8.0),:
    java-VERSION-openjdk: java程序运行环境
    java-VERSION-openjdk-devel:java程序开发工具
也可以获取相应版本的rpm包,注意rpm包安装需要配置环境变量:
jdk-VERSION-OS-ARCH.rpm
    例如:jdk-1.8.0_25-linux-x64.rpm
安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;
OpenJDK:
    JAVA_HOME=/usr
Oracle JDK:
    JAVA_HOME=/usr/java/jdk_VERSION
注意:多版本并存时,可使用 alternatives命令设定默认使用的版本

安装tomcat
    Yum安装tomcat, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-webapp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

获取压缩包直接部署:

# tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/
# cd /usr/local
# ln -sv apache-tomcat-VERSION  tomcat
  • 1
  • 2
  • 3
压缩包部署需新建/etc/profile.d/tomcat.sh,添加以下指令,为tomcat添加环境变量 

export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
  • 1
  • 2
  • 3
  • 4
  • 5

tomcat目录结构: 
这里写图片描述

tomcat的配置文件构成:
server.xml:主配置文件;
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
tomcat-users.xml:用户认证的账号和密码文件;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略,一般不使用; 
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Tomcat的核心组件:server.xml配置结构

            <Server> 
                <Service>
                    <connector/>
                    <connector/>
                    ...
                    <Engine>
                        <Host>
                            <Context/>
                            <Context/>
                            ...
                        </Host>
                        <Host>
                            ...
                        </Host>
                        ...
                    </Engine>
                </Service>
            </Server>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:
顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...

Catalina:与开始/关闭shell脚本交互的主类,因此如果要研究启动和关闭的过程,就从这个类开始看起。
Server:是整个Tomcat组件的容器,包含一个或多个Service。
Service:Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理。
Connector:实现某一协议的连接器,如默认的有实现HTTP、HTTPS、AJP协议的。
Container:可以理解为处理某类型请求的容器,处理的方式一般为把处理请求的处理器包装为Valve对象,并按一定顺序放入类型为Pipeline的管道里。Container有多种子类型:Engine、Host、Context和Wrapper,这几种子类型Container依次包含,处理不同粒度的请求。另外Container里包含一些基础服务,如Loader、Manager和Realm。
Engine:Engine包含Host和Context,接到请求后仍给相应的Host在相应的Context里处理。
Host:就是我们所理解的虚拟主机。
Context:就是我们所部属的具体Web应用的上下文,每个请求都在是相应的上下文里处理的。
Wrapper:Wrapper是针对每个Servlet的Container,每个Servlet都有相应的Wrapper来管理。可以看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper这些核心组件的作用范围是逐层递减,并逐层包含。
下面就是些被Container所用的基础组件:
    Loader:是被Container用来载入各种所需的Class。
    Manager:是被Container用来管理Session池。
    Realm:是用来处理安全里授权与认证。

WebAPP的组织结构:
/: webapps的根目录
    index.jsp:主页;
    WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
    META-INF/:类似于WEB-INF/;
    classes/:类文件,当前webapp所提供的类;
    lib/:类文件,当前webapp所提供的类,被打包为jar格式;

部署(deploy)webapp的相关操作:
deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM;
部署有两种方式:
    自动部署:auto deploy
    手动部署:
        冷部署:把webapp复制到指定的位置,而后才启动tomcat;
        热部署:在不停止tomcat的前提下进行部署;
        部署工具:manager、ant脚本、tcd(tomcat client deployer)等;                    
    undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp;
    start:启动处于停止状态的webapp;
    stop:停止webapp,不再向用户提供服务;其类依然在jvm上;
    redeploy:重新部署;
手动提供一测试类应用,并冷部署:
# mkidr  -pv  /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

/etc/tomcat/server.xml使用默认配置不做修改,创建文件/var/lib/tomcat/webapps/test/index.jsp。添加以下内容:

            <%@ page language="java" %>
            <%@ page import="java.util.*" %>
            <html>
                <head>
                    <title>Test Page</title>
                </head>
                <body>
                    <% out.println("hello world");
                    %>
                </body>
            </html>     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

tomcat stop—>tomcat start:启动服务 
编译过程:.jsp –>jasper–> .java –> javac –> .class –> jvm 
这里写图片描述 
默认页: 
这里写图片描述 
测试页: 
这里写图片描述

tomcat的常用组件配置:
Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。
各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口; 
Service:用于实现将一个或多个connector组件关联至一个engine组件;
Connector组件:负责接收请求,常见的有三类http/https/ajp;
    常用属性:port="8080" 监听的端口
            protocol="HTTP/1.1" 通信协议
            connectionTimeout="20000" 连接超时时长
            address:监听的IP地址;默认为本机所有可用地址;
            maxThreads:最大并发连接数,默认为200;
            enableLookups:是否启用DNS查询功能;
            acceptCount:等待队列的最大长度;
Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机;
    常用属性:name= 引擎名称,一个server内有多个service,引擎名称要具有唯一性
            defaultHost="www.stu44.com"
Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,
示例:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
 <Host name="www.***.com"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            </Host>
  • 1
  • 2
  • 3
常用属性:name :指定host域名
            appBase: Host的webapps的默认存放目录,程序默认为:/var/lib/tomcat/webapps下,可使用绝对路径,使用相对路径时是基于$CATALINA_BASE变量所定义的路径的相对路径;
            autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;
            unpackWARs:设置为true,将放置在appBase目录中的Web应用程序作为Web应用程序归档(WAR)文件自动解压缩到相应的磁盘目录结构中,否则直接从WAR文件运行此类Web应用程序。
示例:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 <Host name="www.***.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
            </Host>
  • 1
  • 2
        # mkdir -pv /appdata/webapps
        # mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}
            提供一个测试页.jsp即可;
Context组件: host组件的应用上下文,每个请求都在是相应的上下文里处理的
    示例: <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>可以理解docBase的路径是path路径的别名:
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" />
    Valve存在多种类型:
        定义访问日志:org.apache.catalina.valves.AccessLogValve
        定义访问控制:org.apache.catalina.valves.RemoteAddrValve 
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

示例1:测试一个电子商务网站,获取shopxx-v3.0-Beta电子商务网站程序包 
放在定义的站点目录下/tomcat_web_apps/目录下,做软连接: 
这里写图片描述 
Server.xml文件编写如下: 
这里写图片描述

Tomcat stop 停止服务,tomcat start启动服务。
或者直接systemctl restart tomcat
重启后可ss –tnl查看对应端口是否处于监听状态,如果没有监听说明配置有问题,成功重启后,浏览器测试:
根据配置提示,设置好数据库,
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述
/etc/locale.conf:zn_CN.UTF-8和 
这里写图片描述
修改字符集 
示例2:一台nginx反代,一台tomcat后端: 
Nginx主机设置: 
这里写图片描述 
注意,要在测试PC添加解析信息, 
C:\Windows\System32\drivers\etc\hosts添加IP FQDN, 
在www.stu45.com主机添加解析信息,/etc/hosts添加IP FQDN,只要是使用FQDN就需要做解析,切记,以下不再赘述。 
Tomcat主机设置 
这里写图片描述 
这里写图片描述

示例3:一台nginx反代www.stu44.com,一台httpd+tomcat后端www.stu45.com: 
这里写图片描述 
Nginx反代设置: 
这里写图片描述 
只加一条代理指令,动静全部代理到后端: 
Httpd+tomcat设置: 
这里写图片描述
Httpd与tomcat同一主机上,80端口接收到请求直接发送给8080端口。 
Tomcat使用默认设置, 
这里写图片描述

示例4:前端一台nginx主机做负载均衡,后端两台httpd+tomcat主机做RS 
修改/etc/tomcat/server.xml(两台RS相同) 
这里写图片描述

RS2-httpd:
<VirtualHost *:80>
    ServerName www.stu40.com
    DocumentRoot "/web/wy/a/"
    ProxyRequests Off 
    ProxyVia On
    ProxyPreserveHost On
    <Directory "/web/wy/a/">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    <Proxy *>
        Require all granted
    </Proxy>
    <Location />
        Require all granted
    </Location>
    ProxyPass "/" "http://www.stu40.com:8080/"
    ProxyPassReverse "/" "http://www.stu40.com:8080/"
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

RS2-tomcat主页:

<%@ page language="java" %>
<html>
    <head><title>TomcatB</title></head>
    <body>
    <h1><font color="red">Tomcat2</font></h1>
    <table align="centre" border="1">
    <tr>
        <td>Session ID</td>
    <% session.setAttribute("stu45.com","stu45.com"); %>
        <td><%= session.getId() %></td>
        </tr>
        <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
        </tr>
    </table>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在/etc/hosts添加:当前主机ip www.stu40.com 
完成后,重启httpd与tomcat服务 
RS1- httpd:

<VirtualHost *:80>
    ServerName www.stu40.com
    DocumentRoot "/web/wy/b/"
    ProxyRequests Off 
    ProxyVia On
    ProxyPreserveHost On
    <Directory "/web/wy/a/">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    <Proxy *>
        Require all granted
    </Proxy>
    <Location />
        Require all granted
    </Location>
    ProxyPass "/" "http://www.stu40.com:8080/"
    ProxyPassReverse "/" "http://www.stu40.com:8080/"
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

RS1-tomcat:

<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
    <h1><font color="red">Tomcat1</font></h1>
    <table align="centre" border="1">
    <tr>
        <td>Session ID</td>
    <% session.setAttribute("stu44.com","stu44.com"); %>
        <td><%= session.getId() %></td>
        </tr>
        <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
        </tr>
    </table>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在/etc/hosts添加:当前主机ip www.stu40.com 
完成后,重启httpd与tomcat服务

nginx主机配置如下:

upstream mytcrs {
    server 172.16.252.140;
    server 172.16.253.190;
}
server {
    listen 80; 
    server_name www.stu40.com;
    location / { 
        proxy_pass http://mytcrs;
        proxy_set_header Host  $host;
        proxy_set_header X-Forwarded-For  $remote_addr;
        add_header X-Via  $server_addr;
        add_header X-Accel $server_name;
    }   
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在/etc/hosts添加:当前主机ip www.stu40.com 
测试主机的hosts文件要添加调度器的IP:FQDN 
重启nginx服务 
浏览器测试: 
这里写图片描述 
这里写图片描述 
Curl命令测试 
这里写图片描述 
前端nginx反代负载均衡,后端httpd+tomcat,实验ok! 
架构模型: 
这里写图片描述 
示例5:基于示例4做两台RS Tomcat Session Replication Cluster 
配置启用集群,将下列配置放置于或中;

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                        channelSendOptions="8">
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
        expireSessionsOnShutdown="false"
        notifyListenersOnReplication="true"/>
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
        address="228.0.0.4"#组播地址,注意冲突问题
        port="45564"
        frequency="500"
        dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
        address="auto" #获取本机地址,建议写固定IP,绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址
        port="4000"
        autoBind="100"
        selectorTimeout="5000"
        maxThreads="6"/>
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
        </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
        </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                        filter=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
        <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
        tempDir="/tmp/war-temp/"
        deployDir="/tmp/war-deploy/"
        watchDir="/tmp/war-listen/"
        watchEnabled="false"/>
        <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
        <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
官方配置示例有语法问题,倒数23行行尾>前没有“/”符号,添加即可
http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
配置webapps:将/etc/tomcat/WEB-INF/web.xml(tomcat yum安装路径)
拷贝到当前使用的根目录下的WEB-INF下,
编辑在<web-app配置段内添加<distributable/>元素;
以上内容两台RS-tomcat配置相同,区别在与Receiver className下的address的ip需写RS本机地址。
重启tomcat服务,测试:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里写图片描述 
架构模型: 
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值