当前位置: 首页 > news >正文

利用JK连接Apache与Tomcat,实现负载均衡

整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能、利用 Web 服务器来做负载均衡以及容错、无缝的升级应用程序。

首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个:

1. 提升对静态文件的处理性能

2. 利用 Web 服务器来做负载均衡以及容错

3. 无缝的升级应用程序

这三点对一个 web 网站来说是非常之重要的,我们希望我们的网站不仅是速度快,而且要稳定,不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了,而能完成这几个功能的、最好的HTTP服务器也就只有 apache 的 http server 了,它跟 tomcat 的结合是最紧密和可靠的。

JK是最常用的Apache与Tomcat的连接方式,最新版本是JK-1.2.37 released,JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置,访问方式可以是http://IP/jkstatus。

1、JK的安装:

下载 tomcat-connectors-1.2.37-src.tar.gz

解压后进入 tomcat-connectors-1.2.37下的native目录,开始编译安装:

[root@centos6  tomcat-connectors-1.2.37]# ./configure  --prefix=/usr/local/tomcat-connector  --with-apxs=/usr/local/apache2/bin/apxs
[root@centos6  tomcat-connectors-1.2.37]# make
[root@centos6  tomcat-connectors-1.2.37]# make install

2、JK的配置

JK 的配置最关键的有三个文件,分别是

workers.properties

到 Tomcat 服务器的连接定义文件

httpd.conf

Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息

uriworkermap.properties

URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。

其中第二、三个配置文件名都可以自定义。下面是一个典型的 httpd.conf 对 JK 的配置:

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

tomcat配置的修改

tomcat默认使用的http协议,服务的配置文件为conf/server.xml,其中关于连接协议的配置为,

  1. <Connector port="8080" protocol="HTTP/1.1"  
  2.        connectionTimeout="20000"  
  3.          redirectPort="8443" />  

要使用JK连接器,需要修改该协议配置为ajp,下面是我的配置:

  1. <Connector port="8009"  maxThreads="200"    
  2. minSpareThreads="100" maxSpareThreads="150"    
  3. enableLookups="false" redirectPort="8443"     
  4. acceptCount="100" debug="0"  isableUploadTimeout="true"     
  5. URIEncoding="GBK"  protocol="AJP/1.3" />  

接下来我们在 Apache 的 conf 目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下:

  1.   
  2. # workers.properties   
  3.   
  4. # list the workers by name   
  5.   
  6. worker.list=DLOG4J, status   
  7.   
  8. # localhost server 1   
  9. # ------------------------   
  10. worker.s1.port=8009   
  11. worker.s1.host=localhost   
  12. worker.s1.type=ajp13   
  13.   
  14. # localhost server 2   
  15. # ------------------------   
  16. worker.s2.port=8010   
  17. worker.s2.host=localhost   
  18. worker.s2.type=ajp13   
  19. worker.s2.stopped=1   
  20.   
  21. worker.DLOG4J.type=lb   
  22. worker.retries=3   
  23. worker.DLOG4J.balanced_workers=s1, s2   
  24. worker.DLOG4J.sticky_session=1   
  25. worker.status.type=status  

说明:

首先我们配置了两个类型为 ajp13 的 worker 分别是 s1 和 s2,它们指向同一台服务器上运行在两个不同端口 8109 和 8209 的 Tomcat 上。接下来我们配置了一个类型为 lb(也就是负载均衡的意思)的 worker,它的名字是 DLOG4J,这是一个逻辑的 worker,它用来管理前面配置的两个物理连接 s1 和 s2。最后还配置了一个类型为 status 的 worker,这是用来监控 JK 本身的模块。有了这三个 worker 还不够,我们还需要告诉 JK,哪些 worker 是可用的,所以就有worker.list = DLOG4J, status这行配置。

接下来便是 URI 的映射配置了,我们需要指定哪些链接是由 Tomcat 处理的,哪些是由 Apache 直接处理的,看看下面这个文件你就能明白其中配置的意义

  1. /*=DLOG4J   
  2. /jkstatus=status   
  3.   
  4. !/*.gif=DLOG4J   
  5. !/*.jpg=DLOG4J   
  6. !/*.png=DLOG4J   
  7. !/*.css=DLOG4J   
  8. !/*.js=DLOG4J   
  9. !/*.htm=DLOG4J   
  10. !/*.html=DLOG4J  

说明:

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

通过对 workers.properties 和 uriworkermap.properties 的配置,可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。如果有需求不妨按照本文的方法一试。

相关文章:

  • Ubuntu配置和修改IP地址
  • 几个有用的Apache下.htaccess设置
  • Linux查看硬件信息的方法
  • Linux下优化Apache保证web服务器安全
  • 从零开始学习Linux 基础(二)—磁盘、分区与文件系统
  • apache中开启Gzip和expires,优化页面访问速度
  • Technicolor TG582n 后门
  • Alcatel-Lucent 无限制后门
  • linux设置只读属性,可以防webshell
  • CSRF | XSRF 跨站请求伪造
  • 全面解析PHP的糟糕设计
  • 微软安全工具
  • chrome 浏览器添加来自其他网站的扩展程序
  • 关于JavaWeb中的CSRF攻打与防御
  • 虚拟主机提权技巧:调用远程路径去执行CMD
  • 《Java编程思想》读书笔记-对象导论
  • AngularJS指令开发(1)——参数详解
  • CentOS从零开始部署Nodejs项目
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Facebook AccountKit 接入的坑点
  • IDEA常用插件整理
  • iOS | NSProxy
  • leetcode388. Longest Absolute File Path
  • Mysql5.6主从复制
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • ReactNativeweexDeviceOne对比
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从setTimeout-setInterval看JS线程
  • 基于Android乐音识别(2)
  • 解决iview多表头动态更改列元素发生的错误
  • 什么是Javascript函数节流?
  • 我这样减少了26.5M Java内存!
  • 用mpvue开发微信小程序
  • 大数据全解:定义、价值及挑战
  • ​一些不规范的GTID使用场景
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.ajax()
  • (1)Nginx简介和安装教程
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)球球大作战
  • (Java)【深基9.例1】选举学生会
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (图)IntelliTrace Tools 跟踪云端程序
  • (五)c52学习之旅-静态数码管
  • .aanva
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 反射的使用
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net组件程序设计之线程、并发管理(一)
  • @media screen 针对不同移动设备
  • @ModelAttribute 注解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具