下面配置下mod_jk模块进行配置实现反向代理功能
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。,在apache服务器上安装
编译、安装tomcat-connectors
1
2
3
4
|
[root@node1 ~]# tar xf tomcat-connectors- 1.2 . 37 -src.tar.gz [root@node1 ~]# cd tomcat-connectors- 1.2 . 37 -src/ native / [root@node1 native ]# ./configure -- with -apxs=/usr/local/apache/bin/apxs #编译apache的模块 [root@node1 native ]# make && make install |
apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
1
2
3
4
5
6
7
8
9
|
# Load the mod_jk LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties jk配置文件 JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* TomcatA 把那个uri路径送到那个tomcat上去,TomcatA是jvm的名称 为了让apache能使用/etc/httpd/extra/httpd-jk.conf配置文件中的配置信息,需要编辑/etc/httpd/httpd.conf,添加如下一行: Include /etc/httpd/extra/httpd-jk.conf |
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。
配置apache实用mod_jk模块
1
2
3
4
5
6
7
|
[root@node1 bin]# vim /etc/httpd/extra/httpd-jk.conf 添加 如下内容 LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* tomcat1 #tomcat1 必须和workers.properties内定义的相同 JkMount /jkstatus/ stat1 |
根据前文中的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
1
2
3
4
5
6
7
|
[root@node1 bin]# vim /etc/httpd/extra/workers.properties worker.list = tomcat1,stat1 worker.tomcat1.type = ajp13 worker.tomcat1.host = 192.168 . 0.1 worker.tomcat1.port = 8009 worker.tomcat1.lbfactor= 1 worker.stat1.type = status |
重启httpd服务,并进行测试
[root@node1 bin]# service httpd restart
测试页面如下
通过上面的配置和测试,现在已经实现了apache基于mod_proxy和mod_jk反向代理tomcat,下面我们通过apache和两个tomcat实现负载均衡
tomcat1上的配置
修改配置文件,增加jvmRoot的定义,这是集群中必须配置的参数
1
2
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #修改下面参数 <Engine name= "Catalina" defaultHost= "tomcat1.chris.com" jvmRoot= "tomcat1" > |
重启服务使其生效
1
|
[root@localhost webapp]# service tomcat stop |
tomcat2上的配置
1
2
3
4
|
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml #修改下面参数 <Engine name= "Catalina" defaultHost= "tomcat2.chris.com" jvmRoot=tomcat2 "" > [root@localhost webapp]# service tomcat start [root@localhost webapp]# service tomcat stop |
两台tomcat服务器上只需要修改上面这两个参数,下面在apache上进行配置
基于mod_jk的负载均衡
1
2
3
4
5
6
7
|
修改/etc/httpd/extra/httpd-jk.conf为如下内容: LoadModule jk_module modules/mod_jk.so JkWorkersFile /etc/httpd/extra/workers.properties JkLogFile logs/mod_jk.log JkLogLevel debug JkMount /* lbcluster1 #lbcluster1集群名称 JkMount /jkstatus/ stat1 |
编辑/etc/httpd/extra/workers.properties,添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
worker.list = lbcluster1,stat1 --lbcluster1集群名称 worker.TomcatA.type = ajp13 worker.TomcatA.host = 172.16 . 100.1 worker.TomcatA.port = 8009 worker.TomcatA.lbfactor = 5 worker.TomcatB.type = ajp13 worker.TomcatB.host = 172.16 . 100.2 worker.TomcatB.port = 8009 worker.TomcatB.lbfactor = 5 worker.lbcluster1.type = lb 负载均衡work,lb内置的类 worker.lbcluster1.sticky_session = 1 会话绑定 worker.lbcluster1.balance_workers = TomcatA, TomcatB 集群中的实列 worker.stat1.type = status |
重启服务,使配置生效
[root@node1 ~]# service httpd restart
测试访问,已经代理到不同的后端 主机上了
基于mod_proxy的负载均衡
先禁用上面基于mod_jk的配置文件
1
2
3
|
[root@node1 ~]# vim /etc/httpd/httpd.conf Include /etc/httpd/extra/httpd-proxy.conf #启用mod_proxy的配置 #Include /etc/httpd/extra/httpd-jk.conf #禁用mod_jk的配置 |
配置proxy负载均衡
在httpd.conf的全局配置中配置如下内容:
1
2
3
4
5
|
ProxyRequests Off <proxy balancer: //lbcluster1> BalancerMember ajp: //192.168.0.1:8009 loadfactor=10 route=tomcat1 BalancerMember ajp: //192.168.0.3:8009 loadfactor=10 route=tomcat2 </proxy> |
在虚拟主机中实现代理
1
2
3
4
5
|
<VirtualHost *: 80 > ServerName www.magedu.com ProxyPass / balancer: //lbcluster1/ stickysession=jsessionid ProxyPassReverse / balancer: //lbcluster1/ </VirtualHost> |
测试结果如下
至此实现了apache基于mod_jk和mod_proxy的负载均衡的反向代理的功能。这两个模块的配置原理大致相同,就是所使用的命令和配置位置有点小出入,需要注意下!
由于配置过程中命令繁多,难免会出现错误,还望各位大牛们指出~~谢谢!