apache http+Tomcat集群+隐藏apache信息

1、背景

apache http server(以下简称apache1)占据了70%的WEB服务器市场份额,尤其是它的开源和支持广泛的扩展特性,Tomcat也是apache.org旗下的一款支持Java Servlet容器和JSP规范的轻量级WEB应用服务器,为了快速简单的配置支持SSH服务器,打算将apache和tomcat整合,并且在单机上部署多个tomcat形成的负载均衡的服务器集群,apache负责处理静态http,而动态的则有tomcat处理。

2、服务器及模块

apache:http://httpd.apache.org/

tomcat:http://tomcat.apache.org/

tomcat connectors:http://tomcat.apache.org/download-connectors.cgi(按照apache的版本来下载)

apache+tomcat的负载均衡使用两种方法:mod_jk和mod_proxy,这里使用mod_jk,如果使用mod_proxy,可以参考http://www.iteye.com/topic/757125,mod_proxy也可以配置apache集群及负载均衡。

3、安装apache及tomcat服务器(均1个)

4、apache+tomcat集群配置(以3个tomcat服务器为例)

(1)复制2次安装好的tomcat服务器,现在一共是3个tomcat服务器,但还不能运行,需要进行以下配置;

(2)打开apache安装目录下的conf/httpd.conf文档,在文档末尾键入

include conf/mod_jk.conf

(3)在conf目录下新建mod_jk.conf文档,键入

#加载mod_jk Module   
LoadModule jk_module modules/mod_jk.so  
  
