nginx-1.4.7+tomcat6.0.32+memcache做服务器集群以及session共享

简介

使用nginx做分发器,tomcat6做服务器,使用memcached实现session共享


1.搭建环境:windows

2.准备:

<1>下载nginx-1.4.2,解压到E:\server\nginx文件夹下

<2>下载tomcat6 解压到E:\server\tomcat文件夹下,tomcat准备两个tomcat  分别命名tomcat6-1,tomcat6-2

<3>下载memcache-win32.zip  解压到E:\server\memcache文件夹下

<4>下载jdk6 安装好之后配置环境变量 保证tomcat可以运行正常

<5>下载一下jar包房到tomcat的lib目录下

@1:couchbase-client-1.1.9.jar

@2:javolution-5.4.3.1.jar

@3:memcached-2.6.jar

@4:memcached-session-manager-1.6.5.jar

@5:memcached-session-manager-tc6-1.6.5.jar

@6:msm-javolution-serializer-1.6.5.jar

@7:msm-kryo-serializer-1.6.5.jar

@8:msm-xstream-serializer-1.6.5.jar

@9:spymemcached-2.8.12.jar

3.配置

<1>nginx配置

#user  nobody;

worker_processes  4;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

    worker_connections  2048;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    #                  '$status $body_bytes_sent "$http_referer" '

    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;

    #tcp_nopush     on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    #gzip  on;

    upstream 127.0.0.1{

        server   127.0.0.1:8080;

        server   127.0.0.1:8081; 

    }    

    server {

        listen       8888;

        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {

            root   html;

            index  index.html index.htm;

    proxy_pass        http://127.0.0.1;

    proxy_set_header  X-Real-IP  $remote_addr;

    client_max_body_size  100m;

        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80

        #

        #location ~ \.php$ {

        #    proxy_pass   http://127.0.0.1;

        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

        #

        #location ~ \.php$ {

        #    root           html;

        #    fastcgi_pass   127.0.0.1:9000;

        #    fastcgi_index  index.php;

        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

        #    include        fastcgi_params;

        #}

        # deny access to .htaccess files, if Apache's document root

        # concurs with nginx's one

        #

        #location ~ /\.ht {

        #    deny  all;

        #}

    }

}

注意:    worker_processes  4;此处数值一般为cpu个数

worker_connections  2048;此处的数值为连接数

upstream 127.0.0.1{
        server   127.0.0.1:8080
weight=3;
        server   127.0.0.1:8081
weight=2
    }  

weight是权值,数值越大,表示被访问的机会越大。

此处的127.0.0.1可以改为域名,里边的参数 server配置需要集群的服务器的IP和端口,此处都为本机所以IP直接配成127.0.0.1,端口不能相同,当然如果这

这两个服务器不在同一台电脑上那么端口是可以相同的,如果是在同一台电脑上那么端口必然不能相同。

listen       80;此处为分发器nginx的端口,默认是80端口,如果被占用可以修改为别的端口

proxy_pass        http://127.0.0.1;此处的127.0.0.1与upstream后边的127.0.0.1相同,当然可以同时修改为域名,页面访问的时候可以使用http://域名:端口/项目,来访问


<2>tomcate配置

@1:tomcat6-1配置如下:修改conf\server.xml

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">

  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container", 
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
  
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="150" minSpareThreads="4"/>
    -->
    
    
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    -->           
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->
    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">         
    --> 
 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat6-1">  

  

  

  

	<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>  
      <!-- The request dumper valve dumps useful debugging information about
           the request and response data received and sent by Tomcat.
           Documentation at: /docs/config/valve.html -->
      <!--
      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
      -->

      <!-- This Realm uses the UserDatabase configured in the global JNDI
           resources under the key "UserDatabase".  Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm.  -->
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <!-- Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
        -->

      </Host>
    </Engine>
  </Service>
</Server>

@2:tomcat6-2配置如下:修改conf\server.xml

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="9005" shutdown="SHUTDOWN">

  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container", 
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
  
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="150" minSpareThreads="4"/>
    -->
    
    
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="9080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    -->           
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->
    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">         
    --> 
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat6-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="4001"  
                      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>
      <!-- The request dumper valve dumps useful debugging information about
           the request and response data received and sent by Tomcat.
           Documentation at: /docs/config/valve.html -->
      <!--
      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
      -->

      <!-- This Realm uses the UserDatabase configured in the global JNDI
           resources under the key "UserDatabase".  Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm.  -->
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <!-- Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
        -->

      </Host>
    </Engine>
  </Service>
</Server>

提示:其实tomcat6-1和tomcat6-2的配置基本相同,唯一的区别就是两个server.xml文件中的各个端口不能相同,因为都在同一台机器上当然端口不能相同,值得注意的是,cluster标签中的端口也不能相同,配置的时候一定要留意,还有memcachedNodes="n1:localhost:11211"这句话,这个的意思就是memcached节点信息的配置,从格式上来看n1代表memcached节点1,localhost实际上配置的是memcached节点的IP,11211配置的是memcached节点的端口,多个节点要以空格隔开,其他格式相同,注意在同一台机器上端口也是不能相同的 配置的时候要留心


3.启动和测试

<1>启动memcached服务,可以到E:\server\memcache文件夹下双击memcached.exe即可

<2>启动nginx,可以到E:\server\nginx文件夹下双击nginx.exe即可

<3>在E:\server\tomcat文件夹下的两个tomcat的webapps下新建文件夹test,在test文件夹下新建test2.jsp,在test2.jsp中加入以下代码

test2.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="test2.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>

<4>在test文件夹下新建WEB-INF目录,在WEB-INF中新建web.xml,并加入以下代码

web.xml

<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>TomcatDemo</display-name>
       <distributable/>
</web-app>

保存之后,启动tomcat6-1和tomcat6-2(双击bin文件夹下的startup.bat),然后再浏览器中输入http://127.0.0.1/test/test2.jsp不断的刷新页面,页面上的sessionID是一样的,但是使用的tomcat名字会变化(即tomcat6-1和tomcat6-2交替调用),此时简单的框架已经搭建成功,session也成功共享




所需资源打包:http://download.csdn.net/detail/u013614451/7772089

参考资料
----------------------------
http://blog.csdn.net/jyf211314/article/details/11967937
http://www.blogjava.net/niumd/archive/2011/05/10/349958.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值