- 下载需要的文件 我用的两个 tomcat8,Apache24,mod_jk.so 1.2.40的
地址 https://www.apachehaus.com/cgi-bin/download.plx#APACHE24VC14
下载好解压即可
地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/
下载后解压会有一个 mod_jk.so文件 把他放到D:\SoftWare\Apache24\modules里面
2.先配置好apache服务器 的配置文件
打开D:\SoftWare\Apache24\conf 下面加三个配置文件
mod_jk.conf 里面的配置
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule jk_module modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm
# JkOptions +RejectUnsafeURI
# JkStripSession On
JkWatchdogInterval 60
<Location /jk-status>
# Inside Location we can omit the URL in JkMount
JkMount jk-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /jk-manager>
# Inside Location we can omit the URL in JkMount
JkMount jk-manager
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
JkMountFile conf/uriworkermap.properties
JkMount /* balancer
# JkUnMount /myapp/static/* *
# JkUnMount /myapp/images/* balancer
# SetEnvIf REQUEST_URI "\.(htm|html|css|gif|jpg|js)$" no-jk
# SetEnvIf Request_URI "/transactions/" JK_REPLY_TIMEOUT=600000
# SetEnvIf Request_URI "/reports/" JK_REPLY_TIMEOUT=0
</IfModule>
Workers.properties
Workers实际上属于Tomcat的链接器(Connector),代表了一个Tomcat实例,这个实例代表了由某种web服务器来执行 servelet程序。举例来说,我们可以使用某个服务器,例如apache 来把servelet请求转递Tomcat进程(worker)来进行后台处理。
这样我们就可以通过配置多个 Worker,让不同的请求能够被不同的Worker处理,这些Worker可以提供不同的开发环境,使得所有开发者可以共享一个服务器而每个人都拥有自己的Worker。
想要提供负载平衡,只要在同一台机器上运行多个Tomcat Worker并且能够在这些Worker之间分布Web请求。
Tomcat Workers都定义在一个叫做workers.properties属性文件之中,并且workers的说明告诉应该如何使用它们。
全局配置项
指令 默认 说明
worker.list ajp13 由逗号分离开的worker名称列表.
worker.maintain 60 辅助连接池保持间隔,以秒为单位。
链接指令
可配置一个通用的,然后每个work进行继承。
指令 默认 说明
type ajp13 指定Tomcat服务器 与Apache之间的通信协议
host localhost Tomcat主机名或 IP 地址。
port 8009 Tomcat侦听端口号。AJP13的默认端口是8009.
socket_connect_timeout socket_timeout*1000 套接字超时时间(毫秒为单位)。
socket_keepalive false 在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置,一般为120秒)
ping_mode -
探测tomcat的状态策略。
C(content):链接模式,最后一次链接判断是否超时。connect_timeout定义时间。若未定义使用ping_timeout。
P(prepost):请求模式,通过每次请求判断是否超时。prepost_timeout定义时间。若未定义使用ping_timeout。
I(interval):间隔模式,定期检测链接是否超时。connection_ping_interval间隔时间。ping_timeout超时时间。
A:以上所有的探测策略都将开启。
connection_pool_size JK会维护多个长连接做为一个池。它被用来设置每个WebServer(Apache)子进程的最大连接数。
connection_pool_minsize (pool+1)/2 连接池中维护最小的连接数。
connection_pool_timeout 0 在连连池中维护的非活动连接连续多少秒后被释放。如果为0,则不释放。
connection_acquire_timeout retries*retry_interval 获取接连的超时。
lbfactor 1 负载平衡器权值
负载均衡设置
指令 默认 说明
balance_workers 逗号分隔的worker列表
sticky_session true 负载喷发采用Session粘贴机制,按SessionID喷发请求。为了保障同一SessionID的请求被分发到同一台服务器上。
sticky_session_force false 如果为True, SessionID并不合法时则返回500错误,否则,丢掉Session并转发到另外的机器上。
workers.properties的配置
# Define two status worker:
# - jk-status for read-only use
# - jk-manager for read/write use
worker.list=jk-status
worker.jk-status.type=status
worker.jk-status.read_only=true
worker.list=jk-manager
worker.jk-manager.type=status
# We define a load balancer worker
# with name "balancer"
worker.list=balancer
worker.balancer.type=lb
worker.balancer.error_escalation_time=0
worker.balancer.max_reply_timeouts=10
worker.balancer.sticky_session=true
worker.balancer.sticky_session_force=true
# Now we add members to the load balancer First member is "tomcat1", most attributes are inherited from the template "worker.template".
worker.balancer.balance_workers=tomcatA
worker.tomcatA.reference=worker.template
worker.tomcatA.host=127.0.0.1
worker.tomcatA.port=18009
worker.tomcatA.activation=A
# Second member is "tomcat2", most attributes are inherited from the template "worker.template".
worker.balancer.balance_workers=tomcatB
worker.tomcatB.reference=worker.template
worker.tomcatB.host=127.0.0.1
worker.tomcatB.port=28009
worker.tomcatB.activation=A
# Finally we put the parameters
worker.template.type=ajp13
worker.template.socket_connect_timeout=5000
worker.template.socket_keepalive=true
worker.template.ping_mode=A
worker.template.ping_timeout=10000
worker.template.connection_pool_minsize=0
worker.template.connection_pool_timeout=600
worker.template.reply_timeout=300000
worker.template.recovery_options=3
uriworkermap.properties 里的配置
/*.do=balancer
/*.jsp=balancer
#/*.gif=balancer
#/*.jpg=balancer
#/*.png=balancer
#/*.css=balancer
#/*.js=balancer
#/*.htm=balancer
#/*.html=balancer
#/*.txt=balancer
# Optionally filter out all .jpeg files inside that context
# For no mapping the url has to start with exclamation (!)
!/servlets-examples/*.jpeg=lb
#
# Mount jkstatus to /jkmanager
# For production servers you will need to
# secure the access to the /jkmanager url
#
/jk-manager=jk-manager
/jk-status=jk-status
http://tomcat.apache.org/connectors-doc/reference/uriworkermap.html
修改 httpd.conf
这个路径修改成你自己的路径
确保这个端口是打开的
文件的最底部添加代码 Include conf/mod_jk.conf
此时 apache就配置好了 常用的命令如下
httpd.exe -k install #安装
httpd.exe -k install #卸载
httpd.exe -k start #启动
httpd.exe -k restart #重启
httpd.exe -k stop #停止
3.修改 tomcat 配置 两个 tomcat的 端口号都不要一样就好
集群session同步的 兩種方式 一个是 http的 sticky模式 一个是 用ajp的 复制模式
sticky模式
前端balancer可实现sticky模式的session同步功能。利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失;同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用。
复制模式
利用Tomcat session复制的机制使得所有session在所有Tomcat节点中保持一致。当一个节点修改一个session数据的时候,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点。这样当下一个用户请求被负载均衡器分配到另外一个节点的时候,那个节点上有完备的 session信息可以用来服务该请求。这种做法的问题是对session哪怕有一点点修改,也要把整个sessions数据全部序列化 (serialize),还要广播给集群中所有节点,不管该节点到底需不需要这个session。这样很容易会造成大量的网络通信,导致网络阻塞。一般采 用这种方式,当Tomcat节点超过4个时候,整个集群的吞吐量就不能再上升了;
<Connector port="9101" protocol="HTTP/1.1" #修改端口号
connectionTimeout="20000" redirectPort="8443"
/>
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" /> #修改端口号
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">下面添加如下,为了集群配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
bind="127.0.0.1"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4001"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" timeout="60000"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
4.项目的 web.xml 最底部加代码
此时 启动 分别启动tomcat 启动apache 就可以了