[轉(zhuǎn)][筆記] 5.Tomcat系列之Apache使用mod_proxy和mod_jk反向代理Tomcat

轉(zhuǎn)自陳明乾的博客,可能有一定更新。

轉(zhuǎn)原文聲明:
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章 原始出處 、作者信息和本聲明。否則將追究法律責(zé)任。http://freeloda.blog.51cto.com/2033581/1301382

大綱


  • 一、環(huán)境準(zhǔn)備,安裝 Apache
  • 二、安裝 Tomcat
  • 三、Tomcat 虛擬主機(jī)的配置
  • 四、Apache使用mod_proxy反向代理Tomcat
  • 五、Apache使用mod_jk反向代理Tomcat

注,環(huán)境說明:操作系統(tǒng)CnetOS6.8 x86_64,軟件下載地址:

一、環(huán)境準(zhǔn)備


1.實(shí)驗(yàn)拓?fù)?/p>

Tomcat: 192.168.0.181
Apache: 192.168.0.171

2.同步各節(jié)點(diǎn)時(shí)間

[root@apache ~]# ntpdate 202.120.2.101
[root@tomcat1 ~]# ntpdate 202.120.2.101

3.安裝apr

注,APR(Apache portable Run-time libraries,Apache可移植運(yùn)行庫)的目的如其名稱一樣,主要為上層的應(yīng)用程序提供一個(gè)可以跨越多操作系統(tǒng)平臺(tái)使用的底層支持接口庫??梢詮?a target="_blank" rel="nofollow">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有了較大的提升。

可以先把系統(tǒng)上自帶的 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

先解決依賴關(guān)系,

