tomcat的部署及session綁定反代

Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照

Sun Microsystems提供的技術規範,實現了對Servlet和JavaServer Page(JSP)

的支持,並提供了作爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、

安全局管理和Tomcat閥等。由於Tomcat本身也內含了一個HTTP服務器,它也可

以被視作一個單獨的Web服務器。但是,不能將Tomcat和Apache Web服務器混

淆,Apache Web Server是一個用C語言實現的HTTP web server;這兩個HTTP

web server不是捆綁在一起的。Apache Tomcat包含了一個配置管理工具,也可

以通過編輯XML格式的配置文件來進行配置。 摘自-wiki


規劃
 apache + mod_jk / mod_proxy   172.16.43.1(salve1.king.com)
 jdk , tomcat                  172.16.43.2(salve2.king.com)
 jdk , tomcat                  172.16.43.3(salve2.king.com)


1 .基本配置 jdk , tomcat (slave2.king.com , slave3.king.com)

i) 準備jdk , tomcat的bin包
jdk-7u9-linux-x64.rpm
apache-tomcat-7.0.42.tar.gz
#
ii) 安裝配置jdk
rpm -ivh jdk-7u9-linux-x64.rpm
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
# 退出編輯後重新執行該腳本導出環境變量
. /etc/profile.d/java.sh
java --version
# 可以看到如下信息
[root@slave2 ~]# java -version
java version "1.7.0_09"
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
# 最後利用javac編譯helloworld確保成功
vim Hello.java
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello Wolrd");
  }
}
# 編譯java代碼
javac Hello.java
# 運行java代碼 , 注意這裏是 類名
java Hello

wKioL1NuebDBeGg5AAIgf60Zj3Q398.jpg

iii) 配置安裝tomcat
tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local
ln -sv /usr/local/apache-tomcat-7.0.42 /usr/local/tomcat
#
vim /etc/init.d/tomcat
#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 96 14
# description: The Apache Tomcat servlet/JSP container.
# JAVA_OPTS='-Xms64m -Xmx128m'
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
#
case $1 in
start)
  exec $CATALINA_HOME/bin/catalina.sh start ;;
stop)
  exec $CATALINA_HOME/bin/catalina.sh stop;;
restart)
  $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
  exec $CATALINA_HOME/bin/catalina.sh start ;;
*)
  echo "Usage: `basename $0` {start|stop|restart}"
  exit 1
  ;;
esac
#
# 編輯完畢後添加tomcat服務開機啓動
chmod +x /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on
service tomcat start

# 測試不改任何配置文件,tomcat默認監聽在8080端口,直接訪問

wKiom1NueiqAw68UAAgoZUTRbkE744.jpg


2. 反代配置 apache + mod_jk(ajp) / mod_proxy(ajp , http) + tomcat

i) 準備apache , tomcat-connectors(mod_jk)的源碼包 (salve1.king.com)
# mod_proxy是apache的原生模塊
httpd-2.4.9.tar.bz2
tomcat-connectors-1.2.37-src.tar.gz
ii) 安裝配置apache基於mod_jk(ajp協議)的反向代理 (salve1.king.com)
編譯需要依賴 pcre-devel-7.8-6.el6.bz2  apr-1.5.0.bz2  apr-util-1.5.3.bz2
按需進行依次編譯安裝
tar xf pcre-devel-7.8-6.el6.bz2
cd pcre-devel-7.8-6
./configure --prefix=/usr/local/pcre
make && make install
#
tar xf apr-1.5.0.tar.bz2
cd apr-1.5.0
./configure --prefix=/usr/local/apr
make && make install
#
tar xf apr-util-1.5.3.tar.bz2
cd apr-util-1.5.3
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
#
# 安裝之前請確保系統之前預裝的httpd已被卸載
rpm -e httpd --nodeps
tar xf httpd-2.4.9.tar.bz2
cd httpd-2.4.9
./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
make && make install
#
# 編輯/etc/httpd/httpd.conf,添加如下行即可:
PidFile  "/var/run/httpd.pid" # 32行
# 將如下模塊啓動,否則無法啓動httpd
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so #128
#
# 啓動腳本如下 vim /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible  \
#          server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi
HTTPD_LANG=${HTTPD_LANG-"C"}
INITLOG_ARGS=""
apachectl=/usr/local/apache/bin/apachectl   # 修改apachectl路徑
httpd=/usr/local/apache/bin/httpd      # 修改httpd bin路徑
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
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 ${STOP_TIMEOUT} $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=6
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        # Force LSB behaviour from killproc
        LSB=1 killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
        if [ $RETVAL -eq 7 ]; then
            failure $"httpd shutdown"
        fi
    fi
    echo
}
# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
        status -p ${pidfile} $httpd
    RETVAL=$?
    ;;
  restart)
    stop
    start
    ;;
  condrestart|try-restart)
    if status -p ${pidfile} $httpd >&/dev/null; then
        stop
        start
    fi
    ;;
  force-reload|reload)
        reload
    ;;
  graceful|help|configtest|fullstatus)
    $apachectl $@
    RETVAL=$?
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
    RETVAL=2
