您的位置:首页 > 运维架构 > Tomcat

linux下安装apache并进行tomcat集群负载

2012-12-29 21:53 751 查看
1软件的准备

下载apache软件,其官方网站是http://httpd.apache.org点击DownLoad 下载 httpd-2.4.3.tar.gz源码包

    安装Apache Tomcat Connector(mod_jk),此包是必须的,再进行tomcat集群配置时,是要用到此包的其下载

    地址是http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/,下载tomcat-connectors-1.2.32-src.tar.gz包

   2安装apache软件

    在usr/local下面进行解压 tar -zxvf httpd-2.4.3.tar.gz

mv httpd-2.4.3 apache2

进入到apache2下面进行编译安装./configure --prefix=/usr/local/apache --enable-module=all

(--enable-module=all 表示安装所有核心模块),此时发现可能会报错

     configure: error: APR not found. Please read the documentation

       缺少 apr-1.4.6.tar.gz
包,可以在其官网上去下载http://apr.apache.org/download.cgi

     此包需要编译安装,然后在进行安装apache时将此包指向到安装的地方

      

      [root@localhost apache]# tar -zxf apr-1.4.6.tar.gz

     [root@localhost apache]# cd apr-1.4.6

     [root@localhost apr-1.4.6]# ./configure --prefix=/usr/local/apr

     [root@localhost apr-1.4.6]# make

     [root@localhost apr-1.4.6]# make install

      当你继续安装apache时:./configure --prefix=/usr/local/apache --enable-module=all --with-apr=/usr/local/apr-1.4.6

      发现其缺少configure: error: APR-util not found. Please read the documentation