[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腳本,實(shí)現(xiàn)服務(wù)的控制。建立/etc/rc.d/init.d/httpd文件,并添加如下內(nèi)容:

[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

這是個(gè)腳本文件,因此需要執(zhí)行權(quán)限;同時(shí),為了讓httpd服務(wù)能夠開機(jī)自動(dòng)啟動(dòng),還需要將其添加至服務(wù)列表,并設(shè)置其在3或5級(jí)別下自動(dòng)運(yùn)行。

[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并啟動(dòng)兩模塊)

[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

接下來檢查一下配置文件并啟動(dòng),

[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.同步一下時(shí)間

[root@tomcat java]# ntpdate 202.120.2.101

3.安裝JDK

[root@tomcat1 ~]# rpm -ivh jdk-8u101-linux-x64.rpm

4.修改環(huán)境變量

注意,CentOS 6.8 預(yù)先安裝了 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,應(yīng)該設(shè)置 PATH 環(huán)境變量,在搜索命令時(shí),首先查找 $JAVA_HOME/bin 下的路徑,設(shè)置環(huán)境變量如下:

[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.解壓并創(chuàng)建鏈接

[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.修改環(huán)境變量

[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.測試一下,啟動(dòng) 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.查看啟動(dòng)的端口

[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

這里有三個(gè) java 進(jìn)程:8005 是 tomcat 實(shí)例的端口,8080 是 HTTP 連接器端口,8009 是 AJP 連接器的端口:

ff

測試訪問一下:

Snip20160801_15.png
  1. 為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 $*

下面我們來增加執(zhí)行權(quán)限,并加入服務(wù)列表設(shè)置開機(jī)自啟動(dòng),

[root@tomcat ~]# chmod +x /etc/init.d/tomcat
[root@tomcat ~]# chkconfig --add tomcat
[root@tomcat ~]# chkconfig tomcat --list

tomcat 0:關(guān)閉 1:關(guān)閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關(guān)閉

下面我們來啟動(dòng)一下 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.

查看一下啟動(dòng)的端口號(hào),

[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 虛擬主機(jī)的配置


注,為了方便我們下面進(jìn)行實(shí)驗(yàn),我們得先配置一個(gè)虛擬主機(jī)。
首先我們來修改一下配置文件,修改的地方有四處,如下圖

[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

創(chuàng)建虛擬主機(jī)文檔目錄并創(chuàng)建測試文件,

[root@tomcat1 conf]# mkdir -pv /web/webapp
mkdir: 已創(chuàng)建目錄 "/web"
mkdir: 已創(chuàng)建目錄 "/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>

下面我們來啟動(dòng)并測試一下,

[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

好了,到這里我們準(zhǔn)備工作就全部完成了,下面我們來說一說apache怎么反向代理tomcat服務(wù)器。

四、Apache使用mod_proxy反向代理Tomcat


1.查看模塊

要使用mod_proxy與Tomcat實(shí)例連接,需要apache已經(jīng)裝載mod_proxy、mod_proxy_http、mod_proxy_ajp和proxy_balancer_module(實(shí)現(xiàn)Tomcat集群時(shí)用到)等模塊:

編輯配置文件 /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

注,修改的地方有兩大處如下圖,第一處注釋默認(rèn)文檔目錄,第二處增加一個(gè)配置文件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>

注,查檢配置文件并重新啟動(dòng)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

好了,大家可以看到我們已經(jīng)成功的配置好了基于mod_proxy實(shí)現(xiàn)反向代理tomcat,下面我們來說細(xì)的說一下配置文件。

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>

關(guān)于如上apache指令的說明:

ProxyPreserveHost

{On|Off}:如果啟用此功能,代理會(huì)將用戶請求報(bào)文中的Host:行發(fā)送給后端的服務(wù)器,而不再使用ProxyPass指定的服務(wù)器地址。如果想在反向代理中支持虛擬主機(jī),則需要開啟此項(xiàng),否則就無需打開此功能。

ProxyVia

{On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多級(jí)代理中控制代理請求的流向。默認(rèn)為Off,即不啟用此功能;On表示每個(gè)請求和響應(yīng)報(bào)文均添加Via:;Full表示每個(gè)Via:行都會(huì)添加當(dāng)前apache服務(wù)器的版本號(hào)信息;Block表示每個(gè)代理請求報(bào)文中的Via:都會(huì)被移除。如下圖,

Snip20160812_72.png

ProxyRequests

{On|Off}:是否開啟apache正向代理的功能;啟用此項(xiàng)時(shí)為了代理http協(xié)議必須啟用mod_proxy_http模塊。同時(shí),如果為apache設(shè)置了ProxyPass,則必須將ProxyRequests設(shè)置為Off。

ProxyPass [path] !|url [key=value key=value...]]

將后端服務(wù)器某URL與當(dāng)前服務(wù)器的某虛擬路徑關(guān)聯(lián)起來作為提供服務(wù)的路徑,path為當(dāng)前服務(wù)器上的某虛擬路徑,url為后端服務(wù)器上某URL路徑。使用此指令時(shí)必須將ProxyRequests的值設(shè)置為Off。需要注意的是,如果path以“/”結(jié)尾,則對(duì)應(yīng)的url也必須以“/”結(jié)尾,反之亦然。另外,mod_proxy模塊在httpd 2.1的版本之后支持與后端服務(wù)器的連接池功能,連接按需創(chuàng)建,可以保存至連接池中以備進(jìn)一步使用。連接池大小或其它設(shè)定可以通過在ProxyPass中使用key=value的方式定義。常用的key如下所示:

  • min:連接池的最小容量,此值與實(shí)際連接個(gè)數(shù)無關(guān),僅表示連接池最小要初始化的空間大小。
  • max:連接池的最大容量,每個(gè)MPM都有自己獨(dú)立的容量;值與MPM本身有關(guān),如Prefork總是為1,而其它的則取決于ThreadsPerChild指令的值。
  • loadfactor:用于負(fù)載均衡集群配置中,定義對(duì)應(yīng)后端服務(wù)器的權(quán)重,取值范圍為1-100。
  • retry:當(dāng)apache將請求發(fā)送至后端服務(wù)器得到錯(cuò)誤響應(yīng)時(shí)等待多長時(shí)間以后再重試。單位是秒鐘。如果Proxy指定是以balancer://開頭,即用于負(fù)載均衡集群時(shí),其還可以接受一些特殊的參數(shù),如下所示:(這些內(nèi)容我們會(huì)在下一篇tomcat負(fù)載均衡集群中詳細(xì)講解)
  • lbmethod:apache實(shí)現(xiàn)負(fù)載均衡的調(diào)度方法,默認(rèn)是byrequests,即基于權(quán)重將統(tǒng)計(jì)請求個(gè)數(shù)進(jìn)行調(diào)度,bytraffic則執(zhí)行基于權(quán)重的流量計(jì)數(shù)調(diào)度,bybusyness通過考量每個(gè)后端服務(wù)器的當(dāng)前負(fù)載進(jìn)行調(diào)度。
  • maxattempts:放棄請求之前實(shí)現(xiàn)故障轉(zhuǎn)移的次數(shù),默認(rèn)為1,其最大值不應(yīng)該大于總的節(jié)點(diǎn)數(shù)。
  • nofailover:取值為On或Off,設(shè)置為On時(shí)表示后端服務(wù)器故障時(shí),用戶的session將損壞;因此,在后端服務(wù)器不支持session復(fù)制時(shí)可將其設(shè)置為On。
  • stickysession:調(diào)度器的sticky session的名字,根據(jù)web程序語言的不同,其值為JSESSIONID或PHPSESSIONID。

上述指令除了能在banlancer://或ProxyPass中設(shè)定之外,也可使用ProxySet指令直接進(jìn)行設(shè)置,如:

<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調(diào)整HTTP重定向響應(yīng)報(bào)文中的Location、Content-Location及URI標(biāo)簽所對(duì)應(yīng)的URL,在反向代理環(huán)境中必須使用此指令避免重定向報(bào)文繞過proxy服務(wù)器。

好了,這里apache使用mod_proxy反向代理tomcat的講解就全部完成了,下面我們繼續(xù)說下面的內(nèi)容。

五、Apache使用mod_jk反向代理Tomcat


mod_jk是ASF的一個(gè)項(xiàng)目,是一個(gè)工作于apache端基于AJP協(xié)議與Tomcat通信的連接器,它是apache的一個(gè)模塊,是AJP協(xié)議的客戶端(服務(wù)端是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

好了,大家可以看到我們的模塊已安裝完成。下面我們繼續(xù),apache要使用mod_jk連接器,需要在啟動(dòng)時(shí)加載此連接器模塊。為了便于管理與mod_jk模塊相關(guān)的配置,這里使用一個(gè)專門的配置文件/etc/httpd/extra/httpd-jk.conf來保存相關(guān)指令及其設(shè)置。其內(nèi)容如下:

# 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的主配置文件中設(shè)置其它一些指令來配置其工作屬性。如JkWorkersFile則用于指定保存了worker相關(guān)工作屬性定義的配置文件,JkLogFile則用于指定mod_jk模塊的日志文件,JkLogLevel則可用于指定日志的級(jí)別(info, error, debug),此外還可以使用JkRequestLogFormat自定義日志信息格式。而JkMount(格式: JkMount <URL to match> <Tomcat worker name>)指定則用于控制URL與Tomcat workers的對(duì)應(yīng)關(guān)系。

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

對(duì)于apache代理來說,每一個(gè)后端的Tomcat實(shí)例中的engine都可以視作一個(gè)worker,而每一個(gè)worker的地址、連接器的端口等信息都需要在apache端指定以便apache可以識(shí)別并使用這些worker。約定俗成,配置這些信息的文件通常為workers.properties,其具體路徑則是使用前面介紹過的JkWorkersFile指定的,在apache啟動(dòng)時(shí),mod_jk會(huì)掃描此文件獲取每一個(gè)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.檢查配置文件并重啟服務(wù)器

[root@apache ~]# /usr/local/apache/bin/httpd -t
Syntax OK
[root@apache ~]# service httpd restart
停止 httpd:            [確定]
正在啟動(dòng) httpd:           [確定]

5.測試

好了,到這里我們的配置就全部完成了,下面我們來說一說workers.properties配置文件。

6.workers.properties配置文件詳解

workers.properties文件一般由兩類指令組成:一是mod_jk可以連接的各worker名稱列表,二是每一個(gè)worker的屬性配置信息。它們分別遵循如下使用語法。

worker.list = < a comma separated list of worker names >
worker. <worker name> .<property> = <property value>

其中worker.list指令可以重復(fù)指定多次,而worker name則是Tomcat中engine組件jvmRoute參數(shù)的值。如:worker.TomcatA.host=172.16.100.1

根據(jù)其工作機(jī)制的不同,worker有多種不同的類型,這是需要為每個(gè)worker定義的一項(xiàng)屬性worker.<work name>.type。常見的類型如下:

  • ajp13:此類型表示當(dāng)前worker為一個(gè)運(yùn)行著的Tomcat實(shí)例。
  • lb:lb即load balancing,專用于負(fù)載均衡場景中的woker;此worker并不真正負(fù)責(zé)處理用戶請求,而是將用戶請求調(diào)度給其它類型為ajp13的worker。
  • status:用戶顯示分布式環(huán)境中各實(shí)際worker工作狀態(tài)的特殊worker,它不處理任何請求,也不關(guān)聯(lián)到任何實(shí)際工作的worker實(shí)例。具體示例如請參見后文中的配置。
  • worker其它常見的屬性說明:
  • host:Tomcat 7的worker實(shí)例所在的主機(jī);
  • port:Tomcat 7實(shí)例上AJP1.3連接器的端口;
  • connection_pool_minsize:最少要保存在連接池中的連接的個(gè)數(shù);默認(rèn)為pool_size/2;
  • connection_pool_timeout:連接池中連接的超時(shí)時(shí)長;
  • mount:由當(dāng)前worker提供的context路徑,如果有多個(gè)則使用空格格開;此屬性可以由JkMount指令替代;
  • retries:錯(cuò)誤發(fā)生時(shí)的重試次數(shù);
  • socket_timeout:mod_jk等待worker響應(yīng)的時(shí)長,默認(rèn)為0,即無限等待;
  • socket_keepalive:是否啟用keep alive的功能,1表示啟用,0表示禁用;
  • lbfactor:worker的權(quán)重,可以在負(fù)載均衡的應(yīng)用場景中為worker定義此屬性;
  • 另外,在負(fù)載均衡模式中,專用的屬性還有:(這些內(nèi)容我們會(huì)在下一篇tomcat負(fù)載均衡集群中詳細(xì)講解)
  • balance_workers:用于負(fù)載均衡模式中的各worker的名稱列表,需要注意的是,出現(xiàn)在此處的worker名稱一定不能在任何worker.list屬性列表中定義過,并且worker.list屬性中定義的worker名字必須包含負(fù)載均衡worker。具體示例請參見后文中的定義。
  • method:可以設(shè)定為R、T或B;默認(rèn)為R,即根據(jù)請求的個(gè)數(shù)進(jìn)行調(diào)度;T表示根據(jù)已經(jīng)發(fā)送給worker的實(shí)際流量大小進(jìn)行調(diào)度;B表示根據(jù)實(shí)際負(fù)載情況進(jìn)行調(diào)度。
  • sticky_session:在將某請求調(diào)度至某worker后,源于此址的所有后續(xù)請求都將直接調(diào)度至此worker,實(shí)現(xiàn)將用戶session與某worker綁定。默認(rèn)為值為1,即啟用此功能。如果后端的各worker之間支持session復(fù)制,則可以將此屬性值設(shè)為0。

根據(jù)前文中的指定,這里使用/etc/httpd/extra/workers.properties來定義一個(gè)名為TomcatA的worker,并為其指定幾個(gè)屬性。文件內(nèi)容如下:

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

至此,一個(gè)基于mod_jk模塊與后端名為TomcatA的worker通信的配置已經(jīng)完成,重啟httpd服務(wù)即可生效。好了,這到里所有配置全部講解完成。希望大家有所收獲_……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容