Apache 和 Tomcat 整合

1. Apache 和 Tomcat 的联系

Apache 主要用于支持静态网页, 而 Tomcat 主要用于支持动态网页。 比如运行 WortPress 使用 apahce, 运行 WebApollo 这样的 java 网页则使用 Tomcat。Apache 是 web 服务器, Tomcat 是应用(java)服务器。 Tomcat 可以认为是 apache 的扩展,但是可以独立于 apache 运行。
由于学校只开放了 80 端口,而 Tomcat 运行在 8080 端口。为了能让 WebApollo 在 80 端口被访问,因此需要将 java 请求通过 apache 转发给 tomcat 处理。

2. 安装 Apache 和 Tomcat

整合 Apache 和 Tomcat 需要安装 jakarta-tomcat-connectors

使用 yum 安装 Apache
$ sudo yum install httpd httpd-devel

安装  jakarta-tomcat-connectors
$ wget http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
$ tar zxf tomcat-connectors-1.2.40-src.tar.gz 
$ cd tomcat-connectors-1.2.40-src/native/
$ ./configure --with-apxs=/usr/sbin/apxs
$ make

安装 Tomcat,直接下载二进制包解压缩即可使用

3. 配置 JK 以整合 Apache 和 Tomcat

首先,在 /etc/http/conf.d/ 目录下建立文件 mod_jk.conf,内容如下:

# 载入 jk 模块
LoadModule jk_module modules/mod_jk.so
# 指出mod_jk模块工作所需要的工作文件workers.properties的位置
JkWorkersFile /etc/httpd/conf/workers.properties
JkMountFile   /etc/httpd/conf/uriworkermap.properties
JkLogFile  /etc/httpd/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
# 将所有servlet 和jsp请求通过ajp13的协议送给Tomcat,让Tomcat来处理
JkMount /servlet/* worker1
JkMount /*.jsp worker1

将以下内容写入 /etc/http/conf/workers.properties :

# Defining a worker named worker1 and of type ajp13
# 创建名为 worker1 的 worker
worker.list=worker1

# Set properties for worker1
# work1 使用ajp13协议与tomcat 进程通讯
worker.worker1.type=ajp13
# 监听ajp13请求的的tomcat worker主机地址
worker.worker1.host=localhost
# 默认情况下tomcat在ajp13协议中使用的端口为8009
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

将以下内容写入 /etc/httpd/conf/uriworkermap.properties :

/*=worker1
!/*.jpg=worker1
!/*.gif=worker1
!/*.png=worker1
!/*.bmp=worker1
!/*.html=worker1
!/*.htm=worker1
!/*.swf=worker1
!/*.css= worker1
!/*.js= worker1

上述内容表示: ‘/’表示网页中的相对路径; /*=worker1 表示将‘/’目录下所有的请求都交给 worker1 (workers.properties 文件中指定的)来处理;模块会首先在‘/’目录过滤掉所有图片、flash、js文件、css文件和静态网页,将剩下的文件类型自己全部处理。

4. 配置 Apache 和 Tomcat 展示指定的目录

对 Tomcat 中的 webApp 目录进行展示。
首选修改 Apache 的 /etc/httpd/conf.d/httpd.conf 文件

Alias /tomcat "/opt/biosoft/WebApollo-2014-04-03/apache-tomcat-7.0.57/webapps"
<Directory "/opt/biosoft/WebApollo-2014-04-03/apache-tomcat-7.0.57/webapps">
    Options Includes FollowSymLinks 
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>

再修改 /opt/biosoft/WebApollo-2014-04-03/apache-tomcat-7.0.57/conf/server.xml 文件

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      errorReportValveClass="org.bbop.apollo.web.ErrorReportValve">
      <Context path="/tomcat" docBase="/opt/biosoft/WebApollo-2014-04-03/apache-tomcat-7.0.57/webapps/" debug="0" reloadable="true" crossContext="true"/>
      ...
</Host>

以上修改都表示将目录 /opt/biosoft/WebApollo-2014-04-03/apache-tomcat-7.0.57/webapps/ 展示到网页中的 /tomcat 目录下。

5. 使用代理进行整合

此外,还有两种非常简易的方法进行整合。
默认情况下,Tomcat 对外开启了 8080 端口,以 HTTP/1.1 协议运行; 同时,也开启了 8009 端口,以 AJP/1.3 协议运行。这两种协议可以同时生效,也可以按需要仅保留一个即可。
因此,只需要使用 Apache 的 mod_proxy.so, mod_proxy_http.so, mod_proxy_ajp.so 等模块,即可使用代理的方法来整合 Apache 和 Tomcat。这些模块默认情况下都存在并是开启着的。
因此,配置如下设置即可:

ProxyPass /tomcat http://www.chenlianfu.com:8080
或
ProxyPass /tomcat ajp://www.chenlianfu.com:8009