• nginx反向代理做负载均衡以及使用redis实现session共享配置详解


    1.为什么要用nginx做负载均衡?

        首先我们要知道用单机tomcat做的网站,比较理想的状态下能够承受的并发访问在150到200,

    按照并发访问量占总用户数的5%到10%技术,单点tomcat的用户人数在1500到4000左右。这样显

    然是不够的,为了解决这个问题我们就可以采用负载均衡的方法。

        1.1为什么采用nginx?

        成本低,不同于硬负载,成本基本为0。

        nginx能够支持高达50000个并发连接数的响应

    2.什么是反向代理?反向代理与正向代理的区别

    这里不多赘述了,比较简单,大家可以参考文章:

    https://blog.csdn.net/m13666368773/article/details/8060481

    3.nginx如何实现反向代理?

        3.1正确安装nginx,比较简单,不做过多赘述,下面是正确安装后的目录结构

        

         首先双击执行nginx,执行后在任务管理器中查看进程,如果有如下两个进程说明ngnix服务器已正常启动

        

        访问localhost:80,可以看到如下界面:

        

        3.2 进行反向代理配置

          在conf目录中找到nginx.conf文件。用记事本打开,可以看到如下配置:

            

          我们之所有直接通过localhost:80能访问到页面就是因为这段配置

           很明显listen代表的是nginx监听的端口,server_name代表ip或者域名,location / {..}这段配

    置代表默认主页,最后一段配置代表的是错误页面。

            然后介绍下反向代理的配置(以配置tomcat的反向代理为例),如下:

            

    配置完成后我们会发现,现在直接访问localhost:80时显示的不是之前的页面了,而是tomcat的主

    页,这样我们就完成了反向代理,当用户访问时,我们通过nginx从tomcat取得数据并返回给用户,

    这就是通过nginx完成反向代理。

    4.怎么用nginx实现负载均衡

    如果理解了反向代理的配置,这个配置就很简单了。具体配置如下:


    可以看到其他的配置都没有变,只不过在之前反向代理的列表中多加了一个tomcat的访问路径。

    在测试的时候发现nginx服务器一直无法启动,然后在错误日志中查了下发现:


    实际上上面的配置  weigth后应该有个等号,修改后如下:


    这样一来,每当客户访问localhost:80(nginx服务器时),nginx服务器会随机将请求分发给列表中的

    tomcat进行处理,这样我们就完成了对基于nginx负载均衡的配置

    5.但是完成负载均衡后,问题又来了,session怎么办?我们总不能每分配

    一次服务器就让用户登陆一次吧?这个就是session共享问题

    其实解决session共享问题的方案很多,我这里只给出一种,就是使用redis实现session共享,核心思想就是:

    将每个tomcat独立管理的session统一存储到redis中管理.大致原理图如下:



    步骤如下:

    1.下载nginx+tomcat集群+redis实现session共享工具包,下载地址

    https://github.com/jcoleman/tomcat-redis-session-manager/downloads

    2.其他需要的依赖


    将以上四个包copytomcatlib目录下(集群中的所有Tomcat都需要有这四个jar)

    3.tomcat/conf/context.xml文件中添加配置(集群中的所有Tomcat都需要配置)

    注意:

    1.按照如上配置,使用redis数据库,放入session中的对象必须要实现java.io.Serializable接口,使用memcache的可以不用实现Serializable接口

    原因是:因为tomcat里使用的将session放置redis使用的工具类,是使用的jdk序列化模式存储的,这一点也是很容易理解的,session.setAttribute(String key, Object value),存储Object类型

    object放入redis中又要能取出来,只能是序列化进行存储了,然后取出的时候进行反序列化。

    所以我们在session中存储的任何对象,都必须实现序列化接口。

    2.按照如上配置,使用redis做session存储空间时,web应用的session-time的时间单位会变成[秒],而不是原本的[分]

    原因是:因为tomcat里使用的将session放置redis使用的工具类,在存储时为对tomcat容器时间做转换,

    在redis中设置过期时间是使用秒作为单位的,有个命令叫expire可以设置redis键值过期时间,所以在context.xml配置文件中我们需要制定session过期时间(默认是60秒,配成1800即30分钟),这一点很重要。


  • 相关阅读:
    AC自动机+全概率+记忆化DP UVA 11468 Substring
    java POI技术之导出数据优化(15万条数据1分多钟)
    验证IP端与数据库Ip端是否重复!!!
    JAVA中IP和整数相互转化(含有掩码的计算)
    Nginx搭建反向代理服务器过程详解
    session原理及实现共享
    Linux部署多个tomcat
    linux下怎么修改mysql的字符集编码
    linux yum 安装mysql
    VM虚拟机下的Linux不能上网
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854507.html
Copyright © 2020-2023  润新知