利用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 的配置:
- # (httpd.conf)
- # 加载 mod_jk 模块
- LoadModule jk_module modules/mod_jk.so
- #
- # Configure mod_jk
- #
- <IfModule jk_module>
- JkWorkersFile conf/workers.properties
- JkMountFile conf/uriworkermap.properties
- JkLogFile logs/mod_jk.log
- JkLogLevel warn
- </IfModule>
tomcat配置的修改
tomcat默认使用的http协议,服务的配置文件为conf/server.xml,其中关于连接协议的配置为,
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
要使用JK连接器,需要修改该协议配置为ajp,下面是我的配置:
- <Connector port="8009" maxThreads="200"
- minSpareThreads="100" maxSpareThreads="150"
- enableLookups="false" redirectPort="8443"
- acceptCount="100" debug="0" isableUploadTimeout="true"
- URIEncoding="GBK" protocol="AJP/1.3" />
接下来我们在 Apache 的 conf 目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下:
- #
- # workers.properties
- #
- # list the workers by name
- worker.list=DLOG4J, status
- # localhost server 1
- # ------------------------
- worker.s1.port=8009
- worker.s1.host=localhost
- worker.s1.type=ajp13
- # localhost server 2
- # ------------------------
- worker.s2.port=8010
- worker.s2.host=localhost
- worker.s2.type=ajp13
- worker.s2.stopped=1
- worker.DLOG4J.type=lb
- worker.retries=3
- worker.DLOG4J.balanced_workers=s1, s2
- worker.DLOG4J.sticky_session=1
- 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 直接处理的,看看下面这个文件你就能明白其中配置的意义
- /*=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 文本文件。
通过对 workers.properties 和 uriworkermap.properties 的配置,可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。如果有需求不妨按照本文的方法一试。
目录 返回
首页