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 "%r" %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
官方配置示例有语法问题,倒数2,3行行尾>前没有“/”符号,添加即可
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
架构模型: