2008-10-03

Solaris环境下Tomcat的安装配置以及与Apache的整合

  在最开始,安装之前现了解一下背景知识是相当有用的。

  Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

  但是鉴于以下原因,我们需要整合Apache和Tomcat:

  1. 提升对静态文件的处理性能
  2. 利用 Web 服务器来做负载均衡以及容错
  3. 无缝的升级应用程序

  由于Tomcat本身就是Apache软件基金会的一个项目,自然它肯定能够很好的和Apache结合。因此很多服务器都采用这种方式。

  一般来说,要进行这种集成,我们一般希望让静态的页面有apache处理,动态的jsp就由tomcat处理。


目前有三种方法可以将 apache 和 tomcat 整合在一起。

JK:

This is the top-level entry point of the documentation bundle for the Apache Tomcat Connectors

Select one of the links from the navigation menu (to the left) to drill down to the more detailed documentation that is available. Each available manual is described in more detail below.

  上面就是JK的官方介绍,它本来就是tomcat项目的一部分。

http_proxy :

  直接利用Apache自带的 mod_proxy 模块使用代理技术来连接 Tomcat。http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。

ajp_proxy:

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。
简单来说这三种方法就是:
 通过ajp13协议,apache将动态内容的请求转发给tomcat
 在apache进程中运行tomcat来处理动态内容  
 使用本地高速Unix domain socket,apache将动态内容的请求转发给tomcat


  实际上虽然后两者在性能上不会逊色多少,而且更简便灵活,但是在稳定性上恐怕还是JK更胜一筹,所以我还是使用JK来配置吧。


  找了很多资料,最终对我有帮助的就只有两个信息。一个是前面这个,另外一个就是这种连接的原理:假设apache使用端口是80,tomcat使用端口是8080。服务器ip是10.1.1.12这个时候,当我们通过http://10.1.1.12访问网站的时候内容是由apache处理的,当我们通过http://10.1.1.12:8080访问网站的时候,内容就是有tomcat处理的。但是,当整合成功以后,我们通过http://10.1.1.12访问网站中的jsp页面,比如http://10.1.1.12/test.jsp时,apache会把请求转给tomcat来处理。
  这个就是我们整合的终极目标了,也是通过这个来判断是否整合成功。而通过apache转给tomcat的请求在tomcat的status的jkstutus中能看到:

jk-8009

Max threads: 200 Current thread count: 4 Current thread busy: 3
Max processing time: 369 ms Processing time: 0.374 s Request count: 3 Error count: 1 Bytes received: 0.00 MB Bytes sent: 0.00 MB

StageTimeB SentB RecvClientVHostRequest
K44520 ms??10.1.1.111??
K2680 ms??10.1.1.111??

P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive



那么,接下来我们开始动手。。。

我的apache已经装好了,那么先装好tomcat:

开始安装之前先添加JAVA_HOME路径到环境变量:
JAVA_HOME=/usr/java
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
JRE_HOME=/usr/java/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_HOME/bin:/usr/sfw/bin:/usr/ccs
export PATH JAVA_HOME CLASSPATH CATALINA_BASE CATALINA_HOME JRE_HOME


之后解压官方下载的包,然后拷贝到安装的目录下,执行
./bin/startup.sh
之后打开http://localhost:8080
出现成功信息就表示安装成功了。
安装JK:
  根据说明文件直接编译吧

配置:
  要配置好Apache和Tomcat的整合,必须要配置这三个文件:

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

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

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



cp ./conf/workers.properties /usr/local/apache/conf/
cp ./conf/uriworkermap.properties /usr/local/apache/conf/
之后按照这个文件里面的提示修改文件吧。
然后编辑apache的httpd.conf,以下是官方文档里的内容
# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module modules/mod_jk.so
# 加载jkmodule的参数
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/httpd/conf/workers.properties
# 指定workers.properties的所在路径
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/httpd/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples/* worker1、
# 将/examples虚拟路径下的所有内容转有worker1处理,其实这个worker1就是jk的配置文件中配置用于连接apache和tomcat的东西。
除了这些外,我们应该自己添加的东西:
JkMount /*.do worker1
JkMount /*.jsp worker1
#类似上面,指定目录下所有扩展名为.do .jsp的文件由worker1来处理

之后修改/usr/local/apache/conf/worker.properties
基本上按照说明修改一些路径就可以了。上面在httpd.conf中指定的worker1应该出现在worker.list中,并且拥有worker.worker1.type=ajp13.
此外这个文件还可以用来配置负载均衡,不过我暂时不需要了。所以就没有配置了。而且默认的文档里其实已经有配置一个loadbalancer,如果需要我们只需要把worker.list后面的对象改成loadbalancer前面的worker1自然也改成这个就可以了。worker.list指定的对象是告诉jk哪些worker是可用的。


这样配置之后,基本就没有问题了。开启tomcat和apache看看。

最后记得在启动脚本里增加tomcat的自动启动。

参考文章:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html



---------------------------------------------------------------
此外,如果需要将tomcat的管理统一到Solaris的smf之中,可以这样做:

vi /var/svc/manifest/network/tomcat.xml
文件内容:

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='Tomcat'>
<service name='application/server/tomcat' type='service' version='1'>
<single_instance />
<dependency
name='filesystem'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<exec_method
type='method'
name='start'
exec='/opt/Webservices/tomcat/bin/startup.sh'
timeout_seconds='300' />
<exec_method
type='method'
name='stop'
exec='/opt/Webservices/tomcat/bin/shutdown.sh'
timeout_seconds='300' />
<instance name='default' enabled='true' />
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>Tomcat6.018</loctext>
</common_name>
</template>
</service>
</service_bundle>

之后
svccfg validate 和 svccfg improt这个文件即可。

没有评论: