apache整合tomcat部署集群

近日,因为公司项目须要,因此学习了apache整合tomcat以及集群的一些知识。html

  因此作下笔记往后回顾能够用到。web

  apache只有处理静态事物的能力, 而tomcat的强项就是处理动态的请求,因此apache和tomcat整合相互取长补短,由apache做为入口,若是是请求静态页面或者是静态文 件,由apache直接提供,若是是请求动态页面,则让apache分发到tomcat,由tomcat处理之后再响应给客户端。apache

apache和tomcat的整合须要准备的一些软件列表:tomcat

图1服务器

说明:session

1.首先安装apache服务(httpd-2.2.25-win32-x86-no_ssl.msi),默认是80端口的,若是80端口被占用,则没法安装成功;app

  用一下命令能够查询80端口被哪一个进程id占用,netstat -aon|findstr "80" 负载均衡

  再用一下命令查询该进程id是表明哪一个进程,tasklist|findstr "2016"webapp

  apache检查错误方法:进入cmd 而后进入 Apache安装目录(具体为你本身的安装目录)\bin> httpd.exe -w -n "Apache2" -k startjvm

2.打开apache的安装目录下面的modules文件夹,把图1中的mod_jk.so文件放入

3.在apache安装目录的conf文件夹下面配置mod_jk.conf文件,若是没有则新增一个,内容为:

图2

  图2中的第一行,指定mod_jk的配置文件,配置tomcat以及负载均衡

  图2中的第二行和第三行表示,当请求后缀我jsp或者是do的时候,apache把请求转发给tomcat来处理

3.配置完上面的配置文件之后,在apache的安装目录下的httpd.conf文件的末尾,把mod_jk.so模块以及mod_jk.conf配置文件加载进去

图3

4.配置apache的安装目录下的workers.properties文件,若是该文件不存在,本身新增一个便可

图4

介绍下图4中的各个参数:

#server

worker.list = controller      #控制器名称

#========tomcat1========

worker.tomcat1.port=8009      #ajp协议的端口,若是2个tomcat部署在同一个服务器中,那个ajp端口须要不一样

worker.tomcat1.host=127.0.0.1 #tomcat的所在主机的ip,若是是本机,则写本机的ip便可

worker.tomcat1.type=ajp13     #协议类型

worker.tomcat1.lbfactor=1     #负载因子


#========tomcat2========

worker.tomcat2.port=9009

worker.tomcat2.host=127.0.0.1

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1    #若是2个tomcat,该参数相同,表示等比例,若是想tomcat负载多一点,只要把这个参数改的大一点便可,具体多少仍是得看状况

  

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.retries=3  #请求失败之后重试次数

worker.controller.balance_workers=tomcat1,tomcat2   #controller控制的tomcat的名称,分别为tomcat1和tomcat2,由tomcat中的server.xml中设值

worker.controller.sticky_session=false    #回话是否有粘性,false表示无粘性,同一个回话的请求会到不一样的tomcat中处理

worker.controller.sticky_session_force=false #当一个节点蹦了,若是设值为true,那么服务器返回500错误给客户端,若是设值为false,则转发给其余的tomcat,可是会丢失回话信息

#更详细的参数说明:http://tomcat.apache.org/connectors-doc/reference/workers.html

5.安装好apache服务之后再准备好tomcat(两个tomcat做为例子)

图5

tomcat须要配置server.xml文件

<?xml version='1.0' encoding='utf-8'?>

<!--若是多个tomcat部署在同一台服务器中,此处的关闭tomcat的端口须要更改,不能冲突-->

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />

  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />


  <GlobalNamingResources>

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

              description="User database that can be updated and saved"

              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

              pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>


  <Service name="Catalina">

     

    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

        maxThreads="300" minSpareThreads="4"/>

    <!--若是使用apache整合,那么此配置能够注释,由于apache是经过ajp协议来通讯的,tomcat并不会直接暴露出来-->

    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" maxThreads="300"/>

    

     <!-- Define an AJP 1.3 Connector on port 8009 --><br>    <!--若是多个tomcat部署在同一个服务器中,此处的ajp协议端口必须不同,而且须要增长jvmRoute属性,该属性的值即为workers.properties中的tomcat的名称-->

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" jvmRoute="tomcat1"/>


    <Engine name="Catalina" defaultHost="localhost">

      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

     

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

        <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项目的web.xml中添加属性<distributable/>,用于告诉web容器,该项目属于分布式项目,否则没法session replication

6. 静态文件直接由apache响应,所需须要把部署的项目中的静态文件放在apache的安装目录下的htdocs文件夹下,偷懒的方法就是直接把tomcat的webapps中的项目拷贝一份放到htdocs中,因此htdocs的做用与tomcat的webapps相似

7.部署的时候常常会出现一些错误,当遇到错误的时候我常常须要查看日志文件,我常常查看的日志有apache的日志以及tomcat的日志

图6

apache安装目录下的logs文件夹下就存放这apache的相关日志

access.log文件用于记录apache接收到请求以及响应状态的日志

error.log文件用于记录apache的运行错误

httpd.pid文件用于记录进程pid

mod_jk.log文件用于记录请求转发给tomcat的日志

图7

tomcat的日志:

localhost_access_log.日期.txt文件用于记录tomcat接收到的请求以及响应的状态等,做用于apache的access.log相似

catalina.日期.txt文件用于记录tomcat启动时候控制台的一些信息以及服务端错误信息

localhost.日期.txt文件用于记 录站点访问信息,Tomcat下内部代码丢出的日志,文件名localhost.日期.log(jsp页面内部错误的异 常,org.apache.jasper.runtime.HttpJspBase.service类丢出的,日志信息就在该文件!)

8.官方文档中对于集群中session repliction的要求:

图8

总共8点:

  1).session中的属性必须所有为实现Serializable

  2).tomcat的server.xml配置文件中的<Cluster>节点的注释去掉

  3).就是用于用于检测当前的响应是否涉及Session数据的更新,若是是则启动Session拷贝操做,这个属性后面会有一个filter属性,filter即过滤不须要Session拷贝操做的内容

  4).若是tomcat在同一个机器上的,那么确保tcpListenerPort端口的惟一性

  5).web.xml中必须添加<distributable/>属性

  6).若是使用mod_jk,那么须要在server.xml中的<Engine/>节点中添加jvmRoute=“tomcat1”属性,事实证实在ajp端口那边添加也是可行的

  7).确保全部的tomcat时钟同步,使用ntp服务器来达成

  8).确保负载均衡器的sticky_session=false已经设置,即设置为非粘性

相关文章
相关标签/搜索