美文网首页
Nginx实现负载均衡

Nginx实现负载均衡

作者: 程序员不会取昵称 | 来源:发表于2019-04-16 23:44 被阅读0次

    准备

    三台tomcat服务器,一台nginx服务器。由多个客户端发送的请求,通过nginx访问到不同的tomcat服务器。

    要实现的效果

    要实现的效果

    配置

    nginx配置。打开conf/nginx.conf文件。在http{}里定义一组要访问的服务器地址。

    upstream group {
          server ip地址:8080
          server ip地址:8080
          server ip地址:8080
    }
    

    接着在server{}里配置location。

    location / {
        proxy_pass    http://group
    }
    
    nginx修改配置

    为了看出明显的效果,Tomcat里修改了默认访问的index.jsp内容。

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page import="java.net.InetAddress"%>
    <%
            InetAddress address=InetAddress.getLocalHost();
            String ip=address.getHostAddress().toString();
            String name=address.getHostName();
    %>
    <html>
       name:<%=name%>
       <br/>
       ip:<%=ip%>
       <br/>
       session:<%=session.getId()%>
    </html>
    

    实现效果

    实现效果

    优化

    可以看到,虽然实现了效果,但是有个问题,就是每次刷新的时候,session值都是一直变化的。客户端访问服务器会把上次带来的session值和tomcat中的session值进行比较,如果不一样则会产生新的session值。由于访问的tomcat服务器是不固定的,所以如果上一次访问的是另一台服务器,那么它得到的session值就与当前tomcat服务器的值不一样,因此会重新产生一个新的session值。
    如图所示:


    session变化

    解决办法:

    此时就需要一台专门保存每台tomcat服务器生成session值的服务器,每次通过nginx访问tomcat的时候,tomcat都会去那台存了session的服务器上验证一下对应的session值。


    保存session

    方案

    通过内存数据库来保存session,这里尝试安装memcached来保存tomcat生成的session。(之所以选择内存数据库,是因为它快,节省的读取磁盘IO的时间,不然每次请求都会耗费一定时间)

    步骤

    1. memcached安装
    2. 修改每台tomcat服务器中tomcat目录下的context.xml配置,将每次tomcat本机生成的session值保存到对应的安装了memcached的服务器上,这边memcachedNodes后面跟的是你安装了memcached服务器的ip和端口号。( \color{red}{注}:server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而 context.xml 文件则不然, tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。)
    <Manager
     className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
     memcachedNodes="n1:10.1.1.191:12345"
     sticky="false"
     lockingMode="auto"
     sessionBackupAsync="false"
     requestUrilgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
     sessionBackupTimeout="1000"
     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    
    
    1. 由于上面配置中用到了memcached相关的jar包,所以需要添加memcached相关jar包到tomcat下的lib目录中。相关jar包下载 密码:nqrq
      添加相关jar包
    2. 为每台tomcat服务器配置完后,再试一下刷新,这时候session值就不会变了。如果session值还是变化的,那么有可能是你这几台服务器的时间不一致造成的,集群时间一致很重要。


      再次刷新页面

    相关文章

      网友评论

          本文标题:Nginx实现负载均衡

          本文链接:https://www.haomeiwen.com/subject/fcurwqtx.html