文档章节

基于Nginx + Tomcat 7 + Redis session共享

老司机带带我
 老司机带带我
发布于 2015/10/28 15:28
字数 1157
阅读 203
收藏 6

一、前言:

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

  相关应用结构参照下图:

  

二、环境配置

  测试环境基于 Linux CentOS 6.5,请先安装 tomcat、redis、nginx 相关环境,不作详细描述,本文测试配置如下:

   Version  IP_Port
 nginx  1.8.0  120.26.53.47 :80
 tomcat_1  7.0.63  120.26.53.47:8888
 tomcat_2  7.0.63  120.26.53.47:9999
 redis 3.0.5  120.26.53.47:6379



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

  1、tomcat-redis-session-manager-master由于源码构建基于 gradle,请先配置 gradle 环境。

  2、从 github 获取 tomcat-redis-session-manager-master 源码,地址如下:

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

    3、下载后需要自行打包成jar,tomcat-redis-session-manager-master依赖于以下包:


四、tomcat 配置

  安装并配置两台tomcat 服务器,如果两台tomcat需要在同一机器上运行则需要修改tomcat的端口。本例中我的配置:

1.tomcat_1的配置

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8888" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
2.tomcat_2的配置

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

<Server port="8006" shutdown="SHUTDOWN">
<Connector port="9999" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />


五、编写测试页面

  为了区别2台tomcat的访问,分别编写页面并打包部署。

  1、为tomcat_1编写测试页面,并在tomcat_1 webapps目录下新建ROOT文件夹,将index.jsp文件放入;index.jsp内容:

response from tomcat_1 session ID为 :<%=request.getSession().getId() %>

  2、为tomcat_2编写测试页面,并在tomcat_2 webapps目录下新建ROOT文件夹,将index.jsp文件放入;index.jsp内容:

response from tomcat_2 session ID为 :<%=request.getSession().getId() %>
  此时分别访问 http://120.26.53.47:8888和 http://120.26.53.47:9999地址,因为访问的是不同web服务器,所以各自显示不同的页面内容及session值肯定不同。


六、tomcat session manager 配置

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

  1、分别将第三步生成的 tomcat-redis-session-manager-master 及依赖jar包覆盖到 tomcat 安装目录的 lib 文件夹

  2、分别修改2台 tomcat 的 context.xml 文件,使 tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。context.xml 增加以下配置:

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />        
<Manager className="com.radiadesign.catalina.session.RedisSessionManager" 
	host="localhost" 
	port="6379" 
	database="0" 
	maxInactiveInterval="60"
/>

七、nginx 配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
	#tomcat 
	upstream localhost {  
        server localhost:8080;  
        server localhost:8081;  
    }  
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /{
			#root   /usr/share/nginx/html;
			index  index_tel.jsp index.jsp index.html index.htm ;  
			proxy_redirect          off;  
			proxy_set_header        Host $host;  
			proxy_set_header        X-Real-IP $remote_addr;  
			proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
			client_max_body_size    10m;  
			client_body_buffer_size 128k;  
			proxy_connect_timeout   300;  
			proxy_send_timeout      300;  
			proxy_read_timeout      300;  
			proxy_buffer_size       4k;  
			proxy_buffers           4 32k;  
			proxy_busy_buffers_size 64k;  
			proxy_temp_file_write_size 64k; 
			proxy_pass http://localhost;  
		}

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

    2、nginx 重新加载配置

nginx -s reload

八、测试结果

        1、访问 http://120.26.53.47:8888 直接请求到tomcat_1服务器,

    显示 “ response from tomcat_1 ”, session 值‘56E2FAE376A47F1C0961D722326B8423’;

  2、访问 http://120.26.53.47:9999 直接请求到tomcat_2服务器,显示 “ response from tomcat_2 ”, session 值为 ‘56E2FAE376A47F1C0961D722326B8423’;

  3、访问 http://120.26.53.47 (默认80端口)请求到 nginx 反向代理到指定Web服务器,由于默认使用轮询负载方式,反复刷新页面显示的内容在“ response from tomcat_1 ” 和 “ response from tomcat_2 ”之间切换,但 session 值保持为 ‘56E2FAE376A47F1C0961D722326B8423’;

  4、使用 redis-cli 连接 redis 服务器,查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。

九、参考

本文参考了网友方案,原文链接: http://www.cnblogs.com/lengfo/p/4260363.html



© 著作权归作者所有

老司机带带我
粉丝 0
博文 1
码字总数 1157
作品 0
深圳
高级程序员
私信 提问
Apache&Tomcat&Redis&Nginx配置集锦

1,单ip多域名訪問不同網站,並且限制用戶使用IP訪問方法; Apche httpd 在conf.d或者conf 文件夹下建立新的配置档案 vim zzgds.com.conf Listen 80ServerName 10.207.238.65NameVirtualHost ...

---張榮---
2016/01/12
158
0
nginx负载均衡以及静态资源的反向代理实施方案

nginx负载均衡以及静态资源的反向代理实施方案 作者:袁旭云 nginx介绍 nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个B...

IT小香猪
2016/09/01
753
1
分布式集群系统下的高可用session解决方案

目前,为了使web能适应大规模的访问,需要实现应用的集群部署. 而实现集群部署首先要解决session的统一,即需要实现session的共享机制。 目前,在集群系统下实现session统一的有如下几种方案:...

凯文加内特
2015/03/19
157
0
redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享)

一、redis介绍 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型...

何小帅
2018/06/26
0
0
基于Redis的Session共享示例

在单机情况下,Session可由部署在服务器上的Web容器来管理 (如Tomcat、JBoss)。 在负载均衡的集群环境下,负载均衡可能将请求分发到不同的服务器上去,在这种情况,需要将有状态的session统一...

王孟君
2016/12/22
7.3K
26

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据教程Scala系列之样例类_Option_偏函数

  好程序员大数据教程Scala系列之样例类_Option_偏函数,在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值。 ...

好程序员官网
32分钟前
4
0
zk中ServerCnxnFactory连接管理工厂

作为ServerCnxn的工厂抽象类 属性 ZOOKEEPER_SERVER_CNXN_FACTORY zookeeper.serverCnxnFactory secure 在ServerCnxnFactory中SSL是否启用 sessionMap session管理配置中信息(sessionId,Ser......

writeademo
34分钟前
6
0
【代码审计01】几种常见的漏洞种类以及代码审计工具

前言 代码审计是在经过黑盒测试完毕,也就是检查应用的基本功能是否符合产品业务需求下进行的。需要有一定的编码基础以及对漏洞形成原理的基本认知,通过工具或者经验检测代码中可能出现的b...

北桥苏
35分钟前
5
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

作者: OAM 项目负责人 导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open A...

阿里巴巴云原生
36分钟前
4
0
【进阶之定义函数】一个查询树结构数据的集合

1、基本定义 delimiter 自定义符号  -- 如果函数体只有一条语句, begin和end可以省略, 同时delimiter也可以省略create function 函数名(形参列表) returns 返回类型  -- 注意是retru...

卯金刀GG
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部