N25-第19周博客作业

1、描述Tomcat的架构;
2、详细解释Tomcat的配置文件及配置文件中的参数所代表的含义;
3、配置apache通过mod_proxy模块与Tomcat连接的详细过程;
4、配置基于mod_jk的负载均衡;
5、配置tomcat集群,能够实现用户的session会话保持。

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>元素。

tomcat架构.png

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 &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

web.xml基于Java Servlet规范,可被用于每一个Java servlet容器,通常有两个存放位置,$CATALINA_BASE/conf和每个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/>


原创文章,作者:oranix,如若转载,请注明出处:http://www.178linux.com/76640

(0)
oranixoranix
上一篇 2017-05-21
下一篇 2017-05-21

相关推荐

  • Linux基础之LVM

    一.LVM介绍 LVM(Logic Volume Management)逻辑卷管理器,其基本原理就是将多个磁盘的分区在逻辑上进行组合,使之成为一个大容量的磁盘进行使用,可以实现动态的分配存储空间。 LVM基本模型以及基本术语,如下图所示: PV:物理卷,从逻辑上与磁盘分区具有同样功能的设备 VG:卷组,由一个或多个物理卷组成 LV:逻辑卷,具有逻辑边界的存储…

    Linux干货 2016-11-09
  • grub详解

    grub详解 1、GRUB(Boot Loader): grub:grub 0.x:grub1 legacy传统的版本 grub 1.x:grub2 grub legacy: 第1阶段:mbr 第1.5阶段:mbr之后的扇区中,让第一阶段中的boot loader能识别第二阶段所在分区上的文件系统 第2阶段:磁盘分区(/boot/grub/) 配置文件/et…

    2017-09-03
  • 第三周学习总结之简单文本处理

    写在最前 通过前面的学习,我们已经知道Linux是一个一切皆文件的系统,因此对文件的处理就显得尤为重要,到目前为止,对于新手来说可能连鼎鼎大名的三剑客也未必听过,不过在这之前我们也可以使用一些非常好用的文本处理工具来完成一些简单文件的处理。本次内容就是讲讲如何使用几个简单文本处理工具的组合完成一些实用的功能。 文本处理工具 文本处理工具,用我的理解就是能够对…

    2017-12-19
  • Proxmox-Linux下的开源管理平台

    1)proxmox简介 Proxmox VE (Proxmox Virtual Environment) 是一个非常棒的集成OPENVZ 支持KVM应用的环境。有方便易用的WEB界面,基于JAVA的UI和内核接口,可以登录到VM客户方便的操作,还有易用的模板功能,基本跟老外的商业VPS环境差不多了,支持VT和ISCSI 2)proxmox的安装与基本配置 安…

    Linux干货 2016-08-08
  • 压缩与归档

    一、压缩     压缩:根据一定算法将数据以更加节省空间的形式存放。下面来看一下Linux常见的压缩工具:     1、gzip/gunzip         后缀名:.gz   …

    Linux干货 2015-05-04
  • LVS+Keepalived实现负载均衡

    keepalived工作原理 keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现后端真实服务器的故障隔离和负载均衡器间的失败切换,防止单点故障。 VRRP协议全称:虚拟路由冗余协议(Virtual Route Redundancy Protocol)。 keepalived安装 # yum install keepali…

    2017-11-26