Nginx+Tomcat实现负载均衡、Redis实现Tomcat session会话共享

来源:互联网 发布:ubuntu 主题 编辑:程序博客网 时间:2024/06/05 02:35
http://blog.163.com/yunlei_ma/blog/static/127208935201621121033418/

此文档来源于http://www.cnblogs.com/lengfo/p/4260363.html,在其指导下做出,我只是在后续做出了部分补充。

一、前言

nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存、web server负载均衡等功能,由于其轻量级、高性能、高可靠等特点在互联网项目中有着非常普遍的应用,相关概念网上有丰富的介绍。分布式web server集群部署后需要实现session共享,针对 tomcat 服务器的实现方案多种多样,比如tomcat cluster session 广播、nginx IP hash策略、nginx sticky module等方案,本文主要介绍了使用redis 服务器进行 session 统一存储管理的共享方案。


二、构建 tomcat-redis-session-manager-master

?   由于源码构建基于 gradle,请先配置 gradle 环境。

?    github 获取 tomcat-redis-session-manager-master 源码,地址如下:https://github.com/jcoleman/tomcat-redis-session-manager

?   找到源码中的 build.gradle 文件,由于作者使用了第三方仓库(sonatype),需要注册帐号,太麻烦,注释后直接使用maven中央仓库,同时注释签名相关脚本并增加依赖包的输出脚本 copyJarsdist目录),修改后的 build.gradle 文件如下:

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'
 
group = 'com.orangefunction'
version = '2.0.0'
 
repositories {
  mavenCentral()
}
 
compileJava {
  sourceCompatibility = 1.7
  targetCompatibility = 1.7
}
 
dependencies {
  compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'
  compile group: 'redis.clients', name: 'jedis', version: '2.5.2'
  compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2'
  //compile group: 'commons-codec', name: 'commons-codec', version: '1.9'
 
  testCompile group: 'junit', name: 'junit', version: '4.+'
  testCompile 'org.hamcrest:hamcrest-core:1.3'
  testCompile 'org.hamcrest:hamcrest-library:1.3'
  testCompile 'org.mockito:mockito-all:1.9.5'
  testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'
}
 
task javadocJar(type: Jar, dependsOn: javadoc) {
  classifier = 'javadoc'
  from 'build/docs/javadoc'
}
 
task sourcesJar(type: Jar) {
  from sourceSets.main.allSource
  classifier = 'sources'
}
 
artifacts {
  archives jar
 
  archives javadocJar
  archives sourcesJar
}
 
//signing {
//  sign configurations.archives
//}
 
task copyJars(type: Copy) {
  from configurations.runtime
  into 'dist'  
}
 
uploadArchives {
  repositories {
    mavenDeployer {
      beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
 
      //repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
      //  authentication(userName: sonatypeUsername, password: sonatypePassword)
      //}
      //repository(url: "https://oss.sonatype.org/content/repositories/snapshots") {
      //  authentication(userName: sonatypeUsername, password: sonatypePassword)
      //}
 
      pom.project {
        name 'tomcat-redis-session-manager'
        packaging 'jar'
        description 'Tomcat Redis Session Manager is a Tomcat extension to store sessions in Redis'
        url 'https://github.com/jcoleman/tomcat-redis-session-manager'
 
        issueManagement {
          url 'https://github.com:jcoleman/tomcat-redis-session-manager/issues'
          system 'GitHub Issues'
        }
 
        scm {
          url 'https://github.com:jcoleman/tomcat-redis-session-manager'
          connection 'scm:git:git://github.com/jcoleman/tomcat-redis-session-manager.git'
          developerConnection 'scm:git:git@github.com:jcoleman/tomcat-redis-session-manager.git'
        }
 
        licenses {
          license {
            name 'MIT'
            url 'http://opensource.org/licenses/MIT'
            distribution 'repo'
          }
        }
 
        developers {
          developer {
            id 'jcoleman'
            name 'James Coleman'
            email 'jtc331@gmail.com'
            url 'https://github.com/jcoleman'
          }
        }
      }
    }
  }
}

 

?   执行gradle命令构建源码,编译输出tomcat-redis-session-manager-master 及依赖jar包。

http://gradle.org/gradle-download/ 下载Binary only distribution 包,解压即可运行。比如我将zip包解压到/root/ gradle-2.11目录,执行以下命令生成jar包。

[root@netron tomcat-redis-session-manager-master]# /root/gradle-2.11/bin/gradle build -x test  copyJars

[root@netron tomcat-redis-session-manager-master]# ls dist/ -l

commons-pool2-2.2.jar ##需要拷贝到tomcat lib目录。

jedis-2.5.2.jar  ##需要拷贝到tomcat lib目录。

tomcat-annotations-api-7.0.27.jar

tomcat-api-7.0.27.jar

tomcat-catalina-7.0.27.jar

tomcat-juli-7.0.27.jar

tomcat-servlet-api-7.0.27.jar

tomcat-util-7.0.27.jar

[root@netron tomcat-redis-session-manager-master]# ls build/libs/ -l

tomcat-redis-session-manager-master-2.0.0.jar   ##需要拷贝到tomcat lib目录。

tomcat-redis-session-manager-master-2.0.0-javadoc.jar

tomcat-redis-session-manager-master-2.0.0-sources.jar

三、tomcat session manager 配置

修改配置使用 tomcat-redis-session-manager-master 作为 tomcat session 管理器

1 分别将第三步生成的:tomcat-redis-session-manager-master-2.0.0.jar dist中的相应jar包覆盖到 tomcat 安装目录的 lib 文件夹。注意:全部放进去tomcat启动报错!!

2、分别修改2 tomcat  context.xml 文件,使 tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。

context.xml 增加以下配置:

<Context>

      <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

      <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"

           host="localhost"  ##redis服务器的地址

           port="6379"

           database="0"

           maxInactiveInterval="60" />

</Context>

四、测试页面

webapp中建立一个test文件夹,在文件夹中建立index.jsp页面,并且建立来模拟一个应用。

index.jsp页面内容如下:

 

1  #哪台服务器标示,随意写。

<%@page language="java"%> 

<html> 

<body> 

        <h1><font color="red">Session serviced by tomcat</font></h1> 

        <table aligh="center" border="1"> 

                <tr> 

                        <td>Session ID</td> 

                        <td><%=session.getId() %></td> 

                        <% session.setAttribute("abc","abc");%> 

                </tr> 

                <tr> 

                        <td>Created on</td> 

                        <td><%= session.getCreationTime() %></td> 

                </tr> 

        </table> 

</body> 

<html> 

 

测试时将两台tomcat都启动,访问以下index.jsp页面出现一个session ID,关闭其中一台tomcat,如果session保持一致就说明成功了。

五、nginx代理配置

upstream tomcat {  # 负载均衡站点的名称为tomcat,可以自己取

    ip_hash;# 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器

        server 192.168.0.101:8080;    # web服务器的IP地址及tomcat发布端口

        server 192.168.0.101:8080;

}

server {

    listen       80;                   # 站点侦听端口80

    server_name  localhost;            # 站点名称

    location / {

        index  index.jsp index.htm;

        proxy_pass http://tomcat/test;      # 负载均衡指向的发布服务tomcat

    }   

六、启动tomcat测试

启动所有的tomcat,访问测试页;首先关闭访问到的tomcat服务,然后刷新页面查看session ID是否改变,不变说明会话保持成功了。

0 0