Apache+mod_jk+tomcat集群搭建

环境

  • 四台主机: cloud01,cloud02,cloud03,cloud04
  • OS: CentOS 6.5
  • Tomcat安装位置: /opt/tomcat

集群方案

  • cloud02 cloud03 cloud04 为 tomcat 节点
  • cloud01 上的 apache 作负载均衡
  • 端口均使用标准端口, 由于是部署在不一样的机器上

安装 Apache

yum install httpd
# 完成后 须要在 /etc/httpd/conf/httpd.conf 中添加一句
# ServerName localhost

若是想要使用 apachectl status 命令 须要 elinks yum install elinks -y 和 mod_status, 通常 mode_status 是默认加载的,可是还要一点配置. git

在 httpd.conf 中添加以下配置 github

ExtendedStatus on
<IfModule mod_status.c>
    # Allow server status reports generated by mod_status,
    # with the URL of http://servername/server-status
    # Change the ".example.com" to match your domain to enable.
    #
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Allow from all
    </Location>
</IfModule>

若是配置后还有 /server/status 错误, 参考这里 apache

编译/配置 mod_jk

编译 mod_jk

# 使用的时候最新版本为 1.2.40
# 能够查看其余版本 http://www.apache.org/dist/tomcat/tomcat-connectors/jk/
# 这里有点扯淡的是 1.2.40的脚本都是 dos 格式的, 须要先 dos2unix
# 因此我直接换了个版本 使用的 1.2.39 的, 代码格没问题

wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.39-src.zip
unzip tomcat-connectors*.zip
cd tomcat-connectors*
cd native
yum install -y httpd-devel
./configure --with-apxs=/usr/sbin/apxs
make
make install

配置 mod_jk.conf

新建 /etc/httpd/conf/mod_jk.conf, 写入以下内容 tomcat

# 加载mod_jk Module
# /usr/lib64/httpd/modules/mod_jk.so
LoadModule jk_module modules/mod_jk.so

# 指定workers.properties文件路径 
JkWorkersFile conf/workers.properties

# 指定那些请求交给tomcat处理
# "controller"为在workers.propertise里指定的负载分配控制器名
JkMount /* controller

配置 workers.properties

新建 /etc/httpd/conf/workers.properties, 写入以下内容 session

#server
worker.list = controller
#========cloud03========
#ajp13端口号,在tomcat下server.xml配置,默认 8009
worker.cloud03.port=8009

#tomcat的主机地址,如不为本机,请填写ip地址 
worker.cloud03.host=cloud03

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

# server的加权比重,值越高,分得的请求越多。
# lbfactor是负载平衡因数(Load Balance Factor)
worker.cloud03.lbfactor=1

#========cloud02========
worker.cloud02.port=8009
worker.cloud02.host=cloud02
worker.cloud02.type=ajp13
worker.cloud02.lbfactor=1

#========cloud04========
worker.cloud04.port=8009
worker.cloud04.host=cloud04
worker.cloud04.type=ajp13
worker.cloud04.lbfactor=1

#========controller,负载均衡控制器========
#负载均衡控制器类型,lbfactor是负载平衡因数(Load Balance Factor)
worker.controller.type=lb

#指定分担请求的tomcat列表
worker.controller.balanced_workers=cloud03,cloud02,cloud04

# 粘性session(默认是打开的) 
# 当该属性值=true(或1)时,表明session是粘性的,
# 即同一session在集群中的同一个节点上处理,
# session不跨越节点。在集群环境中,通常将该值设置为false
worker.controller.sticky_session=false

# 设置用于负载均衡的server的session能否共享
worker.controller.sticky_session_force=1

修改 httpd.conf

修改/etc/httpd/conf/httpd.conf,在最后添加: 负载均衡

Include conf/mod_jk.conf

配置 tomcat

安装 tomcat 只须要下载解压就能够了, 没什么特殊的.如下的配置都是在 server.xml 中进行的. 该配置文件在 tomcat 安装目录中 conf 目录下. dom

搜索 Engine 节点, 添加 jvmRoute 属性为以前 worker.properties 配置的名字.由于我在配置 worker.propertis 时都是使用的主机名,因此 cloud02 修改后就是 ssh

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

cloud03, cloud04 也这样修改. jvm

而后在 </Engine> 前, 加入以下内容. tcp

<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.ClusterSessionListener"/>
</Cluster>

启动集群

# 在 cloud01 中操做
ssh cloud01
# 启动 apache 须要 root 权限
sudo apachectl restart
# 启动全部节点
# 注意: 下面 tomcat 的路径须要根据我的的安装来修改
for i in $(echo 02 03 04);
do
    ssh "cloud$i" /opt/tomcat/bin/startup.sh;
done;

# 查看运行状态, 确保有 BootStrap 进程
for i in $(echo 02 03 04); do echo ====$i====;ssh "cloud$i" jps; done;

集群配置完成后能够经过刷新 http://cloud01/manager/status 这个页面, 观察 IP address 来判断是否成功.

其余

有的 tomcat 配置提到 <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>, 该类在 tomcat8 中已经移除了.参看

相关文章
相关标签/搜索