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 中,有一份默认配置:
这份默认配置可以满足大多数应用场景,因此,我们只需要将这份配置复制到<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
下载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
相关文章推荐
- Apache + Tomcat +mod_jk- win7与linux下实现负载均衡与集群-
- Linux下Apache负载tomcat集群
- Apache + Tomcat +mod_jk- win7与linux下实现负载均衡与集群-
- 安装集群apache+tomcat实现负载均衡与集群的配置
- linux下mysql,jdk,tomcat,apache的安装和整合
- Linux下Apache与Tomcat的完全分布式集群配置(负载均衡)
- apache与tomcat负载集群集成方法有3种方式
- 基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
- apache + tomcat集群负载均衡,Session复制
- Apache+Tomcat实现负载均衡及集群(session同步)--四、负载均衡(2)使用mod_proxy
- Apache+Tomcat实现负载均衡及集群(session同步)--五、session同步(3)使用memcache
- Red Hat Linux,Apache2.0+Weblogic9.2负载均衡集群安装配置
- Linux平台上搭建apache+tomcat负载均衡集群
- CentOS 6.5 安装tomcat集群,配置Apache做负载均衡
- centos6 64位下安装apache服务器(后续将安装svn,tomcat集群)
- Apache+Tomcat+JK 实现集群、负载均衡
- Tomcat与Apache或Nginx的集群负载均衡设置及Sersync同步应用(1) 推荐
- Apache Http Server与Tomcat实现负载均衡和集群