#指定 workers.properties文件路径   
JkWorkersFile conf/workers.properties   
  
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器   
JkMount /*.jsp controller  

(4)在conf目录下新建workers.properties文档,键入

worker.list = controller,tomcat1,tomcat2,tomcat3  #server 列表    
#========tomcat1========    
worker.tomcat1.port=8009       #ajp13 端口号,在tomcat下server.xml配置,默认8009    
worker.tomcat1.host=localhost  #tomcat的主机地址,如不为本机,请填写ip地址    
worker.tomcat1.type=ajp13    
worker.tomcat1.lbfactor = 1    #server的加权比重,值越高,分得的请求越多    
   
#========tomcat2========    
worker.tomcat2.port=8109       
worker.tomcat2.host=localhost      
worker.tomcat2.type=ajp13    
worker.tomcat2.lbfactor = 1       

#========tomcat3========    
worker.tomcat3.port=8209       
worker.tomcat3.host=localhost  
worker.tomcat3.type=ajp13    
worker.tomcat3.lbfactor = 1   
   
#========controller,负载均衡控制器========    
worker.controller.type=lb    
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3   #指定分担请求的tomcat    
worker.controller.sticky_session=false                       #(5)中的<Cluster ……>为默认情况
worker.controller.sticky_session_force=1
#worker.controller.sticky_seesion=true                       #(5)按照http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html设置

(5)修改3个tomcat安装目录下的conf/server.xml文档2 3去掉

<!--<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>-->
的隐藏符号(<!-- -->),并
<Engine name="Catalina" defaultHost="localhost">

依次修改为:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat3">

(6)选择2个tomcat,修改其conf/server.xml文档中的端口号,以免3个tomcat服务器的端口号冲突,如下:

<!--默认端口是8005,可依次改为8105和8205-->

<Server port="8005" shutdown="SHUTDOWN">

<!--默认端口是8080,可依次改为8081和8082-->

Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<!--默认端口是8009,可依次改为8109和8209,需要和apache的conf/workers.properties文档中的worker.tomcatX.port(红色标示)相对应-->

 <Connector port="8209" protocol="AJP/1.3" redirectPort="8443" />

 (7)新建test目录,并在其下新建WEB-INF目录,在WEB-INF新建web.xml文档,键入:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">      
       <display-name>TomcatClusterDemo</display-name>      
       <distributable/>      
</web-app>  

在test目录下新建test.jsp文件,键入:

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
  <body>
    Server Info:
    <%out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
    <%
      out.println("<br> ID " + session.getId()+"<br>");
      // 如果有新的 Session 属性设置
       String dataName = request.getParameter("dataName");
      if (dataName != null && dataName.length() > 0) {
          String dataValue = request.getParameter("dataValue");
          session.setAttribute(dataName, dataValue);
      }
      out.println("<b>Session 列表</b><br>");
      System.out.println("============================");
      Enumeration e = session.getAttributeNames();
      while (e.hasMoreElements()) {
        String name = (String)e.nextElement();
        String value = session.getAttribute(name).toString();
        out.println( name + " = " + value+"<br>");
        System.out.println( name + " = " + value);
      }
    %>
    <form action="test.jsp" method="POST">
      名称:<input type=text size=20 name="dataName">
      <br>
      值:<input type=text size=20 name="dataValue">
      <br>
      <input type=submit>
    </form>
  </body>
</html>

(8)开启/重启apache,默认apache端口是80

(9)开启第一个tomcat,即tomcat1,在IE或firefox访问http://localhost:80/test/test.jsp;开启第二个tomcat,即tomcat2,在同一个IE或firefox新建选项卡中访问http://localhost:80/test/test.jsp;开启第三个tomcat,即tomcat3,在同一个IE或firefox新建选项卡中访问http://localhost:80/test/test.jsp。如图

5、隐藏apache信息

只需要修改apache安装目录下conf/httpd.conf文档中

ServerSignature On ==>> ServerSignature Off

ServerTokens Full ==>> ServerTokens Prod

 

---------------------------------------------

1.apahce替代品Nginx

2.
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>    
3.

在tomcat6.0容器中运行会话复制所需具备的条件:

To run session replication in your Tomcat 6.0 container, the following steps should be completed:

a.All your session attributes must implement java.io.Serializable

b.Uncomment the Cluster element in server.xml

c.If you have defined custom cluster valves, make sure you have the ReplicationValve defined as well under the Cluster element in server.xml

d.If your Tomcat instances are running on the same machine, make sure the tcpListenPort attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100

e.Make sure your web.xml has the <distributable/> element

f.If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine <Engine name="Catalina" jvmRoute="node01" > and that the jvmRoute attribute value matches your worker name in workers.properties

g.Make sure that all nodes have the same time and sync with NTP service!

h.Make sure that your loadbalancer is configured for sticky session mode.


附:

1.http://jackandroid.iteye.com/blog/627147

tomcat集群中的session管理,主要有两种方式:

1).粘性session

表示从同一窗口发来的请求都将有集群中的同一个tomcat进行处理。配置方式是在上面workers.properties文件中

worker.lbcontroller.sticky_session=True 

粘性session的好处在不会在不同的tomcat上来回跳动处理请求,但是坏处是如果处理该session的tomcat崩溃,那么之后的请求将由其他tomcat处理,原有session失效而重新新建一个新的session,这样如果继续从session取值,会抛出nullpointer的访问异常。

2).session复制

session复制是指tomcat彼此之间通过组播方式将session发到各个tomcat实例上,如果其中一个访问出错,则另外tomcat仍然具有有效的session内容,从而能正常接管其session。坏处是当tomcat实例很多,或者用户在session中有大量操作时,组播发送的信息量十分惊人。session复制配置则是在发布的web应用程序中的web.xml中添加

 <distributable/>

 此外,session复制所需的JDK必须是JDK 5.0及其以上版本。

2.http://www.iteye.com/topic/757125
实现集群的应用最重要的是处理用户Session的问题,一般有三种策略: 
a. Session复制 
b. Session Sticky 
c. 基于Cache的集中式Session

3.http://blog.csdn.net/frank3g/article/details/6717131

      a.Session复制。Session复制的技术实现非常复杂,在大规模集群中实用性并不强,服务器之间大量的Session复制会严重影响这些服务器的性能。而随着服务器数量的增加,这种性能影响会显得更加突出,甚至不可接受。在大部分互联网应用中,Session复制技术应该是很少采用的。
      b.Session Sticky。为了避免Session复制所带来的性能影响,更简单、也是更高效的一种做法是Session Sticky。这种方式将同一用户的请求转发到特定的JBoss服务器上,避免了集群中Session的复制。Session Sticky的实现非常简单,但是这种方式不能满足fail-over的需求。即当一台应用服务器down的时候,这台服务器上正在访问的所有用户的 Session都失效了,所有用户不得不再次重新登录。而且这种方式还容易导致负载不够均衡。
      c.基于Cache的集中式Session。这种方案通常使用集中式的Cache来代替本地Session。集中式的Session服务器采用的是MemCached,其本身也具备水平扩展能力。当Session数量大到一台Cache服务器都不能承受的程度时,我们也仅需要增加相应的Cache服务器即可。

      三种水平扩展方式的比较:

实现方式优势劣势
Session复制服务器负载可以得到较好的均衡,也可以确保fail-over的支持Session复制会对服务器网络环境带来巨大的压力,尤其在应用服务器数量较大的时候,基本不适用于大型互联网,而且需要相应的应用服务器支持
Session Sticky实现比较简单,在Load Balance层做相应的配置即可,不会带来Session复制引起的网络环境压力不能实现完全的负载均衡,部分情况下负载会极端失衡,无法实现fail-over
基于Cache的集中式Session应用服务器层无状态,可以实现完全的负载均衡,不会带来Session复制引起的网络环境压力实现相对复杂一些,Cache本身可靠性不能绝对保证,可能会造成部分Session的丢失

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值