esac
exit $RETVAL
#
# 而後爲此腳本賦予執行權限:
chmod +x /etc/rc.d/init.d/httpd
#
# 加入服務列表:
chkconfig --add httpd
#
# mod_jk安裝配置
tar xf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/native/
./configure --with-apxs=/usr/local/apache/bin/apxs
make && make install
#
# 啓動httpd
service httpd start

# httpd安裝好後需要觀察如下模塊是否已經就緒

wKioL1Nue1yQF4oVAANvmLO8KCI068.jpg

iii) mod_jk(ajp協議)反代tomcat示例 (slave1.king.com)
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  /*  tomcat1
JkMount  /status/  stat1
#
vim /etc/httpd/extra/workers.properties
worker.list=tomcat1,stat1
worker.tomcat1.port=8009
worker.tomcat1.host=172.16.43.2
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
worker.stat1.type = status
#
vim /etc/httpd/httpd.conf
DirectoryIndex index.jsp  # 249行
Include /etc/httpd/extra/httpd-jk.conf # 446行
#
vim /usr/local/tomcat/conf/server.xml (slave2.king.com , slave3.king.com)
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">  # 103行
# 兩個節點分別重啓 httpd , tomcat 服務

# 測試, 此時基本的反代及status頁面已經可以訪問

wKiom1NufBOTIxwHAAf9VnU_FXk535.jpg

wKioL1Nue-qT-qmrAAdxQtaVNXk929.jpg

iv) mod_proxy(http協議 , ajp協議)反代tomcat示例 (salve1.king.com)
# 在httpd.conf的全局配置段(Directory)或虛擬主機(VirtualHost)中添加如下內容:
ProxyVia Off
ProxyRequests Off
ProxyPreserveHost Off
<Proxy *>
  Require all granted
</Proxy>
  ProxyPass  /  ajp://172.16.43.2:8009/
  ProxyPa***everse  /  ajp://172.16.43.2:8009/
<Location  / >
  Require all granted
</Location>
#
# apache跟Tomcat的http連接器進行整合:
ProxyVia Off
ProxyRequests Off
ProxyPass / http://172.16.100.2:8080/
ProxyPa***everse / http://172.16.100.2:8080/
<Proxy *>
  Require all granted
</Proxy>
<Location  / >
  Require all granted
</Location>
#
# 基於session綁定均衡反代
ProxyRequests Off
<proxy balancer://lbcluster>
BalancerMember ajp://172.16.100.1:8009 loadfactor=10 route=tomcat1
BalancerMember ajp://172.16.100.2:8009 loadfactor=10 route=tomcat2
</proxy>
#
<VirtualHost *:80>
ServerName www.king.com
ProxyPass / balancer://lbcluster/ stickysession=JSESSIONID
ProxyPa***everse / balancer://lbcluster/
</VirtualHost>
#
# 爲tomcat建立新的webapp用於測試 (slave2.king.com , slave3.king.com)
vim /usr/local/tomcat/conf/server.xml
<Context path="/testsession" docBase="/usr/local/tomcat/webapps/testsession" /> # 140行
#
# 測試頁面 (slave2.king.com)
<%@ page language="java" %>
<html>
  <head><title>tomcat1</title></head>
  <body>
    <h1><font color="red">tomcat1.king.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("king.com","king.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
#
# 測試頁面 (salve3,king.com)
<%@ page language="java" %>
<html>
  <head><title>tomcat2</title></head>
  <body>
    <h1><font color="red">tomcat2.king.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("king.com","king.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

# 測試, 使用不同瀏覽器將訪問落在不同節點上,反覆刷新不變則證明sticksession成功

wKiom1NufGrDkIoKAAP8FP1Allo872.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章