一、tomcat 安装

1、首先安装JDK
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1637583.html
这里用rpm的安装:
#  rpm -ivh jdk-7u5-linux-i586.rpm

安装完成后,定义变量和路径:


  1. # vim /etc/profile  
  2. JAVA_HOME=/usr/java/jdk1.7.0_05  
  3. PATH=$JAVA_HOME/bin:$PATH  
  4. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC 


之后显示如下信息OK:


  1. # java -version  
  2. java version "1.7.0_05"  
  3. Java(TM) SE Runtime Environment (build 1.7.0_05-b06)  
  4. Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing) 


2、安装tomcat:
官网下载地址:http://tomcat.apache.org


  1. # tar xf apache-tomcat-7.0.29.tar.gz -C /usr/local/  
  2. # cd /usr/local/  
  3. # ln -s apache-tomcat-7.0.29/ tomcat  
  4. # cd /usr/local/tomcat/bin/  
  5. # ./catalina.sh start           //启动tomcat 

可以看到已经启动了,访问下看看:

Tomcat 整理总结 及 apache + tomcat 集群

Tomcat 整理总结 及 apache + tomcat 集群

3、介绍下tomcat各个目录的作用:


  1. bin                               执行文件目录  
  2. conf                              配置文件目录  
  3. lib                               公共类目录  
  4. logs                              日志文件目录  
  5. temp                              临时文件目录  
  6. webapps                           网页文件目录  
  7.                 docs                帮助文档目录   
  8.                 examples            样例存放目录   
  9.                 host-manager web    管理接口目录,主机定义  
  10.                 manager  web        管理接口目录,部署会话  
  11.                 ROOT                本地访问的目录  
  12. work                              JSP的工作目录  


4、自定义jsp页面:


  1. # cd /usr/local/tomcat/webapps/   
  2. # mkdir -p test/WEB-INF/{lib,classes}  //建立目录结构  
  3.  
  4. # cat test/index.jsp   
  5. <html> 
  6.     <head> 
  7.           <title>Hello</title> 
  8.     </head> 
  9.     <body> 
  10.        <% out.println("hello world!"); %> 
  11.     </body> 
  12. </html> 

这里要提醒的是tomcat这里是自动部署的,所以不用重启tomcat,直接访问下试试:

Tomcat 整理总结 及 apache + tomcat 集群

5、下面建立个SNS社交网站:


  1. 首先安装mysql  
  2. # yum -y install mysql-server  
  3. # service mysqld start  
  4.  
  5. # mkdir /www/webapps  
  6. # unzip JavaCenter_Home_2.0_GBK.zip -d /www/webapps/  
  7. # cd /www/webapps/  
  8. # mv JavaCenter_Home_2.0_GBK/ jcenter  
  9.  
  10. 修改主配置文件添加如下信息,定义路径,reloadbale是否自动部署:  
  11. # vim /usr/local/tomcat/conf/server.xml   
  12. ……  
  13. <Host name="localhost"  appBase="webapps" 
  14.             unpackWARs="true" autoDeploy="true"> 
  15.  <Context path="/jcenter" docBase="/www/webapps/jcenter/upload/" reloadbale="trun" /> 
  16. ……  
  17.  
  18. 重启服务  
  19. # /usr/local/tomcat/bin/catalina.sh stop  
  20. # /usr/local/tomcat/bin/catalina.sh start  
  21.  
  22. 浏览器输入http://192.168.80.143:8080/jcenter/install按步骤安装即可: 

最后访问如下:

Tomcat 整理总结 及 apache + tomcat 集群


二、tomcat的两个web管理接口
首页有3个按钮,前两个是基于manager-gui的,后面的是基于admin-gui的:

Tomcat 整理总结 及 apache + tomcat 集群

下面配置下相关用户,之后重启服务:


  1. # vim /usr/local/tomcat/conf/tomcat-users.xml  
  2. <tomcat-users> 
  3.   <role rolename="manager-gui"/> 
  4.   <user username="tomcat" password="tomcat" roles="manager-gui"/> 
  5.   <role rolename="admin-gui"/> 
  6.   <user username="redhat" password="tomcat" roles="admin-gui"/> 
  7. </tomcat-users> 

下面访问下基于manager-gui的:

Tomcat 整理总结 及 apache + tomcat 集群

输入密码,可以看到部署的信息了:

Tomcat 整理总结 及 apache + tomcat 集群

Tomcat 整理总结 及 apache + tomcat 集群


下面访问基于admin-gui的,这回输入基于admin-gui的用户密码:

