准备
三台tomcat服务器,一台nginx服务器。由多个客户端发送的请求,通过nginx访问到不同的tomcat服务器。
要实现的效果
要实现的效果配置
nginx配置。打开conf/nginx.conf
文件。在http{}里定义一组要访问的服务器地址。
upstream group {
server ip地址:8080
server ip地址:8080
server ip地址:8080
}
接着在server{}里配置location。
location / {
proxy_pass http://group
}
nginx修改配置
为了看出明显的效果,Tomcat里修改了默认访问的index.jsp内容。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="java.net.InetAddress"%>
<%
InetAddress address=InetAddress.getLocalHost();
String ip=address.getHostAddress().toString();
String name=address.getHostName();
%>
<html>
name:<%=name%>
<br/>
ip:<%=ip%>
<br/>
session:<%=session.getId()%>
</html>
实现效果
实现效果优化
可以看到,虽然实现了效果,但是有个问题,就是每次刷新的时候,session值都是一直变化的。客户端访问服务器会把上次带来的session值和tomcat中的session值进行比较,如果不一样则会产生新的session值。由于访问的tomcat服务器是不固定的,所以如果上一次访问的是另一台服务器,那么它得到的session值就与当前tomcat服务器的值不一样,因此会重新产生一个新的session值。
如图所示:
session变化
解决办法:
此时就需要一台专门保存每台tomcat服务器生成session值的服务器,每次通过nginx访问tomcat的时候,tomcat都会去那台存了session的服务器上验证一下对应的session值。
保存session
方案
通过内存数据库来保存session,这里尝试安装memcached来保存tomcat生成的session。(之所以选择内存数据库,是因为它快,节省的读取磁盘IO的时间,不然每次请求都会耗费一定时间)
步骤
- memcached安装
- 修改每台tomcat服务器中tomcat目录下的context.xml配置,将每次tomcat本机生成的session值保存到对应的安装了memcached的服务器上,这边memcachedNodes后面跟的是你安装了memcached服务器的ip和端口号。( :server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而 context.xml 文件则不然, tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。)
<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.1.1.191:12345"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUrilgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
- 由于上面配置中用到了memcached相关的jar包,所以需要添加memcached相关jar包到tomcat下的lib目录中。相关jar包下载 密码:nqrq
添加相关jar包 -
为每台tomcat服务器配置完后,再试一下刷新,这时候session值就不会变了。如果session值还是变化的,那么有可能是你这几台服务器的时间不一致造成的,集群时间一致很重要。
再次刷新页面
网友评论