共计 10570 个字符,预计需要花费 27 分钟才能阅读完成。
环境:CentOS 7.0(虚拟机环境)、Nginx 1.9.8、Redis 3.2.1
一、背景
在使用 Nginx+Tomcat 实现负载均衡的时候,由于 Nginx 对不同的请求分发到某一个 Tomcat,Tomcat 在运行的时候分别是不同的容器里,因为会出现 session 不同步或者丢失的问题。
二、Nginx 安装与配置
1、Nginx 安装
网上的资源对于安装 Nginx 的介绍比较多,例如最简单的为:
(1)获取 nginx,在 http://nginx.org/download/ 上可以获取当前最新的版本下载,例如:wget http://nginx.org/download/nginx-1.9.8.tar.gz(2)解压缩 tar -xvf nginx-1.9.8.tar.gz包。(3)进入解压缩目录,执行./configure --prefix=/usr/local/nginx-1.9.8 将 Nginx 安装到 /usr/local/nginx-1.9.8目录下(4)make & make install
安装的过程会将 Nginx 安装到 /usr/local/nginx-1.9.8 目录下,启动 Nginx 测试是否可以正常启动。
2、修改 Nginx 配置多 Tomcat 服务器
2.1、修改 conf/nginx.conf 文件, 在 server 标签上边添加 upstream 如下:
upstream mynginxserver {#weigth 参数表示权值,权值越高被分配到的几率越大
# 本机上的 Squid 开启 3128 端口
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8060 weight=1;
}
这里指定了本机下的两个 Tomcat 实例,端口分别为 8080,8060,权重都为 1,后边配置 Tomcat 实例,mynginxserver 这个是自己随意命名的,下边要用到
2.2、配置 server 标签;
server {listen 80;
server_name 192.168.1.149;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {# root html;
# index index.html index.htm;
proxy_pass http://mynginxserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;}
2.3、配置之后的完整内容如下(1.9.8 版本删去了注释后的配置内容):
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream mynginxserver {server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8060 weight=1;
}
server {listen 80;
server_name 192.168.1.149;
location / {proxy_pass http://mynginxserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;
}
}
}
2.4、具体的配置项和配置项的具体意义请参考
https://www.nginx.com/resources/wiki/start/topics/examples/full/
三、Tomcat 多实例的配置
1、解压 apache-tomcat-7.0.67.zip 得到 apache-tomcat-7.0.67
[root@localhost www]# unzip apache-tomcat-7.0.67.zip
2、将 apache-tomcat-7.0.67 重命名为 tomcat1
[root@localhost www]# mv apache-tomcat-7.0.67 tomcat1
重复 1、2 过程得到 tomcat1 和 tomcat2 如下所示:
3、修改 Tomcat1 的端口为 8080 和部署项目文件
编辑 tomcat 下的 conf/server.xml, 修改端口号为 8080,
自己写的用于测试 Nginx 反向代理的 web 项目 war 包下载地址:
Linux 公社资源站下载:
—————————————— 分割线 ——————————————
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2016 年资料 / 9 月 / 9 日 / 使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session/
下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm
—————————————— 分割线 ——————————————
下载好之后将解压之后的编译好的项目文件放到 tomcat1/webapps/ROOT/ 目录下:
修改 index.jsp 和 login.jsp 文件分别标识为具体的 Tomcat 容器
4、修改 Tomcat2 的端口为 8060 和部署项目文件
编辑 tomcat 下的 conf/server.xml, 修改端口号为 8060,然后和上述 3 中的一样,下载 war 内容,放在 tomcat2/webapps/ROOT/ 下,修改 index.jsp 和 login.jsp 用于标识具体的 Tomcat 容器
5、分别启动 tomcat1 和 tomcat2
6、重启 Nginx 服务,访问 IP 地址:192.168.1.149:80(这个是访问的虚拟机 IP 地址)
7、观看效果
可以看出,Nginx 已经进行了请求分发,转发到具体的某一个 Tomcat
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
CentOS 6.5 下安装 Tomcat http://www.linuxidc.com/Linux/2015-01/111415.htm
四、Redis 的安装与配置
由于篇幅过长,请参考:http://www.linuxidc.com/Linux/2016-09/135071.htm
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135073p2.htm
五、tomcat-Redis-session-manager 开源项目的使用
1、开源项目地址:https://github.com/jcoleman/tomcat-redis-session-manager
2、下载代码之后需要进行重新编译,生成所需要的 jar,任意创建 maven 项目,将 src 下的代码拷贝到具体位置,如下:
maven 的 pom.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ufind.session</groupId>
<artifactId>tomcat-redis-session</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<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.7.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>
</project>
3、然后打开 terminal,执行 mvn clean 和 mvn install 将编译好的代码打包为:tomcat-redis-session-1.0-SNAPSHOT.jar
4、将tomcat-redis-session-1.0-SNAPSHOT.jar、jedis-2.7.2.jar、commons-pool2-2.0.jar 三个 jar 包分别放在 tomcat1 和 tomcat2 实例下的 lib 目录下。
免费下载这三个 jar: 见本文的上一页 Linux 公社资源下载。
5、修改 tomcat 实例下 conf/contex.xml 文件
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- tomcat-redis-session 共享配置 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.149"
port="6379"
database="0"
maxInactiveInterval="60" />
</Context>
如果 Redis 配置了访问权限,请添加密码为:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- tomcat-redis-session 共享配置 -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.149"
port="6379"
database="0"
password="redispassword"
maxInactiveInterval="60" />
</Context>
如果不设置密码会报错,如下:
六、效果演示
案例演示的一个登陆请求,登陆成功之后将用户信息放在 session 中,在界面中显示出来(tomcat1 实例,tomcat2 的实例中只是在 h2 标签中做了一下标识)
1、login.jsp 文件:
<body>
<h2>Session Demo in Tomcat1</h2>
<form action="/user?type=login" method="post">
用户名:<input type="text" name="userName"/><br/>
密码:<input type="password" name="userPassword"/><br/>
<input type="submit" value="login">
</form>
</body>
2、index.jsp 将登录之后的信息显示在界面上
<body>
<h2>Session Demo in Tomcat1</h2>
<%
User user = (User) request.getSession().getAttribute("USER");
if (user == null) {%>
用户为空,没有登录!!!<%
} else {%>
欢迎:<%=user.getUserName()%>
<%
}
%>
</body>
3、servlet 处理请求代码
public class UserServlet extends BaseServlet {
public String login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {User user = new User();
user.setUserName(request.getParameter("userName"));
user.setUserPassword(request.getParameter("userPassword"));
request.getSession().setAttribute("USER", user);
return "index.jsp";
}
}
4、效果如下:
可以看出在登录界面的时候刷新请求的 tomcat 已经由 Nginx 进行分发请求,登录之后再两个 tomcta 中已经共享了 session
5、查看 Redis 对 session 的存储
在对 contex.xml 文件进行配置的时候默认使用的 database 为 0,通过 redis-cli 工具可看到
七、总结
tomcat-redis-session-manager 是一个对用户完全透明的分布式 session 存储框架,用户只需要在 tomcat 中进行简单的配置,就可以使用,我们的业务代码是完全和单实例的时候的代码是一样的的,也就是写代码的时候完全不用担心你写的是一个多 tomcat 实例的代码,完全透明。
如何对框架的原理进行简单的理解,我们首先要知道,在请求过程中的 session 操作,首先要解析请求中的 sessionId 信息,然后将 sessionId 存储到 request 的参数列表中。然后再从 request 获取 session 的时候,如果存在 sessionId 那么就根据 Id 从 session 池中获取 session,如果 sessionId 不存在或者 session 失效,那么则新建 session 并且将 session 信息放入 session 池,供下次使用。
如果我们想自己写一个类似于 tomcat-redis-session-manager 的项目,我们应该知道 Tomcat 的 Session 管理机制,在默认的情况下 Tomcat 的 Session 管理,如果不进行设置的话是由 Tomcat 自带的 StandardManager 类进行控制的,我们可以根据这个类自定义一个 Manager,主要重写的就是 org.apache.catalina.session.ManagerBase 里边的具体写的操作 ,
这也是 tomcat-redis-session-manager 的基本原理,将 tomcat 的 session 存储位置指向了 Redis
RedisSessionManager 继承了 org.apache.catalina.session.ManagerBase 并重写了 add、findSession、createEmptySession、remove 等方法,并将对 session 的增删改查操作指向了对 Redis 数据存储的操作
有兴趣可参考一篇 Tomcat 中 session 的管理机制:http://www.linuxidc.com/Linux/2016-09/135072.htm
Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135073.htm
环境:CentOS 7.0(虚拟机环境)、Nginx 1.9.8、Redis 3.2.1
一、背景
在使用 Nginx+Tomcat 实现负载均衡的时候,由于 Nginx 对不同的请求分发到某一个 Tomcat,Tomcat 在运行的时候分别是不同的容器里,因为会出现 session 不同步或者丢失的问题。
二、Nginx 安装与配置
1、Nginx 安装
网上的资源对于安装 Nginx 的介绍比较多,例如最简单的为:
(1)获取 nginx,在 http://nginx.org/download/ 上可以获取当前最新的版本下载,例如:wget http://nginx.org/download/nginx-1.9.8.tar.gz(2)解压缩 tar -xvf nginx-1.9.8.tar.gz包。(3)进入解压缩目录,执行./configure --prefix=/usr/local/nginx-1.9.8 将 Nginx 安装到 /usr/local/nginx-1.9.8目录下(4)make & make install
安装的过程会将 Nginx 安装到 /usr/local/nginx-1.9.8 目录下,启动 Nginx 测试是否可以正常启动。
2、修改 Nginx 配置多 Tomcat 服务器
2.1、修改 conf/nginx.conf 文件, 在 server 标签上边添加 upstream 如下:
upstream mynginxserver {#weigth 参数表示权值,权值越高被分配到的几率越大
# 本机上的 Squid 开启 3128 端口
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8060 weight=1;
}
这里指定了本机下的两个 Tomcat 实例,端口分别为 8080,8060,权重都为 1,后边配置 Tomcat 实例,mynginxserver 这个是自己随意命名的,下边要用到
2.2、配置 server 标签;
server {listen 80;
server_name 192.168.1.149;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {# root html;
# index index.html index.htm;
proxy_pass http://mynginxserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;}
2.3、配置之后的完整内容如下(1.9.8 版本删去了注释后的配置内容):
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream mynginxserver {server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8060 weight=1;
}
server {listen 80;
server_name 192.168.1.149;
location / {proxy_pass http://mynginxserver;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {root html;
}
}
}
2.4、具体的配置项和配置项的具体意义请参考
https://www.nginx.com/resources/wiki/start/topics/examples/full/
三、Tomcat 多实例的配置
1、解压 apache-tomcat-7.0.67.zip 得到 apache-tomcat-7.0.67
[root@localhost www]# unzip apache-tomcat-7.0.67.zip
2、将 apache-tomcat-7.0.67 重命名为 tomcat1
[root@localhost www]# mv apache-tomcat-7.0.67 tomcat1
重复 1、2 过程得到 tomcat1 和 tomcat2 如下所示:
3、修改 Tomcat1 的端口为 8080 和部署项目文件
编辑 tomcat 下的 conf/server.xml, 修改端口号为 8080,
自己写的用于测试 Nginx 反向代理的 web 项目 war 包下载地址:
Linux 公社资源站下载:
—————————————— 分割线 ——————————————
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2016 年资料 / 9 月 / 9 日 / 使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session/
下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm
—————————————— 分割线 ——————————————
下载好之后将解压之后的编译好的项目文件放到 tomcat1/webapps/ROOT/ 目录下:
修改 index.jsp 和 login.jsp 文件分别标识为具体的 Tomcat 容器
4、修改 Tomcat2 的端口为 8060 和部署项目文件
编辑 tomcat 下的 conf/server.xml, 修改端口号为 8060,然后和上述 3 中的一样,下载 war 内容,放在 tomcat2/webapps/ROOT/ 下,修改 index.jsp 和 login.jsp 用于标识具体的 Tomcat 容器
5、分别启动 tomcat1 和 tomcat2
6、重启 Nginx 服务,访问 IP 地址:192.168.1.149:80(这个是访问的虚拟机 IP 地址)
7、观看效果
可以看出,Nginx 已经进行了请求分发,转发到具体的某一个 Tomcat
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
CentOS 6.5 下安装 Tomcat http://www.linuxidc.com/Linux/2015-01/111415.htm
四、Redis 的安装与配置
由于篇幅过长,请参考:http://www.linuxidc.com/Linux/2016-09/135071.htm
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135073p2.htm