Apache与Tomcat负载均衡


Apache HTTP Server 与 Tomcat 的三种连接方式JK,http_proxy,ajp_proxy。下面逐个介绍一下(本篇介绍的示例都是基于前面介绍的已经搭建好的Tomcat集群,都是本机,端口分别为18080和28080):

JK:

JK是最常见的方式,JK 本身有两个版本分别是 1 和 2,目前 1 最新的版本是 1.2.37,而版本 2 早已经废弃了,以后不再有新版本的推出了,所以建议你采用版本 1。
JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009(本机修改配置为18009和28009)。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置。

AJP 协议

AJP是为Tomcat与HTTP服务器之间通信而定制的协议,能提供较高的通信速度和效率。

ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。显然,浏览器并不能直接支持AJP13协议,只支持HTTP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。

实际上支持AJP代理的服务器非常少,比如目前很火爆的Nginx就没这个模块。因此tomcat的配置大部分都是关闭AJP协议端口的,因为除了Apache之外别的http server几乎都不能反代AJP13协议,自然就没太大用处了。

配置JK
1.下载mod_jk,Tomcat官网下载即可, http://tomcat.apache.org/download-connectors.cgi,下载对应版本

2.修改httpd.conf

 1 # (httpd.conf)
 2 # 加载 mod_jk 模块
 3 LoadModule jk_module modules/mod_jk.so
 4 
 5 #
 6 # Configure mod_jk
 7 #
 8 JkWorkersFile conf/workers.properties
 9 JkMountFile conf/uriworkermap.properties
10 JkLogFile logs/mod_jk.log
11 JkLogLevel warn

3.在conf目录下添加配置文件workers.properties,与上面JkWorkersFile的配置保持一致

#
# workers.properties
#

# list the workers by name
# DLOG4J的名字是随便起的

worker.list=DLOG4J, status

# localhost server 1
# ------------------------
worker.s1.port=18009
worker.s1.host=localhost
worker.s1.type=ajp13

# localhost server 2
# ------------------------
worker.s2.port=28009
worker.s2.host=localhost
worker.s2.type=ajp13

worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balance_workers=s1, s2
worker.DLOG4J.sticky_session=1

worker.status.type=status

4.在conf目录下添加配置文件uriworkermap.properties,与上面JkMountFile的配置保持一致

/*=DLOG4J
/jkstatus=status

!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

上面映射的意思是,所有的请求都由 DLOG4J 这个 worker 进行处理,但是有几个例外,/jkstatus 请求由 status 这个 worker 处理。另外配置中每一行数据前面的感叹号表示接下来的 URI 不要由 JK 进行处理,也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。


5.启动apache,两个tomcat


6.测试
先访问http://192.168.1.101:8080/jkstatus,可以看看jkstatus的状态
再访问http://192.168.1.101:8080/ClusterValidate/index.jsp

http_proxy

这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写,大大的增强了其功能和稳定性。

http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。


配置http_proxy

1.恢复加载http_proxy相关模块
在httpd.conf文件中,去掉如下几行的注释
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_http_module modules/mod_status.so

2.在httpd.conf中加上proxy代理的ProxyPass

添加如下配置:

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !
ProxyPass /balancer-manager  !

ProxyPass / balancer://mycluster/
<Proxy balancer://mycluster/>
BalancerMember http://localhost:18080/
BalancerMember http://localhost:28080/
</Proxy>

<Location /balancer-manager> 
SetHandler balancer-manager   
        Order Deny,Allow   
        #Deny from all   
        Allow from localhost ip6-localhost
</Location>

3.启动apache,tomcat


4.测试
http://192.168.1.101:8080/balancer-manager查看均衡状态
http://192.168.1.101:8080/ClusterValidate/index.jsp测试负载均衡

ajp_proxy

与http_proxy基本一致,只是在ProxyPass的地址中,把http的地址转化为ajp的地址,及Tomcat坚挺的ajp端口号。如下:

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !
ProxyPass /balancer-manager  !

ProxyPass / balancer://mycluster/
<Proxy balancer://mycluster/>
BalancerMember ajp://localhost:18009/
BalancerMember ajp://localhost:28009/
</Proxy>

<Location /balancer-manager> 
SetHandler balancer-manager   
        Order Deny,Allow   
        #Deny from all   
        Allow from localhost ip6-localhost
</Location>

以上三种负载方案都行,但是官方建议还是jk模式好,效率高,稳定。

优质内容筛选与推荐>>
1、明代地图总目
2、企业防黑必备的五大策略
3、LeetCode 1291. Sequential Digits
4、Count and Say
5、git常见命令


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn