基于Nginx+Tomcat集群实现Session共享
2014-12-11 13:50
357 查看
测试环境
本文档测试环境是在Windows7环境下;Nginx1.5.3-forWindows;3个Tomcat7,部署在同一个Windows环境下。Java环境:JDK1.7Nginx安装
Nginx介绍
Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页伺服器中表现较好。Nginx官方网址为:http://nginx.org/;
Windows下安装
Nginx的Windows版本下载地址为:http://nginx.org/en/download.html。本文档采用的1.5.3版本。2、目录结构
Nginx-
|_ conf 配置目录
|_ contrib
|_ docs 文档目录
|_ logs 日志目录
|_ temp 临时文件目录
|_ html 静态页面目录
|_ nginx.exe 主程序
window下安装Nginx极其简单,解压缩到一个无空格的英文目录即可(个人习惯,担心中文出问题),双击nginx启动,这里我安装到:D:\Server目录,下面涉及到的Tomcat也安装在此目录。
Linux下安装
Nginx的Linux版本下载地址为:http://nginx.org/en/linux_packages.html#stable。Tomcat安装
Tomcat的安装大家比较熟悉,Tomcat官方网站为:http://tomcat.apache.org/。本文档采用的是Tomcat7.0.40绿色版,解压之后即可用。Windows下安装
Windows平台下我将Tomcat安装到D:Server目录。一共安装了5个Tomcat。分别命名为:Tomcat7-1、Tomcat7-2、Tomcat7-3、Tomcat7-4和Tomcat7-5。安装好Nginx和Tomcat后的目录结构如下:
Linux下安装
Linux下安装tomcat同windows下类似,利用tar xvfzapache-tomcat-1.7.0.40.tar.gz命令解压到相应的目录下即可。Nginx配置
Windows下配置
在Windows下安装完Nginx之后的目录结构如下图:启动方式:Dos方式启动。
通过cmd命令进入到Nginx的安装目录。如下图:
在Windows环境下若想停止Nginx,在Dos命令行窗口进入Nginx安装目录执行:nginx –s stop。重新加载命令为:nginx –s reload。
Nginx配置文件默认在conf目录,主要配置文件为nginx.conf,我们安装在D:\Servers\nginx-1.5.3、默认主配置文件为D:\Servers\nginx-1.5.3\conf\nginx.conf。下面是nginx作为前端反向代理服务器的配置代码。
#Nginx所用用户和组,windows下不指定
#user niumd niumd;
#指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍)
worker_processes 8;
#指定文件描述符数量
worker_rlimit_nofile 51200;
#指定pid存放的路径
pid logs/nginx.pid;
#指定错误日志存放的路径和级别,可选debug|info|notice|warn|error|crit
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
events {
#使用的网络I/O模型,Windows下不用配置
#use epoll;
#允许的连接数
worker_connections
51200;
}
http {
include mime.types;
default_type application/octet-stream;
#设置使用的字符集
#隐藏nginx的版本号
server_tokens off;
#自定义日志格式
log_format main '$remote_addr - $remote_user[$time_local] "$request" '
'$status $body_bytes_sent"$http_referer" '
'upstream_response_time$upstream_response_time
$upstream_addr'
'"$http_user_agent""$http_x_forwarded_for"';
#access_log logs/access.log combined;
#access日志存放路径和格式
access_log logs/access.log main;
#提升文件传输性能
sendfile
on;
#tcp_nopush
on;
#设置客户端能够请求的单个文件大小
client_max_body_size 300m;
keepalive_timeout
75;
#proxy参数
#跟后端服务器连接的超时时间,发起握手等候响应超时时间
proxy_connect_timeout 5;
#连接成功后,等候后端服务器的响应时间
proxy_read_timeout 600;
#后端服务器数据回传时间
proxy_send_timeout 600;
#代理请求缓存区
proxy_buffer_size 16k;
#同上,告诉nginx保存单个用的几个buffer、最大用多空间
proxy_buffers 4 64k;
#如果系统很忙时可以申请更大的proxy_buffers,官方推荐*2
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#开启压缩功能
gzip on;
gzip_min_length1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
#压缩级别从低到高1-9
gzip_types text/plainapplication/x-javascript text/css application/xml;
gzip_vary on;
#开启gzip压缩功能
#设置负载均衡池,此处是测试环境中的5个Tomcat的IP地址和端口号。
upstream tomcat_pool {
server10.0.5.43:8801;
server 10.0.5.43:8802;
server 10.0.5.43:8803;
server 10.0.5.43:8804;
server 10.0.5.43:8805;
}
#server设置
server {
#监听的IP和端口
listen
10.0.5.43:80;
#主机名称
server_name
10.0.5.43;
#设置字符集
charsetoff;
#access_log logs/host.access.log main;
location / {
#HTML网页文件存放的目录
#root
/var/www/html;
#默认首页文件
#index
index.jsp index.html index.htm default.jspindex.do default.do;
proxy_pass http://tomcat_pool;
proxy_redirect off;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
}
#访问控制
allowall;
#设置客户端浏览器缓存时间
location ~ \.(gif|jpg|jpeg|png|bmp)$ {
#对很少修改的文件开启expires,设置客户端浏览器缓存时间
expires1h;
#如果找不到图片,需要考虑root或proxypass
}
#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;
#}
#开启nginx监控页面
location/nginx_status{
stub_statuson;
access_logoff;
allowall;
}
}
}
Linux下配置
#Nginx所用用户和组,windows下不指定user www www;
#指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍)
worker_processes 8;
#指定文件描述符数量
worker_rlimit_nofile 51200;
#指定pid存放的路径
pid logs/nginx.pid;
#指定错误日志存放的路径和级别,可选debug|info|notice|warn|error|crit
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
events {
#使用的网络I/O模型,Windows下不用配置
use epoll;
#允许的连接数
worker_connections
51200;
}
http {
include mime.types;
default_type application/octet-stream;
#设置使用的字符集
#隐藏nginx的版本号
server_tokens off;
#自定义日志格式
log_format main '$remote_addr - $remote_user[$time_local] "$request" '
'$status $body_bytes_sent"$http_referer" '
'upstream_response_time$upstream_response_time
$upstream_addr'
'"$http_user_agent""$http_x_forwarded_for"';
#access_log logs/access.log combined;
#access日志存放路径和格式
access_log logs/access.log main;
#提升文件传输性能
sendfile
on;
#tcp_nopush
on;
#设置客户端能够请求的单个文件大小
client_max_body_size 300m;
keepalive_timeout
75;
#proxy参数
#跟后端服务器连接的超时时间,发起握手等候响应超时时间
proxy_connect_timeout 5;
#连接成功后,等候后端服务器的响应时间
proxy_read_timeout 600;
#后端服务器数据回传时间
proxy_send_timeout 600;
#代理请求缓存区
proxy_buffer_size 16k;
#同上,告诉nginx保存单个用的几个buffer、最大用多空间
proxy_buffers 4 64k;
#如果系统很忙时可以申请更大的proxy_buffers,官方推荐*2
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#开启压缩功能
gzip on;
gzip_min_length1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
#压缩级别从低到高1-9
gzip_types text/plainapplication/x-javascript text/css application/xml;
gzip_vary on;
#开启gzip压缩功能
#设置负载均衡池,此处是测试环境中的5个Tomcat的IP地址和端口号。
upstream tomcat_pool {
server10.0.5.43:8801;
server 10.0.5.43:8802;
server 10.0.5.43:8803;
server 10.0.5.43:8804;
server 10.0.5.43:8805;
}
#server设置
server {
#监听的IP和端口
listen
10.0.5.43:80;
#主机名称
server_name
10.0.5.43;
#设置字符集
charsetoff;
#access_log logs/host.access.log main;
location / {
#HTML网页文件存放的目录
#root
/var/www/html;
#默认首页文件
#index
index.jsp index.html index.htm default.jspindex.do default.do;
proxy_pass http://tomcat_pool;
proxy_redirect off;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
}
#访问控制
allowall;
#设置客户端浏览器缓存时间
location ~ \.(gif|jpg|jpeg|png|bmp)$ {
#对很少修改的文件开启expires,设置客户端浏览器缓存时间
expires1h;
#如果找不到图片,需要考虑root或proxypass
}
#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;
#}
#开启nginx监控页面
location/nginx_status{
stub_statuson;
access_logoff;
allowall;
}
}
}
Tomcat配置
基本配置
Windows下配置
对于tomcat大家都很熟悉,只需要修改server.xml配置文件即可,这里我们以apache-tomcat-6.0.14为例,分别在server目录,解压缩并命名为:apache-tomcat-6.0.14_1、apache-tomcat-6.0.14_2。第一处端口修改:Xml代码
<!-- 修改port端口:18005, 5个tomcat不能重复,端口随意,别太小。本文测试中的5个tomcat设置分别为:18005,18006,18007,18008,18009-->
<Server port="18005" shutdown="SHUTDOWN">
第二处端口修改:xml代码
<!-- port="18081" tomcat监听端口,随意设置,别太小 本文档中,5个tomcat分别设置为:8801-8443;8802-8444;8803-8445;8804-8446;8805-8447.-->
<Connector port="8801" protocol="HTTP/1.1"
maxThreads="1500"
maxSpareThreads="500"
minSpareThreads="100"
acceptCount="1000"
enableLookups="false"
connectionTimeout="20000"
redirectPort="8443" />
第三处端口修改:XML代码
<!-- 本文档中,5个tomcat分别设置为:8005-8443;8006-8444;8007-8445;8008-8446;8009-8447.-->
<Connector port="8005" protocol="AJP/1.3" redirectPort="8443" />
Engine元素增加jvmRoute属性:xml代码
<!-- 本文档中,5个tomcat分别设置为:node1,node2,node3,node4,node5.-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">
Linux下配置
Tomcat在linux的基本配置与Windows环境下一致。此处不再重复。集群配置
Windows下配置
Tomcat集群配置主要是在conf目录下的server.xml中添加一下代码:<ClusterclassName="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">
<--此处可以不做修改,Tomcat集群的默认组播地址就是228.0.0.4,默认端口为:45564-->
<MembershipclassName="org.apache.catalina.tribes.membership.McastService" address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<--此处需要根据需要进行修改,address为Tomcat所在主机的IP地址,port为接收组播消息的端口,默认为4000到5000,可以在该范围内随意设置。确保集群内端口号唯一即可。-->
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver" address="10.0.5.43"
port="4001"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"filter=""/>
<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
最后,在需要进行session共享的应用中WEB-INF目录下的web.xml中添加<distributable/>属性。否则将不会实现Tomcat集群应用中的session数据共享。
上述代码的详细说明:
1、Cluster
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
1)Tomcat集群主元素,在这个元素里面可以配置集群的所有详细信息
2)className主要的集群类,当前只提供了org.apache.catalina.ha.tcp.SimpleTcpCluste作为实现类
3)channelSendOptionssession发送方式,默认值是8,这个标识确定通过SimpleTcpCluste如何发送消息
4)Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004
Channel.SEND_OPTIONS_ASYNCHRONOUS= 0x0008
Channel.SEND_OPTIONS_USE_ACK= 0x0002
如果使用(ASYNCHRONOUS)加(USE_ACK)方式来发送消息,那么值应该是10(8+2)或者0x000B
如果使用(SYNCHRONIZED_ACK)加(USE_ACK)方式来发送消息,那么值应该是6(4+2)或者0x0006
2、Manager
<ManagerclassName="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
1)管理tomcat之间的session复制
2)className当前有两个实现类:org.apache.catalina.ha.session.DeltaManager和org.apache.catalina.ha.session.BackupManager
3)DeltaManager复制并发送Session数据到集群下所有的节点,这个实现类被证明非常可靠、运行得非常好。不过有个局限性就是集群的节点类型要相同,而且要部署相同的应用程序
4)expireSessionsOnShutdown当一个web程序被结束时,tomcat分发销毁命令到每个Session,并通知所有session listener执行。当集群下某个节点被停止时,如果想销毁所有节点下的的Session,设置为true,默认为false
5)notifyListenersOnReplication如果设置为true,当session属性被复制和移动的时候,session listener被通知
3、Channel
<ChannelclassName="org.apache.catalina.tribes.group.GroupChannel">
Channel是Apache Tribes的主组件,channel管理一组子组件,并和它们一起组成了tomcat实例间的通讯框架。在tomcat集群中,DeltaManager通过SimpleTcpCluster调用channel来实现信息传递,而BackupManager自己调用channel以及子组件这些组件来实现信息传递。ReplicatedContext也会调用channel传递context属性。
4、Membership
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
MemberShip组件自动检索发现集群里的新节点或已经停止工作的节点,并发出相应的通知。默认使用组播(Multicast)实现。
5、Receiver
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
负责监听接收其他节点传送过来的数据。默认使用non-blocking TCP Server sockets。
6、Sender
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
管理从一个节点发送到另外一个节点的出站连接和数据信息,允许信息并行发送。默认使用TCP Client Sockets。
7、Interceptor
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
Channel通过Interceptor堆栈进行消息传递,在这里可以自定义消息的发送和接收方式,甚至MemberShip的处理方式。
8、Value
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
1)Value在调用Http Request 链中起着拦截器的作用,用来决定什么情况下数据需要被复制。
org.apache.catalina.ha.tcp.ReplicationValve,ReplicationValue在Http Request结尾判断当前数据是否需要被复制。
2)Filter内容为url或者文件结尾,当访问链接配置filter时,不论实际session有没有改变,集群会认为session没有任何变化,从而不会复制和发送改变的session属性。
9、Deployer
<DeployerclassName="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
使集群支持farmed deployment
10、ClusterListener
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
Clusterlistener用来追踪信息发送和接收。
ClusterSessionListener用来监听集群组件接收信息,当使用DeltaManager的时候,信息被集群接收,并通过ClusterSessionListener传递给Session Manager。
Linux下配置
Linux环境下的Tomcat集群配置同Windows环境下基本一致。此处不再重复。验证配置与测试负载均衡
首先测试Nginx配置是否正确,测试命令:nginx-t (默认验证:conf\nginx.conf),也可以指定配置文件路径。此例Nginx安装目录:D:\Servers\nginx-1.5.3,dos环境下图画面成功示例:
其次验证tomcat,启动两个tomcat,不出现端口冲突即为成功(tomcat依赖的java环境就废话不说了)。
至此,说明Tomcat已经可以正常启动了。现在在Tomcat下webapps中的ROOT应用中添加两个jsp页面:test.jsp和test2.jsp。然后重启Tomcat.
Test.jsp代码如下:
<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>应用集群测试---session共享</title>
</head>
<body>
<center><b>服务器信息</b></center><hr/>
<%
out.println("实际访问地址:"+request.getLocalAddr() + " :"
+request.getLocalPort()+"<br>");
%>
<hr/>
<%
out.println("<br> SessionID: " + session.getId()+"<br><hr/>");
//
如果有新的 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><hr/>");
out.println("<tableborder=\"1\"><tr><td width=\"200\">属性名称</td><tdwidth=\"300\">属性值</td></tr>");
System.out.println("============================");
Enumeration<String> e =session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println("<tr><td>" +name+"</td><td>" +value+ "</td></tr>");
System.out.println( name + " = "+ value);
}
out.println("</table>");
%>
<hr/>
<div>
<form action="test2.jsp"method="POST">
<b>属性名称:</b><input type=text size=25name="dataName">  
<b>属性赋值:</b><input type=text size=25name="dataValue">
<input type=submit value="设置属性">
</form>
</div>
</body>
</html>
Test2.jsp代码如下:
<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%
Stringpath = request.getContextPath();
StringbasePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>应用集群测试---session共享</title>
</head>
<body>
<%
String dataName =request.getParameter("dataName");
if (dataName != null &&dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName,dataValue);
response.sendRedirect("test.jsp");
}
%>
</body>
</html>
在启动Nginx和5个Tomcat服务器之后,访问:http://10.0.5.43/test.jsp。如果出现如下界面说明测试成功:
此时刷新页面将会发现如下界面:
我们回发现实际访问的地址是发生了变化:由10.0.5.43:8801变成了:10.0.5.43:8802。SessionID除了后面的node1变成node2,具体的sessionID没有发生变化。同时,如果在下面的表单中添加session的属性名和属性值,会发现session值会在5个Tomcat中实现共享。
至此基于Nginx+Tomcat集群的session共享的配置和校验测试结束。
相关文章推荐
- 单点登录 Tomcat7集群共享Session 基于redis实现统一管理
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- windows下nginx+tomcat集群,实现session复制共享
- Nginx+Tomcat+Memcached 实现集群部署时Session共享
- nginx+tomcat集群负载均衡(实现session复制)
- Nginx+Tomcat+Memcached实现tomcat集群和session共享
- tomcat使用memcached完成集群(session共享实现方式)
- Nginx+Tomcat+Memcached 实现集群部署时Session共享
- tomcat使用memcached完成集群(session共享实现方式)
- 通过memcached来实现对tomcat集群中Session的共享策略
- nginx+tomcat集群负载均衡实现session复制
- 通过memcached来实现对tomcat集群中Session的共享策略
- Apache + tomcat实现高并发负载均衡方案(四)----实现session共享(memcache)的集群
- tomcat集群添加msm实现session共享
- 部署tomcat负载均衡集群,实现节点之间内存中的Session共享。
- Memcache 实现tomcat集群session共享
- nginx+tomcat集群负载均衡(实现session复制)
- Apache+tomcat实现负载均衡集群和session共享、tengine+tomcat实现web动静分离