windows下nginx+tomcat集群,实现session复制共享

时间:2022-04-17 19:14:52

两台不同服务器  ip1、ip2。ip1安装tomcat1,端口8005,8081,8009、nginx,提供nginx外网端口80,ip2安装tomcat2,端口8006,8082,8010。

1、安装apach tomcat。

2、安装ng,下载解压安装到ip1,根据需要修改配置文件nginx.conf:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream portal-driver{
	server ip1:8081 max_fails=0;
        server ip2:8082 max_fails=0;
    }
    

    server {
        listen       80;
        server_name  localhost;

        location /drive{
            root   html;
            index  index.html index.htm;
            proxy_pass  http://portal-driver;
       	    proxy_redirect  default;        
	  }

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}
此时,如果tomcat1、2启动,使用http://nginx.ip访问,查看ng日志,会发现有时候请求ip1服务器,有时候请求的是ip2。这就已经达到了ng负载的功能。

windows下nginx命令:

关闭:nginx.exe -s stop

开启:start nging.exe

重启 nginx.exe - s reload

注,但是此时由于tomcat1、tomcat2部署同一套工程,如果有数据直接写往session,而且不是使用的cookie存放session的key(由于访问地址使用ip,并不适用域名,所以没法使用cookie),会造成两次访问session id不一致。此时就需要做session复制或共享。需要以下操作:

3、修改tomcat下的conf,server.xml文件(两个tomcat修改一致):

将tomcat集群注释cluster打开。

修改节点<Engine name="Catalina" defaultHost="localhost" jvmRoute="driver1">。(tomcat1跟tomcat2指定jvmRoute命名要一致)

4、在工程代码中web.xml添加节点<distributable/> 即可。


测试:

index.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.print("<b>Session 列表</b>");    
		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="index.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>


多次访问,发现 Server Info的ip跟端口一直处于ip1,ip2轮询。但是下面的sessionid 都一样。即可。

(菜鸟勿喷。)