tomcat基础简介与示例

来源:互联网 发布:淘宝刷到单流程图 编辑:程序博客网 时间:2024/06/05 08:19

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=/usrOracle JDK:    JAVA_HOME=/usr/java/jdk_VERSION注意:多版本并存时,可使用 alternatives命令设定默认使用的版本安装tomcat    Yum安装tomcat, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-webapp

获取压缩包直接部署:

# tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/# cd /usr/local# ln -sv apache-tomcat-VERSION  tomcat
压缩包部署需新建/etc/profile.d/tomcat.sh,添加以下指令,为tomcat添加环境变量 export CATALINA_BASE=/usr/local/tomcatexport PATH=$CATALINA_BASE/bin:$PATH

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:日志系统相关的配置;

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

            <Server>                 <Service>                    <connector/>                    <connector/>                    ...                    <Engine>                        <Host>                            <Context/>                            <Context/>                            ...                        </Host>                        <Host>                            ...                        </Host>                        ...                    </Engine>                </Service>            </Server>
每一个组件都由一个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}

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

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内部用于接收请求并进行相应处理的主机或虚拟主机,示例:
 <Host name="www.***.com"  appBase="webapps"                unpackWARs="true" autoDeploy="true">            </Host>
常用属性:name :指定host域名            appBase: Host的webapps的默认存放目录,程序默认为:/var/lib/tomcat/webapps下,可使用绝对路径,使用相对路径时是基于$CATALINA_BASE变量所定义的路径的相对路径;            autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;            unpackWARs:设置为true,将放置在appBase目录中的Web应用程序作为Web应用程序归档(WAR)文件自动解压缩到相应的磁盘目录结构中,否则直接从WAR文件运行此类Web应用程序。示例:
 <Host name="www.***.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">            </Host>
        # 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:测试一个电子商务网站,获取shopxx-v3.0-Beta电子商务网站程序包
放在定义的站点目录下/tomcat_web_apps/目录下,做软连接:
这里写图片描述
Server.xml文件编写如下:
这里写图片描述

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

这里写图片描述
/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>

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>

在/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>

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>

在/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;    }   }

在/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>
官方配置示例有语法问题,倒数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服务,测试:

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

原创粉丝点击