最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于Nginx+Tomcat集群的Session共享

来源:动视网 责编:小OO 时间:2025-10-02 10:34:32
文档

基于Nginx+Tomcat集群的Session共享

基于Nginx+Tomcat集群实现Session共享测试环境本文档测试环境是在Windows7环境下;Nginx1.5.3-forWindows;3个Tomcat7,部署在同一个Windows环境下。Java环境:JDK1.7Nginx安装Nginx介绍Nginx(发音同enginex)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页伺服器中表
推荐度:
导读基于Nginx+Tomcat集群实现Session共享测试环境本文档测试环境是在Windows7环境下;Nginx1.5.3-forWindows;3个Tomcat7,部署在同一个Windows环境下。Java环境:JDK1.7Nginx安装Nginx介绍Nginx(发音同enginex)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页伺服器中表
基于Nginx+Tomcat集群实现Session共享

测试环境

本文档测试环境是在Windows7环境下;Nginx1.5.3-forWindows;3个Tomcat7,部署在同一个Windows环境下。Java环境:JDK1.7

Nginx安装

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 xvfz apache-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 {

includemime.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 k;

#如果系统很忙时可以申请更大的proxy_buffers,官方推荐*2

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;

#开启压缩功能

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1; 

gzip_comp_level 2;

#压缩级别从低到高1-9

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

#开启gzip压缩功能

#设置负载均衡池,此处是测试环境中的5个Tomcat的IP地址和端口号。

upstreamtomcat_pool {

server 10.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;

#设置字符集

charset off;

        #access_log  logs/host.access.log  main;

location / {

        #HTML网页文件存放的目录

#root   /var/www/html;

#默认首页文件

#index  index.jsp index.html index.htm default.jsp index.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; 

        } 

#访问控制

        allow all;

#设置客户端浏览器缓存时间

location ~ \\.(gif|jpg|jpeg|png|bmp)$  {

#对很少修改的文件开启expires,设置客户端浏览器缓存时间

expires 1h;

#如果找不到图片,需要考虑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_indexindex.php;

        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

        #    includefastcgi_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_status on;

            access_log off;

            allow all;

        }

  }

}

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下不用配置

useepoll;

#允许的连接数

worker_connections  51200;

}

http {

includemime.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 k;

#如果系统很忙时可以申请更大的proxy_buffers,官方推荐*2

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;

#开启压缩功能

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1; 

gzip_comp_level 2;

#压缩级别从低到高1-9

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

#开启gzip压缩功能

#设置负载均衡池,此处是测试环境中的5个Tomcat的IP地址和端口号。

upstreamtomcat_pool {

server 10.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;

#设置字符集

charset off;

        #access_log  logs/host.access.log  main;

location / {

        #HTML网页文件存放的目录

#root   /var/www/html;

#默认首页文件

#index  index.jsp index.html index.htm default.jsp index.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; 

        } 

#访问控制

        allow all;

#设置客户端浏览器缓存时间

location ~ \\.(gif|jpg|jpeg|png|bmp)$  {

#对很少修改的文件开启expires,设置客户端浏览器缓存时间

expires 1h;

#如果找不到图片,需要考虑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_indexindex.php;

        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

        #    includefastcgi_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_status on;

            access_log off;

            allow all;

        }

  }

}

Tomcat配置

基本配置

Windows下配置

对于tomcat大家都很熟悉,只需要修改server.xml配置文件即可,这里我们以apache-tomcat-6.0.14为例,分别在server目录,解压缩并命名为:apache-tomcat-6.0.14_1、apache-tomcat-6.0.14_2。

第一处端口修改:Xml代码 

  

  

第二处端口修改:xml代码 

  

maxThreads="1500"

maxSpareThreads="500" 

minSpareThreads="100"

acceptCount="1000"

enableLookups="false" 

connectionTimeout="20000"

redirectPort="8443" />

第三处端口修改:XML代码

  

Engine元素增加jvmRoute属性:xml代码  

  

  

Linux下配置

Tomcat在linux的基本配置与Windows环境下一致。此处不再重复。

集群配置

Windows下配置

Tomcat集群配置主要是在conf目录下的server.xml中添加一下代码:

    notifyListenersOnReplication="true"/>

    

<--此处可以不做修改,Tomcat集群的默认组播地址就是228.0.0.4,默认端口为:455-->    

port="455"

frequency="500" 

dropTime="3000"/>

<--此处需要根据需要进行修改,address为Tomcat所在主机的IP地址,port为接收组播消息的端口,默认为4000到5000,可以在该范围内随意设置。确保集群内端口号唯一即可。-->    

            port="4001" 

        autoBind="100" 

        selectorTimeout="5000" 

        maxThreads="6"/>

    

        

    

    

    

    

    

    

    

                    tempDir="/tmp/war-temp/" 

                deployDir="/tmp/war-deploy/" 

                watchDir="/tmp/war-listen/" 

             watchEnabled="false"/>

    

    

最后,在需要进行session共享的应用中WEB-INF目录下的web.xml中添加属性。否则将不会实现Tomcat集群应用中的session数据共享。

上述代码的详细说明:

1、Cluster 

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 

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 

Channel是Apache Tribes的主组件,channel管理一组子组件,并和它们一起组成了tomcat实例间的通讯框架。在tomcat集群中,DeltaManager通过SimpleTcpCluster调用channel来实现信息传递,而BackupManager自己调用channel以及子组件这些组件来实现信息传递。ReplicatedContext也会调用channel传递context属性。

4、Membership 

address="228.0.0.4" 

port="455" 

frequency="500" 

dropTime="3000"/>

MemberShip组件自动检索发现集群里的新节点或已经停止工作的节点,并发出相应的通知。默认使用组播(Multicast)实现。

5、Receiver 

address="auto" 

port="5000" 

selectorTimeout="100" 

maxThreads="6"/>

负责监听接收其他节点传送过来的数据。默认使用non-blocking TCP Server sockets。

6、Sender 

管理从一个节点发送到另外一个节点的出站连接和数据信息,允许信息并行发送。默认使用TCP Client Sockets。

7、Interceptor 

Channel通过Interceptor堆栈进行消息传递,在这里可以自定义消息的发送和接收方式,甚至MemberShip的处理方式。

8、Value 

1)Value在调用Http Request 链中起着的作用,用来决定什么情况下数据需要被复制。

org.apache.catalina.ha.tcp.ReplicationValve,ReplicationValue在Http Request结尾判断当前数据是否需要被复制。

2)Filter内容为url或者文件结尾,当访问链接配置filter时,不论实际session有没有改变,集群会认为session没有任何变化,从而不会复制和发送改变的session属性。

9、Deployer

tempDir="/tmp/war-temp/" 

deployDir="/tmp/war-deploy/" 

watchDir="/tmp/war-listen/" 

watchEnabled="false"/>

使集群支持farmed deployment 

10、ClusterListener

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+"/";

%>

应用集群测试---session共享

服务器信息

<%

    out.println("实际访问地址:"+request.getLocalAddr() + " : "

+ request.getLocalPort()+"
");

%>


<%

out.println("
Session ID: " + session.getId()+"


");

  // 如果有新的 Session 属性设置

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

if (dataName != null &&dataName.length() > 0) {

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

session.setAttribute(dataName, dataValue);

  }

out.println("Session 列表


");

out.println("

");

System.out.println("============================");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

     String name = (String)e.nextElement();

     String value = session.getAttribute(name).toString();

out.println("

");

System.out.println( name + " = " + value);

   }

out.println("

属性名称属性值
" +name+ "" +value+ "
");

%>


    

         属性名称:    

         属性赋值:       

        

    

Test2.jsp代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

应用集群测试---session共享

    

<%

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

if (dataName != null &&dataName.length() > 0) {

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

session.setAttribute(dataName, dataValue);

    response.sendRedirect("test.jsp");

  } 

%>

在启动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共享的配置和校验测试结束。

文档

基于Nginx+Tomcat集群的Session共享

基于Nginx+Tomcat集群实现Session共享测试环境本文档测试环境是在Windows7环境下;Nginx1.5.3-forWindows;3个Tomcat7,部署在同一个Windows环境下。Java环境:JDK1.7Nginx安装Nginx介绍Nginx(发音同enginex)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页伺服器中表
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top