nginx整合tomcat集群并做session共享----测试案例

时间:2022-09-09 10:15:18

最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘。---------菜鸡的自我修炼。

说明:博主采用一个web项目同时部署到两台tomcat下,(tomcat-A,tomca-B),使用nginx做反向代理,按照设置的权值,将请求分发到后台的tomcatA/tomcatB,并且实现session共享。

配置好本地域名指向:修改host文件:添加 127.0.0.1  www.domain.com.cn

新建项目:tiny-demo-operation 采用springmvc 配置好springmvc.xml配置文件

建立SessionShareSetController和SessionShareGetController

目录如下:

nginx整合tomcat集群并做session共享----测试案例

SessionShareSetController代码:

 package com.tiny.session.share.controller;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
@RequestMapping("/sessionShare")
public class SessionShareSetController { @RequestMapping("/sessionSet")
public String sessionSet(HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpSession session = request.getSession();
String name = "tinyseven-demo-operation"+"---";
String remote = request.getRemoteHost() + "---"
+ request.getRemoteAddr() + "---" + request.getRemotePort()
+ "---";
String local = request.getLocalName() + "---" + request.getLocalAddr()
+ "---" + request.getLocalPort() + "---";
String server = request.getServerName() + "---"
+ request.getServerPort() + "---";
request.setAttribute("name", name);
request.setAttribute("remote", remote);
request.setAttribute("local", local);
request.setAttribute("server", server); session.setAttribute("name", name);
return "sessionshare/sessionSet";
} }

SessionShareGetController代码:

 package com.tiny.session.share.controller;

 import javax.servlet.http.HttpServletRequest;

 import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
@RequestMapping("/sessionShare")
public class SessionShareGetController { @RequestMapping("/sessionGet")
public String sessionGet(HttpServletRequest request) throws Exception { String name = (String) request.getSession().getAttribute("name")
+ "---";
String remote = request.getRemoteHost() + "---"
+ request.getRemoteAddr() + "---" + request.getRemotePort()
+ "---";
String local = request.getLocalName() + "---" + request.getLocalAddr()
+ "---" + request.getLocalPort() + "---";
String server = request.getServerName() + "---"
+ request.getServerPort() + "---";
request.setAttribute("name", name);
request.setAttribute("remote", remote);
request.setAttribute("local", local);
request.setAttribute("server", server);
return "sessionshare/sessionGet"; }
}

新建jsp页面:

目录如下:

nginx整合tomcat集群并做session共享----测试案例

sessionSet.jsp部分代码:

<body>
当前用户设置session--server-->>${server}</br>
当前用户设置session--remote-->>${remote}</br>
当前用户设置session--local-->>${local}</br>
当前用户设置session--name-->>${name}</br>
</body>

sessionGet.jsp部分代码:

 <body>
当前用户请求的server-->>${server}</br>
当前用户请求的remote-->>${remote}</br>
当前用户请求的local-->>${local}</br>
当前用户请求的name-->>${name}</br>
</body>

一、准备两台tomcat,建立起tomcat集群。

博主使用 apache-tomcat-6.0.37

路径分别为:E:\Server\apache-tomcat-6.0.37-node-A

E:\Server\apache-tomcat-6.0.37-node-B

分别修改A/B的server.xml保证两台tomcat可以正常启动,避免端口冲突,并且建立起两台tomcat的集群。

1.修改A的server.xml,在所有port前面加1,例如(<Server port="8005" shutdown="SHUTDOWN">修改成<Server port="18005" shutdown="SHUTDOWN">其他类似)

修改<Engine name="Catalina" defaultHost="localhost" >为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

2.修改B的server.xml,在所有port前面加2,例如(<Server port="8005" shutdown="SHUTDOWN">修改成<Server port="28005" shutdown="SHUTDOWN">其他类似)

修改<Engine name="Catalina" defaultHost="localhost" >为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

此时两台tomcat应该都可以成功启动了。

3.建立起两台tomcat的集群服务。

分别取消掉A/B server.xml文件中

<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->

的注释。

重新启动A、B tomcat(运行bin中的startup.bat)发现这次启动比上次多了以下信息,表示两个tomcat节点已经建立起了关联。

nginx整合tomcat集群并做session共享----测试案例

二、发布项目到tomcatA、tomcatB下,并且配置session共享。

1.修改tomcaA、tomcatB的server.xml文件。

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

<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->

<!-- Access log processes all example.
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
-->
<Context docBase="E:\javaWorkspace\tiny-demo-operation\WebRoot" reloadable="true" path="/tiny-demo-operation" crossContext="true" source="org.eclipse.jst.jee.server:tiny-demo-operation"/> 此处为添加内容

</Host>

2、修改所发布项目的web.xml文件

在web.xml文件的</web-app>之前添加

<!-- session共享配置 -->
<distributable />

此时当前项目在两台tomcat可以做到session共享了,效果如下:

访问tomcatA下的项目,设置session:

nginx整合tomcat集群并做session共享----测试案例

访问tomcatB下的项目,获取session:

nginx整合tomcat集群并做session共享----测试案例

三、整合nginx,实现请求分发。此处使用的是nginx1.5.0版本

1.修改nginx.conf  修改后

 #Nginx所用用户和组,window下不指定
