1. 程式人生 > >windows下nginx+tomcat叢集,實現session複製共享

windows下nginx+tomcat叢集,實現session複製共享

兩臺不同伺服器  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 都一樣。即可。

(菜鳥勿噴。)