apache服务器和tomcat的连接方法其实有三种:mod_JK、http_proxy和ajp_proxy。
采用ajp代理模式配置Apache+tomcat实现负载均衡(从2.X以后apache自身已集成了mod_jk.so的功能)
使用这种协议,具有更高的性能,因为它采用的是二进制传输。比HTTP的文本传输要有更高的效率。在Apache中要使用mod_proxy和mod_proxy_ajp,在Tomcat中则要开启ajp服务。
APAHCE 2.2.4下载地址
http://archive.apache.org/dist/httpd/binaries/win32/apache_2.2.4-win32-x86-no_ssl.msi
安装后配置
1.httpd.conf配置
将下面的内容去掉注释:(其实注释掉前面三行也就行了,因为采用的是ajp代理)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule status_module modules/mod_status.so
LoadModule info_module modules/mod_info.so //这两个是集群监控用的
再找到<IfModule dir_module></IfModule>加上index.jsp修改成
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>
找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。
apache监控必须在负载均衡之前配置
#过滤server-stauts监控页面
ProxyPass /server-status !
#过滤balancer-manager监控页面
ProxyPass /balancer-manager !
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /balancer-manager >
SetHandler balancer-manager
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
负载均衡实现:
在httpd.conf 最下面加入,ProxyRequests Off 是告诉Apache需要使用反向代理
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=jvm2
</proxy>
配置虚拟主机
修改conf/extra/httpd-vhosts.conf文件
在文件最下面加入 删除其他无用的<VirtualHost>
<VirtualHost *:80>
ServerAdmin 934033381@qq.com
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On #重定向
ProxyPassReverse / balancer://cluster/ #反向代理
</VirtualHost>
注:
session replication 会话复制
session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;
session sticky 会话不复制
即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;
nofailover (无故障切换) 默认值off
如果设为‘On’,当工作单元被禁用或者出错时,会话则立即中断。可以将该值设为On,如果后端服务器不支持会话复制(Session replication)。
配置tomcat
我们需要在一台机器上跑2个不同的tomcat ,需要修改不同的tomcat的关闭口,避免出现端口被占用的情况
分别为
1.配置关闭端口
<Server port="8105" shutdown="SHUTDOWN">
<Server port="8205" shutdown="SHUTDOWN">
2.配置 Engine
把原来的配置注释掉
<!-- <Engine name="Catalina" defaultHost="localhost"> -->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
3.配置Connector的端口
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" URIEncoding="UTF-8"/>
<Connector port="9080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" URIEncoding="UTF-8"/>
4.配置 AJP 1.3 Connector
<Connector port="8109" protocol="AJP/1.3" redirectPort="443" />
<Connector port="8209" protocol="AJP/1.3" redirectPort="443" />
5.配置Cluster(每个tomcat中都要修改,这里的配置是为了可以在集群中的所有tomcat节点间共享会话(Session))
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
修改为
<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" address="228.0.0.4" port="45564" frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="5001" selectorTimeout="100"
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.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;"/>
<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>
项目的web.xml文件中<web-app>节点下添加 <distributable/>
主要是添加<distributable/>,distributable元素用来告诉servlet容器,程序将部署在分布式Web容器中
最后启动apache ,tomcat1 ,tomcat2
删除环境变量中的CATALINA_HOME=D:\Program Files\apache-tomcat-7.0.62,
不然多个tomcat在同一台机器上使用的是同一个配置文件,端口冲突无法启动
采用ajp代理模式配置Apache+tomcat实现负载均衡(从2.X以后apache自身已集成了mod_jk.so的功能)
使用这种协议,具有更高的性能,因为它采用的是二进制传输。比HTTP的文本传输要有更高的效率。在Apache中要使用mod_proxy和mod_proxy_ajp,在Tomcat中则要开启ajp服务。
APAHCE 2.2.4下载地址
http://archive.apache.org/dist/httpd/binaries/win32/apache_2.2.4-win32-x86-no_ssl.msi
安装后配置
1.httpd.conf配置
将下面的内容去掉注释:(其实注释掉前面三行也就行了,因为采用的是ajp代理)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule status_module modules/mod_status.so
LoadModule info_module modules/mod_info.so //这两个是集群监控用的
再找到<IfModule dir_module></IfModule>加上index.jsp修改成
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>
找到Include conf/extra/httpd-vhosts.conf,去掉前面的注释符。
apache监控必须在负载均衡之前配置
#过滤server-stauts监控页面
ProxyPass /server-status !
#过滤balancer-manager监控页面
ProxyPass /balancer-manager !
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /balancer-manager >
SetHandler balancer-manager
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
负载均衡实现:
在httpd.conf 最下面加入,ProxyRequests Off 是告诉Apache需要使用反向代理
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=jvm2
</proxy>
配置虚拟主机
修改conf/extra/httpd-vhosts.conf文件
在文件最下面加入 删除其他无用的<VirtualHost>
<VirtualHost *:80>
ServerAdmin 934033381@qq.com
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On #重定向
ProxyPassReverse / balancer://cluster/ #反向代理
</VirtualHost>
注:
session replication 会话复制
session共享,多个服务器session拷贝保存,一台宕机不会影响用户的登录状态;
session sticky 会话不复制
即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部署,会丢失;
nofailover (无故障切换) 默认值off
如果设为‘On’,当工作单元被禁用或者出错时,会话则立即中断。可以将该值设为On,如果后端服务器不支持会话复制(Session replication)。
配置tomcat
我们需要在一台机器上跑2个不同的tomcat ,需要修改不同的tomcat的关闭口,避免出现端口被占用的情况
分别为
1.配置关闭端口
<Server port="8105" shutdown="SHUTDOWN">
<Server port="8205" shutdown="SHUTDOWN">
2.配置 Engine
把原来的配置注释掉
<!-- <Engine name="Catalina" defaultHost="localhost"> -->
<Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1">
3.配置Connector的端口
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" URIEncoding="UTF-8"/>
<Connector port="9080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" URIEncoding="UTF-8"/>
4.配置 AJP 1.3 Connector
<Connector port="8109" protocol="AJP/1.3" redirectPort="443" />
<Connector port="8209" protocol="AJP/1.3" redirectPort="443" />
5.配置Cluster(每个tomcat中都要修改,这里的配置是为了可以在集群中的所有tomcat节点间共享会话(Session))
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
修改为
<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" address="228.0.0.4" port="45564" frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="5001" selectorTimeout="100"
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.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;"/>
<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>
项目的web.xml文件中<web-app>节点下添加 <distributable/>
主要是添加<distributable/>,distributable元素用来告诉servlet容器,程序将部署在分布式Web容器中
最后启动apache ,tomcat1 ,tomcat2
删除环境变量中的CATALINA_HOME=D:\Program Files\apache-tomcat-7.0.62,
不然多个tomcat在同一台机器上使用的是同一个配置文件,端口冲突无法启动