#user niumd niumd;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU) worker_processes 2; #错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice; error_log logs/error.log info; #指定pid存放文件 pid logs/nginx.pid; events {
#使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
#use epoll;
#允许最大连接数
worker_connections 2048;
} http { include mime.types;
default_type application/octet-stream;
#定义日志格式
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log off;
access_log logs/access.log;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 75 20;
include gzip.conf;
include proxy.conf; upstream localhost {
#根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。
#同一机器在多网情况下,路由切换,ip可能不同
#ip_hash;
#weigth参数表示权值,权值越高被分配到的几率越大
server localhost:18080 weight=5;
server localhost:28080 weight=5; } server { listen 80;
server_name localhost; location / {
root E:/javaWorkspace/tiny-demo-operation/WebRoot;
index index.html index.htm; } location ~ \.(html|js|css|png|gif)$ {
root E:/javaWorkspace/tiny-demo-operation/WebRoot;
} location ~ \.(jsp|action)$ {
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://localhost;
}
}
}

2.重新启动nginx

访问虚拟主机下的当前项目,nginx自动实现请求分发,效果如下:

分发到tomcatB下的tiny-demo-operation,设置session中的属性值name。

nginx整合tomcat集群并做session共享----测试案例

分发tomcatA下的tiny-demo-operation,获取session中的属性值name。

nginx整合tomcat集群并做session共享----测试案例

至此,简单实现了nginx整合tomcat集群,实现负载均衡,session共享的测试案例。


-END-

nginx整合tomcat集群并做session共享----测试案例

nginx整合tomcat集群并做session共享----测试案例的更多相关文章

  1. Tomcat集群环境下session共享方案 通过memcached 方法实现

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  2. nginx负载均衡集群中的session共享说明

    在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...

  3. 用redis实现TOMCAT集群下的session共享

    上篇实现了 LINUX中NGINX反向代理下的TOMCAT集群(http://www.cnblogs.com/yuanjava/p/6850764.html) 这次我们在上篇的基础上实现session ...

  4. nginx&plus;tomcat集群&plus;redis&lpar;memcache&rpar;session共享!

    常用保持session的方式: 1.一些代理(比如nginxIP_hash) 1.使用数据库来存储Session 2.使用Cookie来存储Session                       ...

  5. Tomcat 集群中 实现session 共享的三种方法

    前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持 ...

  6. Nginx&plus;tomcat集群中,session的共享

    nginx,tomcat集群后多个session分配到同一个应用 单节点低负荷的情况下,我们通常把一个WEB应用打成WAR包放WEB应用服务器,如TOMCAT下运行就行了(如图1).但随着用户量的增加 ...

  7. 【nginx&plus;tomcat集群】Nginx1&period;12&period;2&plus;Tomcat7集群&plus;负载均衡&plus;Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  8. Nginx&plus;Tomcat&plus;Memcached 实现集群部署时Session共享

    Nginx+Tomcat+Memcached 实现集群部署时Session共享 一.简介 我们系统经常要保存用户登录信息,有Cookie和Session机制,Cookie客户端保存用户信息,Sessi ...

  9. Nginx&plus;Memcached&plus;Tomcat集群配置&lpar;MSM--win7 64bit&rpar;

    本次主要是在win7 64 上演示操作. web应用构建 Memcached安装配置启动 Tomcat配置 所需jar包 memcached-session-manager 序列化 contextxm ...

随机推荐

  1. 绘制图形与3D增强技巧&lpar;一&rpar;----点图元

    1.图元 1.点图元 glBegin(GL_POINTS); glend(); 程序:点图元的应用 #include "stdafx.h" #include<stdio.h& ...

  2. F2工作流引擎之 概述&lpar;一&rpar;

    简介 工作流应该算是基础框架软件,主要用于流程的重组和优化,它有广阔的应用领域.在java下有很多优秀的开源工作流可以选择比如activit5.jpbm4等,在.net下却几乎找不到令人满意的工作流引 ...

  3. simulate windows touch input

    更多信息请参考页面http://social.technet.microsoft.com/wiki/contents/articles/6460.simulating-touch-input-in-w ...

  4. 【题解】【直方图】【Leetcode】Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  5. codeforces 547B&period; Mike and Feet 单调栈

    题目链接 用单调栈计算出一个数字, 左边第一个比他小的数字的位置, 右边比第一个他小的数字的位置, 然后len = r[i] - l[i] +1. ans[len] = max(ans[len], a ...

  6. malloc、calloc、realloc三者的差别

    1.malloc 作用:分配内存块 原型:void *malloc(size_t size);size表示要分配的字节数 返回值:返回一个指向所分配空间的void指针,假设没有足够的内存可用,则返回N ...

  7. 开源OCR光学字符识别

    纸张在 许多地方已日益失宠,无纸化办公谈论40多年,办公环境正限制纸山的生成.而过去几年,无纸化办公的概念发生了显着的转变.在计算机软件的帮助 下,包含大量重要管理数据和资讯的文档可以更方便的以电子形 ...

  8. Aleta病毒

    文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份!!! 文件一定要及时备份 ...

  9. Linux入门:增加用户,并赋予权限

    一.增加用户 1.增加用户,并指定主目录 # useradd –d /usr/sam -m sam此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/us ...

  10. Idea快捷键和使用技巧【未完】

    参考1:点击跳转 参考2:点击跳转2 整合后的如下所示: