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

首先,确保在机器上已经安装了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.jarandcouchbase-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>

相关推荐