阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Redis存储Nginx+Tomcat负载均衡集群的Session

158次阅读
没有评论

共计 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.gz2)解压缩 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 如下所示:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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/ 目录下:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

修改 index.jsp 和 login.jsp 文件分别标识为具体的 Tomcat 容器

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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、观看效果

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

可以看出,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 下的代码拷贝到具体位置,如下:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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>  

如果不设置密码会报错,如下:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

六、效果演示

案例演示的一个登陆请求,登陆成功之后将用户信息放在 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、效果如下:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

可以看出在登录界面的时候刷新请求的 tomcat 已经由 Nginx 进行分发请求,登录之后再两个 tomcta 中已经共享了 session

5、查看 Redis 对 session 的存储

在对 contex.xml 文件进行配置的时候默认使用的 database 为 0,通过 redis-cli 工具可看到

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

七、总结

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

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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.gz2)解压缩 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 如下所示:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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/ 目录下:

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

修改 index.jsp 和 login.jsp 文件分别标识为具体的 Tomcat 容器

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

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、观看效果

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

使用 Redis 存储 Nginx+Tomcat 负载均衡集群的 Session

可以看出,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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计10570字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中