nginx+tomcat7(8) 集群,负载均衡和session共享
2016-04-12 15:21
756 查看
参考文档:centos7上安装tomcat7
参考文档:nginx+tomcat7的集群
CentOS7 下面通过keepalived 配置nginx 主从方式的双机热备配置,看这个博文
安装ntp
如果要安装tomcat8 可以通过 这个文档的方法来通过tar.gz文件来安装
centos7 安装tomcat8的方法
index.jsp文件如下
配置tomcat的server.xml (vim /usr/share/tomcat/conf/server.xml),
增加如下代码,位于host 部分
使得tomcat 的根访问是 指向ClusterTest这个目录
http://192.168.1.215:8080/
http://192.168.1.216:8080/
访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。这个时候如果关闭对应的tomcat服务,就会自动切换到另外一台上。
b.测试负载均衡
访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。但是多次刷新后,一直显示的是同一台tomcat服务。说明负载均衡没有实现。解决的办法是把upstream里面的 ip_hash 这个给屏蔽掉。就会自动切换了。
利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
利用memcached把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。
我们这里采用第三种方法
https://github.com/magro/memcached-session-manager
安装手册:
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration#add-memcached-session-manager-jars-to-tomcat
MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session)。我用到的是non-sticky session
因为我是用的Tomcat 7.0.54 ,所以按照操作手册下载多个jar文件放入 $CATALINA_HOME\lib目录下:
由于版本的问题,这里整理了能够配合Tomcat7.0.54使用的memcashed-session-manager的所有需要的jar文件。
下载tomcat7 用的jar包
下载tomcat 8 用的jar包
这里的memcachedNodes节点中的n1为节点的别名,可以随意起。后面的IP必须是memcached所在的主机的IP地址,端口必须是之前配置的11211端口。
该代码段在网上发现其他人说也可以放到Server.xml下面,这里本人没有尝试。
此时,所有的tomcat子节点中都要加上上面的这段代码,每个tomcat里面的内容都是相同的上述内容,无需做任何修改。
sticky=”false” #非黏性设置,默认为黏性
memcachedNodes #配置memcached节点
failoverNodes #默认为空,如果这里指定memcached冗余节点的话,sticky一定要为true,否则会报错
requestUriIgnorePattern #忽略session的正则表达式
sessionBackupAsync #指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout
sessionBackupTimeout #设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒
transcoderFactoryClass #默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。
customConverter #可选项,自定义转换器允许您提供应用程序特定类型的自定义序列化。多个自定义转换器类名称指定逗号隔开(可选空间逗号后)。转换器类必须在类路径中可用的web应用程序(WEB-INF/lib中),在这里可以不设置。
至此为止,有关memcache的Session共享已经完全配置完成.
具体的启动顺序,首先要把memcached的服务启动,然后是nginx服务,最后启动tomcat所在的每个子节点的服务。
访问nginx服务器http://192.168.1.217/sessiontest.jsp
查看结果
比较上面2个图的红框部分。可以发现 在2个tomcat的服务器之间切换,但是sessionID不变,并且session里面的内容也不变。说明session共享成功。
参考文档:nginx+tomcat7的集群
1.环境准备和配置
服务器 | ip | 操作系统 | 备注 |
---|---|---|---|
tomcat-001 | 192.168.1.215 | Centos7 | |
tomcat-001 | 192.168.1.216 | Centos7 | |
nginx-001 | 192.168.1.217 | Centos7 | |
nginx-002 | 192.168.1.218 | Centos7 |
2.安装Centos7
安装操作系统安装ntp
3.安装tomcat7
通过yum 安装 tomcat7如果要安装tomcat8 可以通过 这个文档的方法来通过tar.gz文件来安装
centos7 安装tomcat8的方法
4.安装nginx
通过yum 安装 nginx5.安装tomcat 测试程序(nginx动静分离和tomcat集群)
增加一个ClusterTest.war 文件 放入到 /usr/share/tomcat/webapps目录下。index.jsp文件如下
<%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA </font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("abc","abc"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
配置tomcat的server.xml (vim /usr/share/tomcat/conf/server.xml),
增加如下代码,位于host 部分
<Context path="" reloadable="true" docBase="/usr/share/tomcat/webapps/ClusterTest"/>
使得tomcat 的根访问是 指向ClusterTest这个目录
http://192.168.1.215:8080/
http://192.168.1.216:8080/
- 6.配置nginx,实现tomcat负载均衡
vim /etc/nginx/nginx.conf#修改events的块内容 events { use epoll; worker_connections 2048; } #在http块里面增加如下内容 #开启zip网页压缩 gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css application/xml; #反向代理 ## meerkat_web upstream meerkat_web { #ip_hash; #要实现负载均衡,不能使用ip_hash,否则在正常的情况下,不会自动切换tomcat,只有在某个tomcat奔溃以后才会切换到另外一台 server 192.168.1.215:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.1.216:8080 weight=2 max_fails=2 fail_timeout=30s; } # 在server块里面的location部分替换成如下内容 location / { root html; index index.html index.htm index.jsp; proxy_pass http://meerkat_web; proxy_set_header Host $http_host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 100m; }
- 7.测试
a.测试自动切换访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。这个时候如果关闭对应的tomcat服务,就会自动切换到另外一台上。
b.测试负载均衡
访问http://192.168.1.217/ 代表的nginx服务器,会出现index.jsp显示的效果。但是多次刷新后,一直显示的是同一台tomcat服务。说明负载均衡没有实现。解决的办法是把upstream里面的 ip_hash 这个给屏蔽掉。就会自动切换了。
- 8.实现Session共享的几种方法
使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
利用memcached把多个tomcat的session集中管理,前端在利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。
我们这里采用第三种方法
- 9.在2台tomcat节点上安装memcached
a. yum 安装memcachedyum -y install memcached vim /etc/sysconfig/memcached //重启,启动,开机启动,状态,关闭 systemctl restart memcached systemctl start memcached systemctl enable memcached systemctl status memcached systemctl stop memcached memcached-tool 127.0.0.1:11211 stats
- 10. 在2台tomcat节点上安装和使用memcached-session-manager
官网:https://github.com/magro/memcached-session-manager
安装手册:
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration#add-memcached-session-manager-jars-to-tomcat
MSM支持两种模式:sticky sessions(粘性session)和non-sticky sessions(非粘性session)。我用到的是non-sticky session
因为我是用的Tomcat 7.0.54 ,所以按照操作手册下载多个jar文件放入 $CATALINA_HOME\lib目录下:
由于版本的问题,这里整理了能够配合Tomcat7.0.54使用的memcashed-session-manager的所有需要的jar文件。
下载tomcat7 用的jar包
下载tomcat 8 用的jar包
- 11. tomcat中配置memcached-session-manager
修改tomcat的context.xml增加如下内容:<Context> ... <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" sticky="false" memcachedNodes="n1:192.168.1.215:11211 n2:192.168.1.216:11211" failoverNodes="" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico)$" sessionBackupAsync="false" sessionBackupTimeout="500" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>
这里的memcachedNodes节点中的n1为节点的别名,可以随意起。后面的IP必须是memcached所在的主机的IP地址,端口必须是之前配置的11211端口。
该代码段在网上发现其他人说也可以放到Server.xml下面,这里本人没有尝试。
此时,所有的tomcat子节点中都要加上上面的这段代码,每个tomcat里面的内容都是相同的上述内容,无需做任何修改。
sticky=”false” #非黏性设置,默认为黏性
memcachedNodes #配置memcached节点
failoverNodes #默认为空,如果这里指定memcached冗余节点的话,sticky一定要为true,否则会报错
requestUriIgnorePattern #忽略session的正则表达式
sessionBackupAsync #指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout
sessionBackupTimeout #设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync=”false”是起作用。默认100毫秒
transcoderFactoryClass #默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。
customConverter #可选项,自定义转换器允许您提供应用程序特定类型的自定义序列化。多个自定义转换器类名称指定逗号隔开(可选空间逗号后)。转换器类必须在类路径中可用的web应用程序(WEB-INF/lib中),在这里可以不设置。
至此为止,有关memcache的Session共享已经完全配置完成.
具体的启动顺序,首先要把memcached的服务启动,然后是nginx服务,最后启动tomcat所在的每个子节点的服务。
- 12. 测试session复制,共享功能是否成功
在/usr/share/tomcat/webapps/ClusterTest目录下增加sessiontest.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ClusterApp Test</title> </head> <body> <% out.println("Server Info=" + request.getLocalAddr() + " : " + request.getLocalPort() + "<br>"); out.println("Session ID=" + session.getId() + "<br>"); %> <% 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>"); System.out.println("Session列表"); 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="sessiontest.jsp" method="POST"> 名称:<input type=text size=20 name="dataName"> <br/> 值:<input type=text size=20 name="dataValue"> <br/> <input type=submit text="提交"> </form> </body> </html>
访问nginx服务器http://192.168.1.217/sessiontest.jsp
查看结果
比较上面2个图的红框部分。可以发现 在2个tomcat的服务器之间切换,但是sessionID不变,并且session里面的内容也不变。说明session共享成功。
相关文章推荐
- CentOS6.6从头到尾部署nginx与tomcat多实例
- Eclipse下设置tomcat,修改Java代码不必重启tomcat
- 启动tomcat 服务报 The file is absent or does not have execute permission
- JDK/Tomcat/Eclispe配置
- myeclipse中tomcat内存大小的设置
- tomcat的daemon安装方式
- eclipse中配置Tomcat并启动服务器发布项目
- Tomcat7中javax.el.ELException异常信息的处理
- Tomcat使用介绍
- tomcat 日志文件catalina.out日志切割工具安装
- apache-->tomcat的方向代理配置
- tomcat启动出现 encountered during context initialization - cancelling refresh attempt异常
- eclipse安装了tomcat7.0,启动后在window-> preferences选项中没有tomcat项
- tomcat和eclipse集成
- linux服务器Tomcat日志中文乱码问题
- tomcat源码剖析系列
- 深入剖析tomcat之一个简单的servlet容器
- tomcat(5)servlet容器(lastest version)
- tomcat——简单的日志实现
- Tomcat安装的常见问题以及其第一个应用