当前位置: > Linux集群 > 服务器集群 >

Nginx+Tomcat+Session 高性能群集搭建

时间:2014-10-29 19:44来源:linux.it.net.cn 作者:it

今天下午没事,就做了一个nginx+tomcate+Session 的负载均衡的tomcat集群,tomcat是用的6.0,nginx用的是nginx-1.1.11。测试的目的是看看访问的压力分布和session共享。先看看测试效果。

我在nginx中的nginx.conf中配置的访问权重。是

upstream 127.0.0.1 { 
	
		 #weigth参数表示权值,权值越高被分配到的几率越大 
	
		 server 127.0.0.1:8080 weight=1;
	
		 server 127.0.0.1:8081 weight=1;
	
	 }


1:1的,所以基本上访问是一次到tomcat1,下次到tomcat2.所以可以看到负载被分配到两个tomcat中去了。在两个服务器中,session也是一样的, 所以session也是共享了。

 

下面看配置:

下载tomcat就不用说了,主要说里面的server.xml的配置

tomcat1:

<?xml version='1.0' encoding='utf-8'?>

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

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />


  <GlobalNamingResources>

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


  <Service name="Catalina">

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

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


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



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

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

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


tomcat2:

<?xml version='1.0' encoding='utf-8'?>

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

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <GlobalNamingResources>

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


  <Service name="Catalina">

    <Connector port="8081" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    
    <Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<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>


      <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">

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


要注意上面红色地方的不同。下面配置nginx.conf.在#gzip on;下配置

#gzip  on;

	#设定负载均衡的服务器列表
	
	 upstream 127.0.0.1 { 
	
		 #weigth参数表示权值,权值越高被分配到的几率越大 
	
		 server 127.0.0.1:8080 weight=1;
	
		 server 127.0.0.1:8081 weight=1;
	
	 }

 

还有一个地方配置:

server {
        listen       80;
        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;
        }

listen 80;的端口也可以自定义,如果你机子上有占用了80,那就改一下。
上面绿色的地方是对应的。

还有一个比较重要的就是在工程的web.xml上加一个东西,<distributable/>,请看代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <distributable/>
</web-app>

 

测试一下,先建立一个jsp页面,看代码:

<body>
    <%  

  //HttpSession session = request.getSession(true);  

  System.out.println(session.getId());  

  out.println("<br> SESSION ID:" + session.getId()+"<br>");    

  // 如果有新的请求,则添加session属性  

  String name = request.getParameter("name");  

  if (name != null && name.length() > 0) {
     String value = request.getParameter("value");  
     session.setAttribute(name, value);  
  }    

    out.print("<b>Session List:</b>");    
    Enumeration<String> names = session.getAttributeNames();  
    while (names.hasMoreElements()) {  
       String sname = names.nextElement();   
        String value = session.getAttribute(sname).toString();
        out.println( sname + " = " + value+"<br>");
        System.out.println( sname + " = " + value);
   }
%>
  </body>



然后运行你http://127.0.0.1/你的web项目名称/index.jsp,就能看到上述效果。再闲了,再测试一下lvs+nginx+tomcat的集群配置和效率

(责任编辑:IT)
------分隔线----------------------------