Tomcat 整理总结 及 apache + tomcat 集群

可以看到基于主机定义的相关信息了:

Tomcat 整理总结 及 apache + tomcat 集群

下面访问下基于manager-gui的status:

Tomcat 整理总结 及 apache + tomcat 集群

这里可以看到有ajp和http的两个信息,这是tomcat的两个连接器

Tomcat 整理总结 及 apache + tomcat 集群


三、基于tomcat的架构实例

实现负载均衡,拓扑如下:

Tomcat 整理总结 及 apache + tomcat 集群


下面开始配置apache,这里要知道的是apache连接tomcat有两个模块,分别是mode_jk和mode_proxy:
mode_jk只通过ajp的连接tomcat的
mode_proxy可以通过ajp和http的两种方式

1、安装配置apache:


  1. # yum -y groupinstall "Development Libraries"  
  2. # yum -y install pcre-devel  
  3.  
  4. # tar xf apr-1.4.6.tar.bz2   
  5. # cd apr-1.4.6  
  6. # ./configure --prefix=/usr/local/apr  
  7. # make && make install  
  8.  
  9. # tar xf apr-util-1.4.1.tar.bz2   
  10. # cd apr-util-1.4.1  
  11. # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  
  12. # make && make install  
  13.  
  14. # tar xf httpd-2.4.2.tar.bz2   
  15. # cd httpd-2.4.2  
  16. # ./configure --prefix=/usr/local/apache \  
  17. > --sysconfdir=/etc/httpd \  
  18. > --enable-so \  
  19. > --enable-ssl \  
  20. > --enable-cgi \  
  21. > --enable-rewrite \  
  22. > --with-zlib \  
  23. > --with-pcre \  
  24. > --with-apr=/usr/local/apr \  
  25. > --with-apr-util=/usr/local/apr-util \  
  26. > --enable-proxy \  
  27. > --enable-proxy-http \  
  28. > --enable-proxy-ajp  
  29. # make && make install 

添加启动脚本


  1. # vim /etc/rc.d/init.d/httpd  
  2. #!/bin/bash  
  3. #  
  4. # httpd        Startup script for the Apache HTTP Server  
  5. #  
  6. # chkconfig: - 85 15  
  7. # description: Apache is a World Wide Web server.  It is used to serve \  
  8. #        HTML files and CGI.  
  9. # processname: httpd  
  10. # config: /etc/httpd/conf/httpd.conf  
  11. # config: /etc/sysconfig/httpd  
  12. # pidfile: /var/run/httpd.pid  
  13.  
  14. # Source function library.  
  15. . /etc/rc.d/init.d/functions  
  16.  
  17. if [ -f /etc/sysconfig/httpd ]; then  
  18.         . /etc/sysconfig/httpd  
  19. fi  
  20.  
  21. # Start httpd in the C locale by default.  
  22. HTTPD_LANG=${HTTPD_LANG-"C"}  
  23.  
  24. # This will prevent initlog from swallowing up a pass-phrase prompt if  
  25. # mod_ssl needs a pass-phrase from the user.  
  26. INITLOG_ARGS="" 
  27.  
  28. # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server  
  29. # with the thread-based "worker" MPM; BE WARNED that some modules may not  
  30. # work correctly with a thread-based MPM; notably PHP will refuse to start.  
  31.  
  32. # Path to the apachectl script, server binary, and short-form for messages.  
  33. apachectl=/usr/local/apache/bin/apachectl  
  34. httpd=${HTTPD-/usr/local/apache/bin/httpd}  
  35. prog=httpd 
  36. pidfile=${PIDFILE-/var/run/httpd.pid}  
  37. lockfile=${LOCKFILE-/var/lock/subsys/httpd}  
  38. RETVAL=0 
  39.  
  40. start() {  
  41.         echo -n $"Starting $prog: "  
  42.         LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS  
  43.         RETVAL=$?  
  44.         echo  
  45.         [ $RETVAL = 0 ] && touch ${lockfile}  
  46.         return $RETVAL  
  47. }  
  48.  
  49. stop() {  
  50.  echo -n $"Stopping $prog: "  
  51.  killproc -p ${pidfile} -d 10 $httpd  
  52.  RETVAL=$?  
  53.  echo  
  54.  [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}  
  55. }  
  56. reload() {  
  57.     echo -n $"Reloading $prog: "  
  58.     if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then  
  59.         RETVAL=$?  
  60.         echo $"not reloading due to configuration syntax error"  
  61.         failure $"not reloading $httpd due to configuration syntax error"  
  62.     else  
  63.         killproc -p ${pidfile} $httpd -HUP  
  64.         RETVAL=$?  
  65.     fi  
  66.     echo  
  67. }  
  68.  
  69. # See how we were called.  
  70. case "$1" in  
  71.   start)  
  72.  start  
  73.  ;;  
  74.   stop)  
  75.  stop  
  76.  ;;  
  77.   status)  
  78.         status -p ${pidfile} $httpd  
  79.  RETVAL=$?  
  80.  ;;  
  81.   restart)  
  82.  stop  
  83.  start  
  84.  ;;  
  85.   condrestart)  
  86.  if [ -f ${pidfile} ] ; then  
  87.   stop  
  88.   start  
  89.  fi  
  90.  ;;  
  91.   reload)  
  92.         reload  
  93.  ;;  
  94.   graceful|help|configtest|fullstatus)  
  95.  $apachectl [email protected]  
  96.  RETVAL=$?  
  97.  ;;  
  98.   *)  
  99.  echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"  
  100.  exit 1  
  101. esac  
  102.  
  103. exit $RETVAL 

