[转][笔记] 5.Tomcat系列之Apache使用mod_p
转自陈明乾的博客,可能有一定更新。
转原文声明:
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://freeloda.blog.51cto.com/2033581/1301382
大纲
- 一、环境准备,安装 Apache
- 二、安装 Tomcat
- 三、Tomcat 虚拟主机的配置
- 四、Apache使用mod_proxy反向代理Tomcat
- 五、Apache使用mod_jk反向代理Tomcat
注,环境说明:操作系统CnetOS6.8 x86_64,软件下载地址:
-
apr, arp-utils
http://apr.apache.org/download.cgi -
jdk 8u101:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html -
apache-tomcat 7.0.70:
http://tomcat.apache.org/download-70.cgi
一、环境准备
1.实验拓扑
Tomcat: 192.168.0.181
Apache: 192.168.0.171
2.同步各节点时间
[root@apache ~]# ntpdate 202.120.2.101
[root@tomcat1 ~]# ntpdate 202.120.2.101
3.安装apr
注,APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。可以从http://apr.apache.org/获取apr源码,目前最新的版本是1.5.2。
[root@lamp1 ~]# tar -xf apr-1.5.2.tar.gz
[root@lamp1 ~]# cd apr-1.5.2
[root@lamp1 apr-1.5.2]# ./configure --prefix=/usr/local/apr --disable-ipv6
[root@lamp1 apr-1.5.2]# make && make install
4.安装apr-util
注,apr-util是apr的工具库,其可以让程序员更好的使用apr的功能。可以从http://apr.apache.org/获取apr源码,目前最新的版本是1.5.4。
[root@lamp1 ~]# tar -xf apr-util-1.5.4.tar.gz
[root@lamp1 ~]# cd apr-util-1.5.4
[root@lamp1 apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@lamp1 apr-util-1.5.4]# make && make install
5.安装httpd
注,httpd目前最新的2.4系列版本中引入了event MPM,其在性能上较之其它MPM有了较大的提升。
可以先把系统上自带的 http 卸载了:
[root@lamp1 httpd-2.4.23]# rpm -qa | grep httpd
httpd-2.2.15-53.el6.centos.x86_64
httpd-tools-2.2.15-53.el6.centos.x86_64
[root@lamp1 httpd-2.4.23]# rpm -e httpd-2.2.15
[root@lamp1 httpd-2.4.23]# rpm -e httpd-tools-2.2.15
先解决依赖关系,
[root@lamp1 ~]# yum install -y pcre-devel openssl-devel
下面来编译安装httpd,
[root@lamp1 ~]# tar -xf httpd-2.4.23.tar.bz2
[root@lamp1 ~]# cd httpd-2.4.23
[root@lamp1 httpd-2.4.23]# ./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib --with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-mpms-shared=all \
--with-mpm=event \
--enable-proxy \
--enable-proxy-http \
--enable-proxy-ajp \
--enable-proxy-balancer \
--enable-lbmethod-heartbeat \
--enable-heartbeat \
--enable-slotmem-shm \
--enable-slotmem-plain \
--enable-watchdog
[root@lamp1 httpd-2.4.23]# make && make install
为apache提供init脚本,实现服务的控制。建立/etc/rc.d/init.d/httpd文件,并添加如下内容:
[root@apache httpd-2.4.6]# vim /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL
这是个脚本文件,因此需要执行权限;同时,为了让httpd服务能够开机自动启动,还需要将其添加至服务列表,并设置其在3或5级别下自动运行。
[root@lamp1 bin]# vi /etc/init.d/httpd
[root@lamp1 bin]# chmod +x /etc/init.d/httpd
[root@lamp1 bin]# chkconfig --add httpd
[root@lamp1 bin]# chkconfig --level 35 httpd on
下面我们简单修改一下配置文件,(如下图所示在配置文件中增加一行PidFile并启动两模块)
[root@lamp1 ~]# vi /etc/httpd/httpd.conf
ServerRoot "/usr/local/apache"
PidFile "/var/run/httpd.pid"
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
接下来检查一下配置文件并启动,
[root@lamp1 httpd]# service httpd configtest
Syntax OK
[root@lamp1 httpd]# service httpd start
用浏览器访问 192.168.0.171,显示:It Works!
好了,到这里我们httpd就全部安装完成了,下面我们在 192.168.0.181 上安装一下tomcat。
二、安装 Tomcat
1.查看一下安装文件
[root@tomcat1 ~]# ls -1
apache-tomcat-7.0.70.tar.gz
jdk-8u101-linux-x64.rpm
2.同步一下时间
[root@tomcat java]# ntpdate 202.120.2.101
3.安装JDK
[root@tomcat1 ~]# rpm -ivh jdk-8u101-linux-x64.rpm
4.修改环境变量
注意,CentOS 6.8 预先安装了 OpenJDK:
[root@tomcat1 ~]# /usr/bin/java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
要使用我们安装 jdk,应该设置 PATH 环境变量,在搜索命令时,首先查找 $JAVA_HOME/bin 下的路径,设置环境变量如下:
[root@tomcat1 ~]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_101/
export PATH=$JAVA_HOME/bin:$PATH
使其立即生效:
[root@tomcat1 ~]# source /etc/profile.d/java.sh
5.测试一下
[root@tomcat1 ~]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
注:好了,到这里我们的jdk就安装成功了。下面我们来安装一下Tomcat!
6.解压并创建链接
[root@tomcat1 ~]# tar -xf apache-tomcat-7.0.70.tar.gz -C /usr/local/
[root@tomcat1 ~]# cd /usr/local/
[root@tomcat1 local]# ln -sv apache-tomcat-7.0.70/ tomcat
`tomcat' -> `apache-tomcat-7.0.70/'
7.修改环境变量
[root@tomcat1 local]# cat /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
使其立即生效:
[root@tomcat1 local]# source /etc/profile.d/tomcat.sh
8.测试一下,启动 tomcat
[root@tomcat1 local]# catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_101/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
9.查看启动的端口
[root@tomcat1 local]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1094/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1173/master
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1383/java
tcp 0 0 :::8009 :::* LISTEN 1383/java
tcp 0 0 :::8080 :::* LISTEN 1383/java
tcp 0 0 :::22 :::* LISTEN 1094/sshd
tcp 0 0 ::1:25 :::* LISTEN 1173/master
这里有三个 java 进程:8005 是 tomcat 实例的端口,8080 是 HTTP 连接器端口,8009 是 AJP 连接器的端口:
ff测试访问一下:
Snip20160801_15.png- 为Tomcat提供SysV脚本
[root@tomcat ~]# vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
CATALINA_HOME=/usr/local/tomcat #注意你的脚本路径
export CATALINA_HOME
# export CATALINA_OPTS="-Xms128m -Xmx256m"
exec $CATALINA_HOME/bin/catalina.sh $*
下面我们来增加执行权限,并加入服务列表设置开机自启动,
[root@tomcat ~]# chmod +x /etc/init.d/tomcat
[root@tomcat ~]# chkconfig --add tomcat
[root@tomcat ~]# chkconfig tomcat --list
tomcat 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
下面我们来启动一下 Tomcat 并测试一下,
[root@tomcat1 local]# catalina.sh stop
[root@tomcat1 ~]# /etc/init.d/tomcat start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_101/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
查看一下启动的端口号,
[root@tomcat1 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1094/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1173/master
tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 5821/java
tcp 0 0 :::8009 :::* LISTEN 5821/java
tcp 0 0 :::8080 :::* LISTEN 5821/java
tcp 0 0 :::22 :::* LISTEN 1094/sshd
tcp 0 0 ::1:25 :::* LISTEN 1173/master
测试访问一下:
Snip20160801_15.png好了,到这里Tomcat的SysV脚本增加完成
三、Tomcat 虚拟主机的配置
注,为了方便我们下面进行实验,我们得先配置一个虚拟主机。
首先我们来修改一下配置文件,修改的地方有四处,如下图
[root@tomcat1 ~]# cd /usr/local/tomcat/conf/
[root@tomcat1 conf]# cp server.xml server.xml.bak
[root@tomcat1 conf]# vim server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="www.test.com" jvmRoute="TomcatA">
<Host name="www.test.com" appBase="/web"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="webapp" reloadable="true"/>
下面来检查一下配置文件,
[root@tomcat1 conf]# service tomcat configtest
...
INFO: Initializing ProtocolHandler ["http-nio-80"]
Aug 12, 2016 9:24:48 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Aug 12, 2016 9:24:48 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Aug 12, 2016 9:24:48 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Aug 12, 2016 9:24:48 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1322 ms
创建虚拟主机文档目录并创建测试文件,
[root@tomcat1 conf]# mkdir -pv /web/webapp
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/webapp"
[root@tomcat1 conf]# cd /web/webapp
[root@tomcat1 webapp]# vim index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA </h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
下面我们来启动并测试一下,
[root@tomcat1 webapp]# service tomcat start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 webapp]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 100 127.0.0.1:25 *:*
Snip20160812_70.png
好了,到这里我们准备工作就全部完成了,下面我们来说一说apache怎么反向代理tomcat服务器。
四、Apache使用mod_proxy反向代理Tomcat
1.查看模块
要使用mod_proxy与Tomcat实例连接,需要apache已经装载mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(实现Tomcat集群时用到)等模块:
编辑配置文件 /etc/httpd/httpd.conf,开启如下模块:
LoadModule watchdog_module modules/mod_watchdog.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
重启 httpd:
[root@lamp1 logs]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
查看模块:
[root@apache ~]# /usr/local/apache/bin/httpd -D DUMP_MODULES | grep proxy
proxy_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_express_module (shared)
[root@lamp1 logs]# /usr/local/apache/bin/httpd -D DUMP_MODULES | grep watch
watchdog_module (shared)
2.修改配置文件
[root@apache ~]# vim /etc/httpd/httpd.conf
注,修改的地方有两大处如下图,第一处注释默认文档目录,第二处增加一个配置文件httpd-proxy.conf
#DocumentRoot "/usr/local/apache/htdocs"
Include /etc/httpd/extra/httpd-proxy.conf
注,增加httpd-proxy.conf配置文件
[root@lamp1 httpd]# cd extra/
[root@lamp1 extra]# vi httpd-proxy.conf
<VirtualHost *:80>
ProxyVia On
ProxyRequests Off
ProxyPass / http://192.168.0.181/
ProxyPassReverse / http://192.168.0.181/
<Proxy *>
Require all granted
</Proxy>
<Location / >
Require all granted
</Location>
</VirtualHost>
注,查检配置文件并重新启动httpd
[root@lamp1 extra]# /usr/local/apache/bin/httpd -t
Syntax OK
[root@lamp1 extra]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
访问测试
[root@lamp1 extra]# elinks http://192.168.0.171/
Snip20160812_70.png
好了,大家可以看到我们已经成功的配置好了基于mod_proxy实现反向代理tomcat,下面我们来说细的说一下配置文件。
3.配置文件指令详解
[root@lamp1 extra]# vi /etc/httpd/extra/httpd-proxy.conf
<VirtualHost *:80>
ProxyVia On
ProxyRequests Off
ProxyPass / http://192.168.0.181/
ProxyPassReverse / http://192.168.0.181/
<Proxy *>
Require all granted
</Proxy>
<Location / >
Require all granted
</Location>
</VirtualHost>
关于如上apache指令的说明:
ProxyPreserveHost
{On|Off}:如果启用此功能,代理会将用户请求报文中的Host:行发送给后端的服务器,而不再使用ProxyPass指定的服务器地址。如果想在反向代理中支持虚拟主机,则需要开启此项,否则就无需打开此功能。
ProxyVia
{On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多级代理中控制代理请求的流向。默认为Off,即不启用此功能;On表示每个请求和响应报文均添加Via:;Full表示每个Via:行都会添加当前apache服务器的版本号信息;Block表示每个代理请求报文中的Via:都会被移除。如下图,
Snip20160812_72.pngProxyRequests
{On|Off}:是否开启apache正向代理的功能;启用此项时为了代理http协议必须启用mod_proxy_http模块。同时,如果为apache设置了ProxyPass,则必须将ProxyRequests设置为Off。
ProxyPass [path] !|url [key=value key=value...]]
将后端服务器某URL与当前服务器的某虚拟路径关联起来作为提供服务的路径,path为当前服务器上的某虚拟路径,url为后端服务器上某URL路径。使用此指令时必须将ProxyRequests的值设置为Off。需要注意的是,如果path以“/”结尾,则对应的url也必须以“/”结尾,反之亦然。另外,mod_proxy模块在httpd 2.1的版本之后支持与后端服务器的连接池功能,连接按需创建,可以保存至连接池中以备进一步使用。连接池大小或其它设定可以通过在ProxyPass中使用key=value的方式定义。常用的key如下所示:
- min:连接池的最小容量,此值与实际连接个数无关,仅表示连接池最小要初始化的空间大小。
- max:连接池的最大容量,每个MPM都有自己独立的容量;值与MPM本身有关,如Prefork总是为1,而其它的则取决于ThreadsPerChild指令的值。
- loadfactor:用于负载均衡集群配置中,定义对应后端服务器的权重,取值范围为1-100。
- retry:当apache将请求发送至后端服务器得到错误响应时等待多长时间以后再重试。单位是秒钟。如果Proxy指定是以balancer://开头,即用于负载均衡集群时,其还可以接受一些特殊的参数,如下所示:(这些内容我们会在下一篇tomcat负载均衡集群中详细讲解)
- lbmethod:apache实现负载均衡的调度方法,默认是byrequests,即基于权重将统计请求个数进行调度,bytraffic则执行基于权重的流量计数调度,bybusyness通过考量每个后端服务器的当前负载进行调度。
- maxattempts:放弃请求之前实现故障转移的次数,默认为1,其最大值不应该大于总的节点数。
- nofailover:取值为On或Off,设置为On时表示后端服务器故障时,用户的session将损坏;因此,在后端服务器不支持session复制时可将其设置为On。
- stickysession:调度器的sticky session的名字,根据web程序语言的不同,其值为JSESSIONID或PHPSESSIONID。
上述指令除了能在banlancer://或ProxyPass中设定之外,也可使用ProxySet指令直接进行设置,如:
<Proxy balancer://hotcluster>
BalancerMember http://www1.test.com:8080 loadfactor=1
BalancerMember http://www2.test.com:8080 loadfactor=2
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPassReverse
用于让apache调整HTTP重定向响应报文中的Location、Content-Location及URI标签所对应的URL,在反向代理环境中必须使用此指令避免重定向报文绕过proxy服务器。
好了,这里apache使用mod_proxy反向代理tomcat的讲解就全部完成了,下面我们继续说下面的内容。
五、Apache使用mod_jk反向代理Tomcat
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
下载地址:
https://tomcat.apache.org/connectors-doc/
1.安装tomcat-connectors
[root@apache src]# tar xf tomcat-connectors-1.2.37-src.tar.gz
[root@apache src]# cd tomcat-connectors-1.2.37-src/native/
[root@apache native]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@apache native]# make && make install
下面我们来查看一下安装的模块,
[root@apache native]# cd /usr/local/apache/modules/
[root@apache modules]# ls | grep mod_jk.so
mod_jk.so
好了,大家可以看到我们的模块已安装完成。下面我们继续,apache要使用mod_jk连接器,需要在启动时加载此连接器模块。为了便于管理与mod_jk模块相关的配置,这里使用一个专门的配置文件/etc/httpd/extra/httpd-jk.conf来保存相关指令及其设置。其内容如下:
# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/extra/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* TomcatA
JkMount /status/ stat1
除了需要使用LoadModule指令在apache中装载模块外,mod_jk还需要在apache的主配置文件中设置其它一些指令来配置其工作属性。如JkWorkersFile则用于指定保存了worker相关工作属性定义的配置文件,JkLogFile则用于指定mod_jk模块的日志文件,JkLogLevel则可用于指定日志的级别(info, error, debug),此外还可以使用JkRequestLogFormat自定义日志信息格式。而JkMount(格式: JkMount <URL to match> <Tomcat worker name>)指定则用于控制URL与Tomcat workers的对应关系。
2.增加httpd-jk.conf配置文件
为了让apache能使用/etc/httpd/extra/httpd-jk.conf配置文件中的配置信息,需要编辑/etc/httpd/httpd.conf,添加如下一行:
#Include /etc/httpd/extra/httpd-proxy.conf
Include /etc/httpd/extra/httpd-jk.conf
[root@apache ~]# vim /etc/httpd/extra/httpd-jk.conf
# Load the mod_jk
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/extra/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount /* TomcatA
JkMount /status/ stat1
对于apache代理来说,每一个后端的Tomcat实例中的engine都可以视作一个worker,而每一个worker的地址、连接器的端口等信息都需要在apache端指定以便apache可以识别并使用这些worker。约定俗成,配置这些信息的文件通常为workers.properties,其具体路径则是使用前面介绍过的JkWorkersFile指定的,在apache启动时,mod_jk会扫描此文件获取每一个worker的配置信息。比如,我们这里使用/etc/httpd/extra/workers.properties。
3.增加workers.properties配置文件
[root@apache ~]# vim /etc/httpd/extra/workers.properties
worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=192.168.0.181
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status
4.检查配置文件并重启服务器
[root@apache ~]# /usr/local/apache/bin/httpd -t
Syntax OK
[root@apache ~]# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]
5.测试
好了,到这里我们的配置就全部完成了,下面我们来说一说workers.properties配置文件。
6.workers.properties配置文件详解
workers.properties文件一般由两类指令组成:一是mod_jk可以连接的各worker名称列表,二是每一个worker的属性配置信息。它们分别遵循如下使用语法。
worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>
其中worker.list指令可以重复指定多次,而worker name则是Tomcat中engine组件jvmRoute参数的值。如:worker.TomcatA.host=172.16.100.1
根据其工作机制的不同,worker有多种不同的类型,这是需要为每个worker定义的一项属性worker.<work name>.type。常见的类型如下:
- ajp13:此类型表示当前worker为一个运行着的Tomcat实例。
- lb:lb即load balancing,专用于负载均衡场景中的woker;此worker并不真正负责处理用户请求,而是将用户请求调度给其它类型为ajp13的worker。
- status:用户显示分布式环境中各实际worker工作状态的特殊worker,它不处理任何请求,也不关联到任何实际工作的worker实例。具体示例如请参见后文中的配置。
- worker其它常见的属性说明:
- host:Tomcat 7的worker实例所在的主机;
- port:Tomcat 7实例上AJP1.3连接器的端口;
- connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2;
- connection_pool_timeout:连接池中连接的超时时长;
- mount:由当前worker提供的context路径,如果有多个则使用空格格开;此属性可以由JkMount指令替代;
- retries:错误发生时的重试次数;
- socket_timeout:mod_jk等待worker响应的时长,默认为0,即无限等待;
- socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;
- lbfactor:worker的权重,可以在负载均衡的应用场景中为worker定义此属性;
- 另外,在负载均衡模式中,专用的属性还有:(这些内容我们会在下一篇tomcat负载均衡集群中详细讲解)
- balance_workers:用于负载均衡模式中的各worker的名称列表,需要注意的是,出现在此处的worker名称一定不能在任何worker.list属性列表中定义过,并且worker.list属性中定义的worker名字必须包含负载均衡worker。具体示例请参见后文中的定义。
- method:可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。
- sticky_session:在将某请求调度至某worker后,源于此址的所有后续请求都将直接调度至此worker,实现将用户session与某worker绑定。默认为值为1,即启用此功能。如果后端的各worker之间支持session复制,则可以将此属性值设为0。
根据前文中的指定,这里使用/etc/httpd/extra/workers.properties来定义一个名为TomcatA的worker,并为其指定几个属性。文件内容如下:
worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=172.16.100.1
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status
至此,一个基于mod_jk模块与后端名为TomcatA的worker通信的配置已经完成,重启httpd服务即可生效。好了,这到里所有配置全部讲解完成。希望大家有所收获_……