一样此时你需要去http://apr.apache.org/download.cgi下载apr-util-1.4.1.tar.gz  

      [root@localhost apache]# tar -zxf apr-util-1.4.1.tar.gz

      [root@localhost apache]# cd apr-util-1.4.1

     [root@localhost apr-util-1.4.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config (待定)

     [root@localhost apr-util-1.4.1]# make

     [root@localhost apr-util-1.4.1]# make install

      然后继续安装./configure --prefix=/usr/local/apache --enable-module=all --with-apr=/usr/local/apr-1.4.6 --with-apr-util=/usr/local/apr-util-1.5.1

       编译发现依据报错如下:

configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
没有pcre包,其下载地址是下载地址:http://ftp.exim.llorien.org/pcre/   

下载pcre-8.30.zip

[root@localhost apache]#unzip -o pcre-8.30.zip

[root@localhost apache]#cd pcre-8.30

[root@localhost pcre-8.30]#./configure --prefix=/usr/local/pcre

[root@localhost pcre-8.30]#make

[root@localhost pcre-8.30]#make install

安装pcre时报checking for windows.h... no

configure: error: You need a C++ compiler for C++ support. 说明系统没有安装gcc编译器

执行以下命令:yum install gcc-c++

最后执行安装命令如下:

./configure --prefix=/usr/local/apache --enable-module=all --with-apr=/usr/local/apr-1.4.6 --with-apr-util=/usr/local/apr-util-1.5.1 --with-pcre=/usr/local/pcre-8.32/

   make&make install

2安装mod_jk

   #tar -zxvf tomcat-connectors-1.2.32-src.tar.gz

   cd tomcat-connectors-1.2.32-src/native

   #chmod 755 buildconf.sh

   #./buildconf.sh

   #./configure --with-apxs=/usr/local/apache/bin/apxs (这个apxs是在apache安装目录下)

    make

make install

此过程你会发现报错如下:mod_jk.c: In function 'init_ws_service':

mod_jk.c:767: error: 'conn_rec' has no member named 'remote_ip'

mod_jk.c:768: error: 'conn_rec' has no member named 'remote_addr'

mod_jk.c:1036: error: 'conn_rec' has no member named 'remote_ip'

mod_jk.c:1036: error: 'conn_rec' has no member named 'remote_ip'

make[1]: *** [mod_jk.lo] 错误 1

    解决办法是将/usr/local/tomcat-connectors-1.2.32-src/native/apache-2.0下面mod_jk.c的码进行修改:

  

Line 767:

Before:

s->remote_addr = r->connection->remote_ip;

After

s->remote_addr = r->connection->client_ip;

Line 768:

Before:

s->remote_port = apr_itoa(r->pool, r->connection->remote_addr->port);

After:

s->remote_port = apr_itoa(r->pool, r->connection->client_addr->port);

Line 1036:

Before:

STRNULL_FOR_NULL(r->connection->remote_ip),

After:

STRNULL_FOR_NULL(r->connection->client_ip),

  修改后,重新执行搞定

    此时安装成功后,你会发现在/usr/local/apache/modules下面找到mod_jk.so文件,其在/usr/local/tomcat-connectors-1.2.32-src/native/apache-2.0下面也有mod_jk.so的文件!

  3配置tomcat集群

开启tomcat集群功能,同样是在conf/server.xml文件里,进行两处改动:

   改动1:为<Engine>设置jvmRoute

   实际上,在server.xml里就有一段现成的带jvmRoute的<Engine>配置,我们可以参考这段配置为<Engine/>加个jvmRoute就可以了,对于jvmRoute的取值要特别注意:其值必须于后面要提到的mod_jk的workers.properties文件中结点名相一致!由于那个文件中结点名为tomcat1和tomcat2,因此,此处我们必须设定jvmRoute的值为这两个值之一。关于这一点在tomcat官方关于Apache
Tomcat Connector的文档 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 也有明确提及。jvmRoute值会出现在由该结点创建的session id中,例如:在非集群环境下,一个sessionid可能是 “xxxxxxxxx” 的格式,而在集群环境下,如果当前结点的jvmRtomat1oute被配置为tomcat1,那由该结点生成的sessionid将变成“xxxxxxxxx.tomat1”格式,而mod_jk正是依赖于这个节点后缀实现sticky
session的,也就是把所有后缀是tomat1的请求都发送给tomat1结点进行处理。

<!--
You should set jvmRoute to support load-balancing via AJP ie :

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

-->

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

 改动2:

改动2:在<Engine/>中添加关于集群的配置

在tomcat官方关于tomcat集群配置的文档:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 中,有一份默认配置:

<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>


   这份默认配置可以满足大多数应用场景,因此,我们只需要将这份配置复制到<Engine/>中,tomcat的配置就全部完成了。

    4配置apache

打开apache安装目录下的conf/httpd.conf文件,在文件最后追加以下内容

# Load mod_jk
module

LoadModule jk_module modules/mod_jk.so #设置apache集群tomcat模块

# Specify jk log file.

JkLogFile /var/log/mod_jk.log    #设置日志

# Specify jk log level [debug/error/info]

JkLogLevel info            #设置日志级别

# Specify workers.properties, this file tell jk:

# how many nodes and where they are.

JkWorkersFile conf/workers.properties #要读取的配置文件

# Specify which requests should handled by which node.

JkMount /* controller

 关于mod_jk配置项的详细内容,可参考:http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

上述配置中:JkWorkersFile conf/workers.properties 指明由一个workers.properties文件来描述集群结点的情况,因此,我们需要创建这个workers.properties文件,并放置于conf文件夹下,这个文件的内容如下:

#所有节点列表,其中controller是一个逻辑结点,负责负载均衡控制,

#如果JkMount中的URL指定给了controller就表示这个请求会被自动散列到某个物理节点上。

#注意:真正负责处理请求的tomcat的名称(这里就是tomcat1,tomcat2)必须于它们在conf/server.xml

#文件中配置的jvmRout的属性值是一致的!

worker.list = controller,tomcat1,tomcat2

#========tomcat1========

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

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

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor = 1 #server的加权比重,值越高,分得的请求越多

#========tomcat2========

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

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

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor = 1 #server的加权比重,值越高,分得的请求越多

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.balance_workers=tomcat1,tomcat2 #指定分担请求的tomcat,旧版本中的balanced_workers,已不再推荐使用!

worker.controller.sticky_session=1 #sticky_session为1表示,

#当某一 client的session创建之后,后续由该客户端发起的请求,也就是这个session的所有请求都始终由第一次处理该请求的结点

#负责处理(除非该结点挂掉)

       其中的6009就是tomcat中的server.xml <Connector port="80099" protocol="AJP/1.3" redirectPort="8443" />的这个端口

    然后将http.conf中的端口改为监听端口,在其/usr/local/apache/bin下面执行如下命令:

        开启: ./apachectl start

        关闭: ./apachectl stop

     以上配置成功,由于我的应用将用户的会话是放在分布式缓存memcache中的,因此没有在应用程序中配置tomcat中的session复制。

    如果需要配置tomcat中的session复制:应用程序要为集群所做的准备

  1. 在应用程序的web.xml中需要加入:<distributable/>元素

  2. session中存放的数据(如attribute)必须实现序列化。

   tomcat官方关于tomcat集群配置的文档:
http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html
tomcat官方关于Apache Tomcat Connector的文档
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html
apache官方关于apache的安装文档
http://httpd.apache.org/docs/2.2/en/install.html
apache官方关于configure参数的文档
http://httpd.apache.org/docs/2.2/en/programs/configure.html#installationdirectories
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: