Nginx + Tomcat + Redis 集群下的Session共享

转: https://github.com/izerui/tomcat-redis-session-manager

Tomcat的集群主要是解决Session共享的问题,这里是利用将Session存入Redis Cache来解决

Nginx来做为反向代理,同时可以做负载均衡。
Nginx + Tomcat + Redis 集群下的Session共享_第1张图片

必要环境:

  • java1.7
  • tomcat7
  • redis2.8

nginx 负载均衡配置

修改nginx conf配置文件加入

    upstream tomcat_http {       
        ip_hash;
        server localhost:81 weight=2;
        server localhost:82 max_fails=3 fail_timeout=30s;
        keepalive 10;
    }

    server {
        listen       88;
        server_name  localhost;
        location / {
            proxy_pass http://tomcat_http;
        }
    }

tomcat session共享配置步骤

添加redis session集群依赖的jar包到 TOMCAT_BASE/lib 目录下

  • tomcat-redis-session-manager-2.0.0.jar
  • jedis-2.5.2.jar
  • commons-pool2-2.2.jar

修改 TOMCAT_BASE/conf 目录下的 context.xml 文件

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
     host="localhost"
     port="6379"
     database="0"
     maxInactiveInterval="60"
     sessionPersistPolicies="PERSIST_POLICY_1,PERSIST_POLICY_2,.."
     sentinelMaster="SentinelMasterName"
     sentinels="sentinel-host-1:port,sentinel-host-2:port,.."/>

属性解释:

  1. host redis服务器地址
  2. port redis服务器的端口号
  3. database 要使用的redis数据库索引
  4. maxInactiveInterval session最大空闲超时时间,如果不填则使用tomcat的超时时长,一般tomcat默认为1800 即半个小时
  5. sessionPersistPolicies session保存策略,除了默认的策略还可以选择的策略有:

    [SAVE_ON_CHANGE]:每次 session.setAttribute() 、 session.removeAttribute() 触发都会保存. 
        注意:此功能无法检测已经存在redis的特定属性的变化,
        权衡:这种策略会略微降低会话的性能,任何改变都会保存到redis中.
    
    [ALWAYS_SAVE_AFTER_REQUEST]: 每一个request请求后都强制保存,无论是否检测到变化.
        注意:对于更改一个已经存储在redis中的会话属性,该选项特别有用. 
        权衡:如果不是所有的request请求都要求改变会话属性的话不推荐使用,因为会增加并发竞争的情况。
  6. sentinelMaster redis集群主节点名称(Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求)
  7. connectionPoolMaxTotal
  8. connectionPoolMaxIdle jedis最大能够保持idel状态的连接数
  9. connectionPoolMinIdle 与connectionPoolMaxIdle相反
  10. maxWaitMillis jedis池没有对象返回时,最大等待时间
  11. minEvictableIdleTimeMillis
  12. softMinEvictableIdleTimeMillis
  13. numTestsPerEvictionRun
  14. testOnCreate
  15. testOnBorrow jedis调用borrowObject方法时,是否进行有效检查
  16. testOnReturn jedis调用returnObject方法时,是否进行有效检查
  17. testWhileIdle
  18. timeBetweenEvictionRunsMillis
  19. evictionPolicyClassName
  20. blockWhenExhausted
  21. jmxEnabled
  22. jmxNameBase
  23. jmxNamePrefix * **

重启tomcat,session存储即可生效

Nginx 配置详解

转: http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html

Nginx配置文件详细说明

在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.

运行用户

user www-data;

启动进程,通常设置成和cpu的数量相等

worker_processes 1;

全局错误日志及PID文件

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

工作模式及连接数上限

events {
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024;#单个后台worker process进程的最大并发链接数
# multi_accept on;
}

设定http服务器,利用它的反向代理功能提供负载均衡支持

http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;

#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile        on;
#tcp_nopush     on;

#连接超时时间
#keepalive_timeout  0;
keepalive_timeout  65;
tcp_nodelay        on;

#开启gzip压缩
gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

#设定请求缓冲
client_header_buffer_size    1k;
large_client_header_buffers  4 4k;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

#设定负载均衡的服务器列表
 upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80  weight=1;
server 192.168.8.3:80  weight=6;
}

server {
#侦听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.xx.com;

    #设定本虚拟主机的访问日志
    access_log  logs/www.xx.com.access.log  main;

#默认请求
location / {
      root   /root;      #定义服务器的默认网站根目录位置
      index index.php index.html index.htm;   #定义首页索引文件的名称

      fastcgi_pass  www.xx.com;
     fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name; 
      include /etc/nginx/fastcgi_params;
    }

# 定义错误提示页面
error_page   500 502 503 504 /50x.html;  
    location = /50x.html {
    root   /root;
}

#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    root /var/www/virtual/htdocs;
    #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
    expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ \.php$ {
    root /root;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
    include fastcgi_params;
}
#设定查看Nginx状态的地址
location /NginxStatus {
    stub_status            on;
    access_log              on;
    auth_basic              "NginxStatus";
    auth_basic_user_file  conf/htpasswd;
}
#禁止访问 .htxxx 文件
location ~ /\.ht {
    deny all;
}

 }

}

以上是一些基本的配置,使用Nginx最大的好处就是负载均衡

如果要使用负载均衡的话,可以修改配置http节点如下:

设定http服务器,利用它的反向代理功能提供负载均衡支持

http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;

#省略上文有的一些配置节点

#。。。。。。。。。。

#设定负载均衡的服务器列表
 upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
server 192.168.8.2x:80  weight=1;
server 192.168.8.3x:80  weight=6;
}

upstream mysvr2 {
#weigth参数表示权值,权值越高被分配到的几率越大

server 192.168.8.x:80  weight=1;
server 192.168.8.x:80  weight=6;
}

#第一个虚拟服务器
server {
#侦听192.168.8.x的80端口
listen 80;
server_name 192.168.8.x;

  #对aspx后缀的进行负载均衡请求
location ~ .*\.aspx$ {

     root   /root;      #定义服务器的默认网站根目录位置
      index index.php index.html index.htm;   #定义首页索引文件的名称

      proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表

      #以下是一些反向代理的配置可删除.

      proxy_redirect off;

      #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
      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 90;  #nginx跟后端服务器连接超时时间(代理连接超时)
      proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
      proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
      proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
      proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
      proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
      proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传

   }

 }

}

参考: http://xstarcd.github.io/wiki/Java/tomcat_cluster.html

你可能感兴趣的:(Nginx + Tomcat + Redis 集群下的Session共享)