近日,因为公司项目须要,因此学习了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已经设置,即设置为非粘性