欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于 Nginx+Tomcat+Memcached做负载均衡加共享session

程序员文章站 2022-05-29 14:39:30
...
首先,确保在机器上已经安装了 nginx、tomcat、memcached,并且都可以成功启动服务

nginx可以正常启动了,我们就可以通过 域+端口号来访问nginx的80端口了
以本地举例
localhost

nginx可以访问,我们就开始配置nginx的配置文件,来做与Tomcat的映射

location / {
            root   html;
            index  index.html index.htm;
            proxy_pass    http://tomcat_115;
 }


这里面是配置了nginx默认解析仅截取了一段代码,并不代表全部意思
其中proxy_pass则配置了相当于是代理转向



那么我们还需要在nginx的配置文件里面添加
upstream tomcat_115 {
          server 192.168.1.110:8080 weight=1;  
          server 192.168.1.111:8080 weight=2;  
          server 192.168.1.112:8080 weight=3;  
}

这段代码就是配置的本地tomcat的映射,后面的weight则配置了权重,权重越高,则被分配到的几率越高

以上代码就是nginx负责对发来的请求做分配处理
配置好后,可以通过nginx -t来验证配置文件是否正确

接下来配置memcached
如下是官网的安装说明,可以参看
https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration
官方文档里面说,首先要把memcached的jar包下载下来,并且添加到tomcat里面,官网给的路径是 $CATALINA_HOME/lib/,放到TOMCAT_HOME/lib/应该也可以
需要注意的是
jar包里面有tomcat的版本对应的jar
另外
如果你使用memcached,还需要下载spymemcached-2.8.12.jar and couchbase-client-1.1.4.jar.这两个jar包
如果用到couchbase,则还需要下载***jar包,这里不过多说明了

然后配置tomcat的配置文件,可以添加到server.xml里面,也可以添加到context.xml里面,
具体代码如下

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    />
</Context>

这是官网给的代码,另外还有两种写法,可参考官网,另外,其中的配置说明在官网里面也有,这里只简单介绍能跑通
memcachedNodes 的意思是指向memcached的节点,如果有多台机器安装了memcached,则需要全部加到这个配置里面,其中的格式为 域+端口号,这里面的域和端口号均指的是安装memcached的域和端口,memcached的默认端口号为11211

至于前面的n1,和n2,可以理解为编程语言里面的命名空间,可以在添加其他配置的时候用到
官网上面说,如果只有单个指向,可以不用写前边的n1等。

配置好这些,重启若干tomcat,重新加载nginx,就可以试试访问nginx的80端口啦,多访问若干次,被分配到访问的tomcat是随机的。
然后可以去看tomcat的访问日志,如果每个tomcat均有被访问到的记录,说明成功啦

可以通过简答的jsp代码来获取sessionId,确认session已经被共享,当刷新页面的时候sessionId是不变的

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>sessionID:<%=session.getId() %></h1>  
</body>
</html>