公司的一个SSH项目因为用户不断增加,需要增加一个服务器。项目比较久远,所以当时并没有考虑集群的模式,所以需要现在解决session共享问题。这里采用三台服务器一台nginx服务器,两台Tomcat服务器
一、Tomcat7实现利用redis实现session
在服务器先安装redis修改配置文件为其他ip可以访问,并设置密码。具体操作这里不重复了,下面开始Tomcat+redis实现session共享:
1.1 首先下载tomcat-redis-session-manager的项目,下载地址:
https://github.com/jcoleman/tomcat-redis-session-manager
1.2 然后在本地新建一个maven项目,包名为com.orangefunction.tomcat.redissessions。项目名称随意,如tomcat-redis-session。然后把下载的项目解压,复制src下的所有文件到新建项目的对应包下。
1.3 修改pom.xml文件
<dependencies>
<!-- tomcat7 source1.7 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>7.0.27</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
1.4 修改RedisSessionManager中的redis配置信息(后来发现配置信息不是从这里读取的,不改好像也没事。)
1.5 把项目打包成jar包
1.6 把打好的包tomcat-redis-session.jar和maven仓库中的commons-pool2-2.2.jar、jedis-2.5.2.jar两个包一起拷贝到Tomcat中lib文件夹下
1.7 在tomcat配置文件context.xml中增加下面内容
<!-- redis session 共享配置 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.153"
port="6379"
password="*******"
database="0"
maxInactiveInterval="60" />
以上tomcat配置完毕
二、nginx的配置
2.1 修改nginx配置文件nginx.conf,如果没有这段内容就在http标签内填加。
#服务器列表
upstream mysvr {
server 192.168.1.179:8080;
server 192.168.1.178:8080;
}
#反向代理配置
server {
listen 80;
server_name 127.0.0.1;
charset utf-8;
location /{
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
}
nginx配置完毕
之后就分别启动两个tomcat和nginx,登录之后session就能正确获取到。
注意:
1、在项目的 web.xml中一定不能有任何对session设置修改的情况,否则session共享无效!!坑了我好久。
我们的项目里设置session超时时间,把代码注释掉就好了。下面这段代码
2、redis的地址、端口和密码是从context.xml中读取过来的,不是从项目中配置的。