nginx反向代理tomcat集群能够解决高并发访问的问题,然后把session统一放到redis里面,可以解决session跨项目共享的的问题,顺便还解决了经典的单点登录问题。
实验环境: centos6.5 32位系统 nginx1.10.3 tomcat7.x redis-3.2.8,jdk1.7
所需jar包:commons-pool-1.6.jar , tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar , jedis2.9
拓扑图如下:
这里用到的是nginx负载均衡的轮询策略。
将以下jar包放到tomcat的lib目录
commons-pool-1.6.jar , tomcat-redis-session-manager-1.2-tomcat-7-java-7.jar , jedis2.9
在tomcat的conf目录的context.xml文件中添加如下配置
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve"/>
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="192.168.68.129"
port="6379"
password="test123"
database="0"
maxInactiveInterval="60"/>
在68.1和68.129的tomcat服务器上均做如上配置。
nginx的配置如下:
#...
upstream wx.com { #配置服务集群
server 192.168.68.1:8080 weight=1; #weight越大,处理请求的概率就越高
server 192.168.68.129:8080 weight=1;
}
server {
listen 80;
server_name 192.168.68.128;
location /NginxProj { #配置反向代理站点
#指定反向代理的服务集群,注意wx.com是集群名称,要和upstream中的wx.com一致
proxy_pass http://wx.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#....
jsp测试页面如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.net.InetAddress"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}"></c:set>
<c:set var="scheme" value="${pageContext.request.scheme}"></c:set>
<c:set var="serverName" value="${pageContext.request.serverName}"></c:set>
<c:set var="serverPort" value="${pageContext.request.serverPort}"></c:set>
<c:set var="basePath" value="${scheme}://${serverName }:${serverPort }${path }/"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="${basePath }">
<title>nginx演示</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<%
String serverIp=InetAddress.getLocalHost().getHostAddress();
String serverInfo=application.getServerInfo();
Properties props=System.getProperties(); //获得系统属性集
String osName = props.getProperty("os.name"); //操作系统名称
String osArch = props.getProperty("os.arch"); //操作系统构架
String osVersion = props.getProperty("os.version"); //操作系统版本
%>
<body>
<h2>sessionId:<%=session.getId() %></h2>
<h2>服务器ip:<%=serverIp %></h2>
<h2>tomcat服务器信息:<%=serverInfo %></h2>
<h2>服务器操作系统名称 :<%=osName %></h2>
<h2>服务器操作系统构架 :<%=osArch %></h2>
<h2>服务器操作系统版本 :<%=osVersion %></h2>
</body>
</html>
运行结果如图:
再次刷新,服务器变了,sessionid没变,如下:
查看redis服务器上的session:
ok,实验成功了!
=====================================
如果觉得帮到了你,可以小小打赏一下,您的支持是作者源源不断的动力