惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 钛网络

MSSQL处理死锁存储过程 GridView使用大全 打印机每天都要重新连接 数据库安装时挂起问题 在运行 32 位版本的 SQL Server 2000 SP4 的计算机上启用 AWE 时有些内存不可用 SQL Server 2000安装故障 关于asp.net 2.0的认知太少的问题 SQL 操作————简单查询初探 SQL 操作————不等联接 SQL SERVER中直接循环写入数据 SQL Server日期计算 SQL Server安全规划全攻略 SQL Server:创建索引视图 SQL Server 2000的安全配置 - 钛网络 Oracle大数据量分页通用存储过程 ASP.NET文件上传下载 - 钛网络 ASP.Net生成静态HTML页 2 ASP.NET上传文件的实例 ASP.NET封装的数据库访问基类
真正部署中的apache+tomcat负载均衡
钛网络 · 2010-06-30 · via 博客园 - 钛网络

Apache + Tomcat 配置负载均衡

此文档内容已经经过测试

JavaSDK版本: 1.6.20
Apache版本: 2.2.15
Tomcat版本: 6.0.26
====================================
安装
javaSDK就默认安装了.

apache的安装没有什么特别的,一路下一步即可,当然,最好修改apache的默认安装目录.
安装时注意,80端口不要被占用了.

tomcat的安装需要考虑下,是采用解压版本的tomcat,还是安装版本的tomcat.
我们这里采用解压版的tomcat(不是炫耀自己).
因为需要做tomcat的负载均衡,因此肯定需要解压2个以上的tomcat.我们这里用两个tomcat.

解压到某一个目录中后,需要修改tomcat目录中bin目录下的catalina.bat文件和catalina.bat文件,在文件首部加入:
set JDK_DIR=C:\Program Files\Java\jdk1.6.0_20
set JAVA_HOME=%JDK_DIR%
set tomcatStart="d:\tomcat1\bin\"
这样运行每个tomcat时,就不会因java和tomcat路径混乱导致出错了.

配置
一、配置apache
修改apache的配置文件httpd.conf

1. 启用moddle
将以下Module的注释去掉,这里并没有使用mod_jk.so进行apache和tomcat的链接,从2.X以后apache自身已集成了mod_jk.so的功能。只需简单的把下面几行去掉注释,就相当于以前用mod_jk.so比较繁琐的配置了。这里主要采用了代理的方法,就这么简单。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

注: 我启用了三个就OK了  mod_proxy.so  /  mod_proxy_ajp.so   /  mod_proxy_balancer.so

2. 添加页面
再找到<IfModule dir_module></IfModule>加上index.jsp修改成
<IfModule dir_module>
DirectoryIndex index.html index.jsp
</IfModule>

3. 加入BalancerMember成员(与tomcat关联)
然后在httpd.conf文件最下方加入:

ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:8010 loadfactor=1 route=jvm2
</proxy>

这里的IP跟端口就是跟tomcat中的配置一样即可.如果在同一台计算机上,就如上配置,如果不在同一台计算机上,就要修改IP.
上面的两个BalancerMember成员就是我们配置的tomcat集群.

4. 虚拟主机设置
接下来进行虚拟主机的设置。APACHE的虚拟主机设置如下:
首先要修改 conf/httpd.conf找到(#Include conf/extra/httpd-vhosts.conf) , 把注释去掉。
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
在下面加入
<VirtualHost *:80>
         ServerAdmin tgh1981@163.com
         ServerName localhost
         ServerAlias localhost
         ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
         ProxyPassReverse / balancer://cluster/
</VirtualHost>
其中的域名和路径根据你自己情况设置
然后再设置TOMCAT虚拟主机

二、tomcat配置

修改tomcat1的配置文件 server.xml

1. 修改SHUTDOWN端口(tomcat的关闭端口)
tomcat1:<Server port="8005" shutdown="SHUTDOWN">
tomcat2:<Server port="8006" shutdown="SHUTDOWN">

2. 修改运行端口
因为tomcat有两个,因此只需要修改其中某一个tomcat运行的端口即可:
tomcat1:
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
tomcat2:
<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
注:只需要修改port参数,不用修改redirectPort参数

3. 修改connector的端口
tomcat1:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
tomcat2:<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
注:只需要修改port参数,不用修改redirectPort参数

4. 启用配置 Engine
为了通过AJP来支持负载均衡,需要配置engine的jvmRoute属性.
server.xml文件中, 修改Engine 段, 增加jvmRoute参数,如下:
tomcat1:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
tomcat2:<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">

5. 配置Cluster
server.xml文件中,原来的配置 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 应该是被注释的,现在用下面的配置代替:(tomcat文档中推荐的).这个设置是主要用以tomcat的集群.
关键在于 Receiver 段中的port参数,tomcat之间必须不同:
tomcat1:
       <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.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      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.MessageDispatch15Interceptor"/>
          </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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

tomcat2:
       <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.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4001"
                      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.MessageDispatch15Interceptor"/>
          </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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>


三、启动服务,测试tomcat自带的例子

1、测试apache和tomcat协作。
先在每个tomcat中的\webapps\ROOT下的index.jsp下面加上以下的测试代码部分:(X代表不同的tomcat的输出不同的信息),把index.html删除,以免影响测试效果。在最后面的加上.即</table></body>之间。
<%
      System.out.println("hello,world!");
%>
然后再通过http://127.0.0.1/来访问一下,就会出现大家熟悉的猫猫。
然后再通过分别访问
http://127.0.0.1:8080/http://127.0.0.1:8081/ , 它们访问的内容和上面的http://127.0.0.1/是一样的。
这样就说明apache和TOMCAT整合成功!
2、测试均衡器
通过http:// 127.0.0.1多次访问,要想看到真正的效果,必须用一些压力测试工具,可用微软Microsoft Web Application Stress Tool进行简单压力测试,不然你靠不停刷新是体现不出来的,你只会在一个tomcat的控制台有输出结果。只用用压力测试工具模拟大量用户同时访问,你会发现四个tomcat控制台均有打出控制信息,说明均衡器工作正常。


四、问题处理

若启动时出现这样的错误提示:
2010-06-28 15:04:51 org.apache.catalina.ha.deploy.FarmWarDeployer start
严重: FarmWarDeployer can only work as host cluster subelement! 
则将以下部分注释掉: (一般情况都会遇到的)
<!--
 <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"   
  tempDir="/tmp/war-temp/"   
  deployDir="/tmp/war-deploy/"   
  watchDir="/tmp/war-listen/"   
  watchEnabled="false"/>   
--> 

 以上内容参考了诸多文档,终于自己测试OK并部署成功了.