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

轉自陳明乾的博客,可能有一定更新。

轉原文聲明:
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://freeloda.blog.51cto.com/2033581/1301382

大綱


  • 一、環境準備,安裝 Apache
  • 二、安裝 Tomcat
  • 三、Tomcat 虛擬主機的配置
  • 四、Apache使用mod_proxy反向代理Tomcat
  • 五、Apache使用mod_jk反向代理Tomcat

注,環境說明:操作系統CnetOS6.8 x86_64,軟件下載地址:

一、環境準備


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
  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 $*

下面我們來增加執行權限,并加入服務列表設置開機自啟動,

[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.png

ProxyRequests

{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服務即可生效。好了,這到里所有配置全部講解完成。希望大家有所收獲_……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容