Apache +Tomcat负载均衡能保证较高的可用性和系统性能,这些是通过Apache与Tomcat之间的通讯来完成的。Apache和Tomcat之间的通讯基本有三种方式:Mod_Jk、HTTP_Proxy、AJP_Proxy其中以Mod_Jk最为流行,并且官方的文档也非常全。
Mod_JK是Apache的一个模块,其通过AJP协议实现与Tomcat之间的通讯,Tomcat通过设置Connector监听AJP的连接请求。
注意:如果希望apache与tomcat通信使用 HTTP 协议则需要使用 HTTP_Proxy,请看最后。
安装Mod_JK:
从http://tomcat.apache.org/download-connectors.cgi下载源码:tomcat-connectors-1.2.40-src.tar.gz
tar zxvf tomcat-connectors-1.2.40-src.tar.gz
cd tomcat-connectors-1.2.40-src/
cd native/
./configure --with-apxs=/home/soft/httpd-2.4.10/bin/apxs --prefix=/home/soft/tomcat-connectors-1.2.40
make
make install
可选
make clean
make distclean
注:安装结果貌似不会装到/tomcat-connectors-1.2.40,但会往本地apache httpd 写入文件,比如添加了:modules/mod_jk.so
负载均衡配置步骤:
1.在apache安装目录下conf目录中找到httpd.conf,在最后加上配置 Include conf/mod_jk.conf
2.将mod_jk.so文件放入Apache\modules文件夹
3.新建mod_jk.conf文件并配置
4.新建workers.properties和uriworkermap.properties文件并配置
5.修改各个tomcat配置文件server.xml,主要对应端口和设置engine的jvmRoute属性
mod_jk.conf 内容:
# 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk.so
# workers.properties 位置
JkWorkersFile conf/mine_jk/workers.properties
#加载workers的请求处理分配文件
JkMountFile conf/mine_jk/uriworkermap.properties
# 日志存放位置
JkLogFile logs/mine_mod_jk.log
# 设置日志级别 [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
workers.properties 内容:
# 定义worker,此处的list名称必须和mod_jk.conf文件中的 dispatcher 名称一致
worker.list=dispatcher,status
# Define Node1
worker.tomcat1.port=8019
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
#worker.tomcat1.connection_pool_size=10
#worker.tomcat1.connection_pool_timeout=600
#worker.tomcat1.socket_connect_timeout=300
# Define Node2
worker.tomcat2.port=8029
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#worker.tomcat2.connection_pool_size=10
#worker.tomcat2.connection_pool_timeout=600
#worker.tomcat2.socket_connect_timeout=300
# Load-balancing behaviour
worker.dispatcher.type=lb
worker.dispatcher.balance_workers=tomcat1, tomcat2
#sticky_session session亲和的设置
worker.dispatcher.sticky_session=0
worker.dispatcher.sticky_session_force=1
#loadbalancer
worker.status.type=status
uriworkermap.properties 内容:
#指定请求交给tomcat处理,"dispatcher"为在workers.propertise里指定的负载分配控制器
/*.jsp=dispatcher
/jkstatus=status
!/*.gif=dispatcher
!/*.jpg=dispatcher
!/*.png=dispatcher
!/*.css=dispatcher
!/*.js=dispatcher
!/*.htm=dispatcher
!/*.html=dispatcher
Tomcat设置:
准备两个tomcat,将它们的router分别设成tomcat1和tomcat2,配置它们的connector为ajp,端口分别为8019和8029。
配置完成后,启动apache和tomcat,访问 http://localhost:8080/jkstatus 可以查看集群状态(前提是配置了status类型的worker)
有可以看看其他人写的,很详细:http://aokunsang.iteye.com/blog/1699914
注意:如果希望apache与tomcat通信使用 HTTP 协议则需要使用 HTTP_Proxy:
http_proxy
这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。
http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。
我用的linux源码编译的apache,mod_proxy.so和mod_proxy_http.so已经自带了,其他版本的apache应该也有,如果没有就单独安装 库 文件
############## http_proxy 方式需要的mod_proxy.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
############## http_proxy 方式需要的mod_proxy_http.so ##############
LoadModule proxy_http_module modules/mod_proxy_http.so
上面的内容在 apache配置文件 httpd.conf 中,放开其中的注释就可以使用 库了,
还需要在httpd.conf文件的最后加上:
############## http_proxy 方式 ##############
#http_proxy方式需要加载 mod_proxy.so 和 mod_proxy_http.so,将上面的 两行对应的 LoadModule 放开注释
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://127.0.0.1:8080/
在这个配置中,我们把所有 http://127.0.0.1 的请求代理到 http://127.0.0.1:8080/ ,这也就是 Tomcat 的访问地址,除了 images、css、js 几个目录除外。我们同样可以利用 mod_proxy 来做负载均衡,再看看下面这个配置
ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / balancer://example/
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
启动apache和tomcat就可以测试了。