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 "%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:测试一个电子商务网站,获取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>
官方配置示例有语法问题,倒数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服务,测试:
架构模型:
- tomcat基础简介与示例
- jsp简介与示例
- UrlRewrite 简介与示例
- Iptables简介与示例
- Apache与tomcat简介
- Varnish基础与示例
- OSG拖拽器简介与示例
- Mono.Cecil简介与示例
- html5基础与简介
- Javaj简介与基础
- Tomcat 简介,Tomcat 与Apache 的关系
- epoll简介与示例的整理
- 虚函数的简介与示例
- epoll简介与示例的整理
- Android的AsyncTask简介与示例应用
- JavaEE HttpClient 使用简介 与 使用示例
- SpringBoot--Eureka简介与Eureka Server示例
- OC简介与基础语法
- Windows 查看端口是否已打开
- 解决:Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE)
- iOS 中的CoreImage框架(framework)
- 从数据库中读取信息时抛出异常java.sql.SQLException: Parameter index out of range (1 > number of parameter
- 绘图
- tomcat基础简介与示例
- 树
- python_文件的读写
- muduo网络库源码解析 一
- 2017暑假实习
- 欢迎使用CSDN-markdown编辑器
- 用caffe训练自己的数据集时出错:type “caffe.ImageDataParameter” has no field named “backend”
- C++实现CString和string的互相转换
- 记录一下zkw线段树