# chmod +x /etc/rc.d/init.d/httpd

添加pidfile,去掉如下行的#号注释:
# vim /etc/httpd/httpd.conf
PidFile  "/var/run/httpd.pid"

ServerName www.example.com:80
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so

启动服务
# service httpd start

访问OK:

Tomcat 整理总结 及 apache + tomcat 集群


使用虚拟主机的方式方便管理,在httpd.conf中开启:
# vim /etc/httpd/httpd.conf
# DocumentRoot "/usr/local/apache/htdocs"
Include /etc/httpd/extra/httpd-vhosts.conf


配置基于mode_proxy的负载均衡:


  1. # vim /etc/httpd/extra/httpd-vhosts.conf   
  2. ProxyRequests Off  
  3. <proxy balancer://cluster>  //定义负载均衡,起名cluster  
  4. BalancerMember ajp://192.168.80.143:8009 loadfactor=10 route=TomcatA //定义使用ajp,http的也可以连接,http的端口要改  
  5.  
  6. 8080  
  7. BalancerMember ajp://192.168.80.144:8009 loadfactor=10 route=TomcatB 
  8. </proxy> 
  9.  
  10. (定义反向代理)  
  11. ProxyPass / balancer://cluster/ stickysession=jsessionid   
  12. ProxyPa***everse / balancer://cluster/  
  13.  
  14. # service httpd restart 

2、配置tomcat,两台的配置一样:


  1. 添加jvmRoute参数 也就是worker名称:  
  2. # vim /usr/local/tomcat/conf/server.xml  
  3. <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA" > 
  4. (另外一条TomcatB即可)  
  5. 重启tomcat  
  6.  
  7. 安装就不介绍了,先建立jsp页面:  
  8. # cat index.jsp   
  9. <%@ page language="java" %> 
  10. <html> 
  11.   <head><title>TomcatA</title></head> 
  12.   <body> 
  13.     <h1><font color="red">TomcatA </font></h1> 
  14.     <table align="centre" border="1"> 
  15.       <tr> 
  16.         <td>Session ID</td> 
  17.         <td><%= session.getId() %></td> 
  18.       </tr> 
  19.       <tr> 
  20.         <td>Created on</td> 
  21.         <td><%= session.getCreationTime() %></td> 
  22.      </tr> 
  23.     </table> 
  24.   </body> 
  25. </html> 
  26.  

先分别访问看看:
tomcatA的:

Tomcat 整理总结 及 apache + tomcat 集群

tomcatB的:

Tomcat 整理总结 及 apache + tomcat 集群 

3、测试负载均衡:

Tomcat 整理总结 及 apache + tomcat 集群 Tomcat 整理总结 及 apache + tomcat 集群
再看看manager的status信息,看到这里有通过AJP连接的信息了:

Tomcat 整理总结 及 apache + tomcat 集群

可以看到有负载均衡的状态了,并且还能状态检测,但是session id也不一样,可以看出没有会话保持的。
 


基于mode_jk的负载均衡:

