1、描述Tomcat的架构;
Tomcat组件,分为4类:
-
顶层类组件:包括
<Server>
元素和<Service>
元素,它们位于整个配置文件的顶层; -
连接器类组件:为
<Connector>
元素,代表介于客户端与服务器端之间的通信接口,负责将客户端的请求发送给服务器端,并将服务器的响应结果返回给客户端; -
容器类组件:代表处理客户端请求并生成响应结果的组件,共有四类,分别为
<Engine>
、<Host>
、<Context>
和<Cluster>
元素。Engine
组件为特定的Service
组件处理所有客户端请求,Host
组件为特定的虚拟主机处理所有的客户端请求,Context
组件为特定的Web应用处理所有的客户端请求。Cluster
组件负责为Tomcat
集群系统进行会话复制、Context
组件的属性的复制,以及集群范围内WAR
文件的发布。 -
嵌套类组件:代表可以被嵌入到容器中的组件,如
<Valve>
元素和<Realm>
元素等。
Tomcat元素:
-
<Server>
元素:代表整个Servlet
容器组件,是Tomcat
的顶级元素。在<Server>
元素中可包含一个或多个<Service>
元素; -
<Service>
元素:包含一个<Engine>
元素,以及一个或多个<Connector>
元素,这些<Connector>
元素共享同一个<Engine>
元素; -
<Connector>
元素:代表和客户端实际交互的组件,负责接收客户端请求,以及向客户端返回响应结果; -
<Engine>
元素:每个<Service>
元素只能包含一个<Engine>
元素。<Engine>
元素处理在同一个<Service>
中所有<Connector>
元素接收到的客户端请求; -
<Host>
元素:在一个<Engine>
元素中可以包含多个<Host>
元素。每个<Host>
元素定义了一个虚拟主机,它可以包含一个或多个Web
应用; -
<Context>
元素:每个<Context>
元素代表了运行在虚拟主机上的单个Web
应用。在一个<Host>
元素中可以包含多个<Context>
元素。
2、详细解释Tomcat的配置文件及配置文件中的参数所代表的含义;
server.xml
<Server port="8005" shutdown="SHUTDOWN"> <!--Server元素代表整个Catalina Servlet容器,是Tomcat实例的顶级元素; port,指定Tomcat服务器监听shutdown命令的端口; shutdown,指定当终止Tomcat服务器时,发送给它的shutdown监听端口的字符串。 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- className,指定实现此Server接口的类。--> <Service name="Catalina"> <!-- Service元素用于关联一个引擎和与此引擎相关的连接器; name,用于定义Service的名字; className,指定实现此Service接口的类--> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- Connector元素是与客户端交互的组件; port,设定监听端口号; protocol,设定使用的协议; connectionTimeout,定义超时时长,以毫秒为单位; redirectPort,如果某连接器支持的协议是http,当接收到https请求时,转发至此属性定义的端口; enableLookups,是否支持服务器对客户端进行域名解析。 --> <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <!-- Engine是Servlet处理器的一个实例,即Servlet引擎; name,定义Engine的名字; defaultHost:指定处理客户端请求的默认主机名; jvmRoute,定义Tomcat路由标示。 --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 定义用于接收客户端请求并进行相应处理的主机或虚拟主机; name,定义虚拟主机的名字; appBase,指定虚拟主机的目录,可以指定绝对路径,也可以指定相对于<CATALINA_HOME>的相对路径; unpackWARs,在启用此WebApp时是否对WAR格式的归档文件先进行展开; autoDeploy,在Tomcat处于运行状态时放置于appBase目录下的应用程序文件是否自动进行部署; alias,指定虚拟主机的别名,可以指定多个别名。 --> <Context path="/bbs" docBase="/web/threads/bbs" reloadable="true"> </Context> <!-- Context在某些意义上类似于apache中的路径别名,一个Context定义用于标识Tomcat实例中的一个Web应用程序; path,指定访问该Web应用的URL(相对于此Web服务器根路径)入口,如果为"",则表示为此Webapp的根路径; docBase,指定Web应用的存放位置; reloadable,是否允许重新加载此context相关的Web应用程序相关的类; --> <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
web.xml
基于Java Servlet规范,可被用于每一个Java servlet容器,通常有两个存放位置,$CATALINA_BASE/con
f和每个Web应用程序(通常是WEB-INF/web.xml
)。Tomcat在deploy一个应用程序时(包括重启或重新载入),它首先读取conf/web.xml
,而后读取WEB-INF/web.xml
。
tomcat-user.xml
用于实现对Tomcat资源的访问控制,如manager-gui
,admin-gui
。
<role rolename="manager-gui" /> <role rolename="admin-gui" /> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui" />
3、配置Apache通过mod_proxy模块与Tomcat连接的详细过程;
配置:
apache主机: hostname: node4.magedu.com ip:192.168.71.130 tomcat主机: hostname: node3.magedu.com ip:192.168.71.133
前提:
apache主机: # httpd -M | grep proxy proxy_module (shared) proxy_ajp_module (shared) proxy_balancer_module (shared) proxy_http_module (shared)
apache与tomcat的http连接器进行整合:
禁用中心主机
vim /etc/httpd/conf/httpd.conf #DocumentRoot "/var/www/html"//-->注释掉该项
创建虚拟主机
vim /etc/httpd/conf.d/proxy_mod.http.conf <VirtualHost *:80> ServerName node3.magedu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / http://192.168.71.133:8080/ ProxyPassReverse / http://192.168.71.133:8080/ <Location /> Require all granted </Location> </VirtualHost>
apache与tomcat的ajp连接器进行整合:
vim /etc/httpd/conf.d/proxy_mod.ajp.conf <VirtualHost *:80> ServerName node3.magedu.com ProxyVia On ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / http://192.168.71.133:8009/ ProxyPassReverse / http://192.168.71.133:8009/ <Location /> Require all granted </Location> </VirtualHost>
相关指令详解:
ProxyPreserveHost {On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。 ProxyVia {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。 ProxyRequests {On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。 ProxyPass [path] !|url [key=value key=value ...]]:将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。 另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接在按需创建在可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示: ◇ min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。 ◇ max:连接池的最大容量,每个MPM都有自己独立的容量;都值与MPM本身有关,如Prefork的总是为1,而其它的则取决于ThreadsPerChild指令的值。 ◇ loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。 ◇ retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。
4、配置基于mod_jk的负载均衡;
配置
apache主机: node4.magedu.com 192.168.71.130 TomcatA主机: node3.magedu.com 192.168.71.133 TomcatB主机: node5.magedu.com 192.168.71.128
前提:编译mod_jk
时需用到apxs,所以预先安装httpd-devel,之后编译安装mod_jk
。
apache主机: # yum install -y httpd-devel # whereis apxs /usr/bin/apxs # tar xf tomcat-connectors-1.2.40-src.tar.gz # cd tomcat-connectors-1.2.40-src/native/ # ./configure --with-apxs=/usr/bin/apxs # make && make install TomcatA主机: # vim server.xml <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA"> TomcatB主机: # vim server.xml <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">
配置基于mod_jk
的负载均衡
# vim /etc/httpd/conf.d/http-jk.conf LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/conf.d/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount */ lbcluster1 JkMount /status/ stat1 # vim /etc/httpd/conf.d/workers.properties worker.list=lbcluster1,stat1 worker.TomcatA.type=ajp13 worker.TomcatA.host=192.168.71.133 worker.TomcatA.port=8009 worker.TomcatA.lbfactor=1 worker.TomcatB.type=ajp13 worker.TomcatB.host=192.168.71.128 worker.TomcatB.port=8009 worker.TomcatB.lbfactor=1 worker.lbcluster1.type=lb worker.lbcluster1.sticky_session=0 worker.lbcluster1.balance_workers=TomcatA,TomcatB worker.stat1.type=status
启动服务,进行测试成功!
5、配置Tomcat集群,能够实现用户的session会话保持。
为node3和node5节点配置使用deltamanager:
将以下内容复制到server.xml中的Host组件中,主要修改的处为Receiver的address,若主机配置有多个ip,在默认auto情况下会报错,最好将其修改为服务监听的ip。 <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.1.14" port="45564" frequency="500" dropTime="3000"/> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="192.168.71.133" 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.MessageDispatchInterceptor"/> </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.ClusterSessionListener"/> </Cluster>
为需要使用Session Cluster的WebApp开启Session Distribution的功能:
在此WebApp的WEB-INF目录下的web.xml添加 <distributable/>
两点注意:
-
应根据Tomcat的版本选择对应的配置,在试验中失败了几次,配置文件检查时出现Error,主要是由于试验时的Tomcat版本是8.5,而配置文件段使用的是Tomcat8.0的;
-
在为使用Session Cluster的WebApp开启Session Distribution的功能时,添加到的配置文件非WebApp的web.xml,导致不能实现会话保持。
原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/62234