在apaches上安装模块:
下载模块:http://tomcat.apache.org/download-connectors.cgi


  1. # tar xf tomcat-connectors-1.2.37-src.tar.gz  
  2. # cd tomcat-connectors-1.2.37-src/native/  
  3. # ./configure --with-apxs=/usr/local/apache/bin/apxs  
  4. # make && make install  
  5.  
  6. 新建httpd-jk配置文件:  
  7. # vim /etc/httpd/extra/httpd-jk.conf  
  8. LoadModule  jk_module  modules/mod_jk.so  //装载模块  
  9. JkWorkersFile  /etc/httpd/extra/workers.properties //定义worker的文件  
  10. JkLogFile  logs/mod_jk.log    //JK 日志  
  11. JkLogLevel  debug     //日志级别  
  12. JkMount  /*  cluster1     //转发所有到clister1  
  13. JkMount  /status  stat     //将status转发到stat  
  14.  
  15. 定义workers信息  
  16. # vim /etc/httpd/extra/workers.properties   
  17. worker.list = cluster1,stat    //指定worker名称  
  18. worker.TomcatA.port = 8009    //端口号  
  19. worker.TomcatA.host = 192.168.80.143   //主机  
  20. worker.TomcatA.type = ajp13    //ajp配置  
  21. worker.TomcatA.lbfactor = 1    //权重值  
  22.  
  23. worker.TomcatB.port = 8009 
  24. worker.TomcatB.host = 192.168.80.144  
  25. worker.TomcatB.type = ajp13 
  26. worker.TomcatB.lbfactor = 2 
  27.  
  28. worker.cluster1.type = lb  
  29. worker.cluster1.balance_workers = TomcatA, TomcatB //指定cluster1包含tomcatA和tomcatB  
  30. worker.stat.type = status    //定义stat,显示状态信息  
  31.  
  32. 在配置httpd.conf中引用httpd-jk.conf文件,并注释使用proxy模块:  
  33. #Include /etc/httpd/extra/httpd-vhosts.conf  
  34. Include  /etc/httpd/extra/httpd-jk.conf  
  35.  
  36. # service httpd restart

下面访问下,可以看到有负载均衡了:

Tomcat 整理总结 及 apache + tomcat 集群  Tomcat 整理总结 及 apache + tomcat 集群

并且可以通过status查看节点状态:

Tomcat 整理总结 及 apache + tomcat 集群


基于apache + tomcat session群集:

一、首先apache的负载均衡信息为前面的mode_proxy和mode_jk两种方式都可以

 

二、在Tomcat配置文件Engine容器中添加如下信息:


  1. <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA" > (web2的jvmRoute="TomcatA")
  2.  
  3. <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
  4.           channelSendOptions="8">  //定义集群的类型为SimpleTcpCluster,心跳信息传输方式  
  5. <Manager className="org.apache.catalina.ha.session.DeltaManager" //定义session管理器为DeltaManager  
  6.           expireSessionsOnShutdown="false"      
  7.           notifyListenersOnReplication="true"/> 
  8.  <Channel className="org.apache.catalina.tribes.group.GroupChannel"> //配置节点间传递属性  
  9.   <Membership className="org.apache.catalina.tribes.membership.McastService" //定义多播通信  
  10.           address="228.50.10.100"   bind="192.168.80.143"   port="45564" //多播地址,通过网卡,端口,重试时间,超时时间  
  11.           frequency="500"  dropTime="3000"/> 
  12.   <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" //定义接收信息  
  13.            address="192.168.80.143"   port="4000"  autoBind="100"  //接收地址,端口 (web2地址为192.168.80.144) 
  14.            selectorTimeout="5000"   maxThreads="6"/> 
  15.   <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  //定义发送信息  
  16.   <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 
  17.   </Sender> 
  18.   <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  //过滤器  
  19.   <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 
  20.   </Channel> 
  21.  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"   
  22.      filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/> 
  23.   <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  //于jvmRouter绑定  
  24.   <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"    //定义分布信息  
  25.     tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" 
  26.     watchDir="/tmp/war-listen/"  watchEnabled="false"/> 
  27.  <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> //监听器,等待事件发生  
  28.  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  //集群监听器  
  29. </Cluster> 
  30. …… 

 

复制个web.xml文件,这里的test就是之前建立的,但是没有web.xml文件
# cp conf/web.xml webapps/test/WEB-INF/

添加<distributable/>
# vim webapps/test/WEB-INF/web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">
<distributable/>

三、测试
重启tomcat先访问下看看各自的信息:

Tomcat 整理总结 及 apache + tomcat 集群 Tomcat 整理总结 及 apache + tomcat 集群


之后再重启apache服务,在访问可以看到serssion id是一直不变,但是在两台tomcat上都有轮询效果:

Tomcat 整理总结 及 apache + tomcat 集群 Tomcat 整理总结 及 apache + tomcat 集群

至此tomcat群集的配置就结束了,如有错误请指出,非常感谢