nginx+tomcat+session共享

来源:互联网 发布:ios tableview优化 编辑:程序博客网 时间:2024/06/05 06:24
这篇文章参考了
http://blog.csdn.net/a673341766/article/details/7466420
http://biancheng.dnbcw.info/win2003/394833.html
多个tomcat要一起协同工作有几种办法,可以考虑的方案有以下几个:

1. 使用tomcat自带的cluster方式,多个tomcat见自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并不好。

2. 利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但是我们的应用很可能是某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。

3. 利用memcached把多个tomcat的session集中管理,这是最直接的解决方案,但是操作起来也最为复杂。

我们的系统既要求性能,又要比较好的利用上负载均衡,所以第3个方案是首选。接下来就是安装搭建之路了。

 安装配置

memcached的安装

1)先下载libevent-1.4.14b-stable.tar.gz和memcached-1.4.7.tar.gz的源码包,前者是后者的依赖包,就是一个事件驱动的包。

2)安装非常顺利,还是经典的那几个编译安装命令

  1. tar zxvf libevent-1.4.14b-stable.tar.gz
  2. cd libevent-1.4.14b-stable
  3. ./configure --prefix=/usr/local/libevent-1.4.14b
  4. make
  5. make install
  6. tar zxvf memcached-1.4.7.tar.gz
  7. cd memcached-1.4.7
  8. ./configure --prefix=/usr/local/memcached-1.4.7 --with-libevent=/usr/local/libevent-1.4.14b/
  9. make
  10. make install

3)启动memcached:

./bin/memcached -d -m 256 -u root -p 11211 -c 1024 -P /tmp/memcached.pid

 memcached-session-manager配置

让tomcat调用memcached来存储session早就是一个很成熟的解决方案了,开源的msm就可以解决这个问题。比较折腾的就是要用到的jar包,官方文档说的也比较含糊,我这里用的是kryo的序列化方案,所以用到的包多一些,分别是:

kryo-1.03.jar

kryo-serializers-0.8.jar

memcached-2.5.jar(我在官方看最新已经到2.7了,但是msm官方说用2.5,可能新包没测试过,特别是2.6版本changelog里面提到api有调整,还是不要乱升的好)

memcached-session-manager-1.5.1.jar

memcached-session-manager-tc7-1.5.1.jar

minlog-1.2.jar

msm-kryo-serializer-1.5.1.jar

reflectasm-0.9.jar

以上这些包都放在$CATALINA_HOME/lib目录下。

另外提一下,官方给出的4种序列化方案,其中kryo是效率最高的,具体比较看http://code.google.com/p/memcached-session-manager/wiki/SerializationStrategies。

接下来是修改tomcat的配置文件$CATALINA_HOME/conf/context.xml,调整成新的session存储方式。配置文件中加入以下内容:

  1. <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  2. memcachedNodes="n1:127.0.0.1:11211"
  3. sticky="false"
  4. lockingMode="auto"
  5. sessionBackupAsync="false"
  6. sessionBackupTimeout="1000"
  7. transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  8. />

在$CATALINA_HOME/conf/logging.properties文件中添加de.javakaffee.web.msm.level=FINE,就可以在catalina.out的日志中看到详细的session存取情况。

另外在Manager配置中加上requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$",用 chrome浏览器测试发现居然sessionID会突然变掉,然后就被拦截器给跳回首页了。去掉就一切正常,但拦截器只会去检测action的,按理说应该完全没关系,望高人指点!

说明:

            1、 session存储到memchached实现方案时。他主要功能是修改tomcat的session存储机制,使之能够把session序列化存放到memcached中。

       2、Manager标签属性说明:

             className

                    此属性是必须的。

             memcachedNodes

                        此属性是必须的。这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为<id>:<host>:<port>。

                   多个之间用空格或半角逗号隔开(如:memcachedNodes="n1:localhost:11211,n2:localhost:11212")。

                       如果你设置单个memcache节点<id>是可选的,所以它允许设置为<host>:<port>(memcachedNodes="localhost:11211")。

             failoverNodes

                      可选项,属性只能用在非粘连Session机制中。

                      此属性必须包含memcached节点的Id,此节点是Tomcat作为备份使用。多个之间用空格或逗号隔开

              memcachedProtocol

                   可选项,默认为text。出属性指明memcached使用的存储协议。只支持text或者binary。

              sticky 可选项,默认为true。

                    指定使用粘性的还是非粘性的Session机制。

              lockingMode 可选项, 此属性只对非粘性Session有用,默认为none。

                     指定非粘性Session的锁定策略。他的只有

                        (1)、none:从来不加锁

                        (2)、all: 当请求时对Session锁定,直到请求结束

                        (3)、auto:对只读的request不加锁,对非只读的request加锁

                        (4)、uriPattern:<regexp>: 使用正则表达式来比较requestRUI + "?" + queryString来决定是否加锁,

             requestUriIgnorePattern  可选项

                        此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些

                   请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件

                   没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。

            sessionBackupAsync 可选项,默认true

                        指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout

                   设置的过期时间起作用。

            backupThreadCount 可选项,默认为CPU内核数。

                       用来异步保存Session的线程数(如果sessionBackupAsync="true")。

            sessionBackupTimeout  可选项,默认100,单位毫秒

                       设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒

            sessionAttributeFilter 可选项 从1.5.0版本有

                       此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如

                  sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。

                  依赖于选择的序列化策略。

            transcoderFactoryClass 可选,默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory

                       此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory

                 和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.

            copyCollectionsForSerialization 可选项,默认false。

            customConverter 可选项

                  

            enableStatistics 可选项,默认true

                   用来指定是否进行统计。

            enabled 可选项,默认true

                    指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。

           更多说明请看:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration


 nginx配置

nginx非常简单,只要在upstream里面多配置几个server就可以了,这里把我的配置贴出来:

  1. #user nobody;
  2. worker_processes 16;
  3. events {
  4. use epoll;
  5. worker_connections 65535;
  6. }
  7. http {
  8. include mime.types;
  9. default_type application/octet-stream;
  10. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  11. # '$status $body_bytes_sent "$http_referer" '
  12. # '"$http_user_agent" "$http_x_forwarded_for"';
  13. #access_log logs/access.log main;
  14. client_header_buffer_size 32k;
  15. large_client_header_buffers 4 32k;
  16. client_max_body_size 8m;
  17. client_body_buffer_size 128k;
  18. sendfile on;
  19. tcp_nopush on;
  20. #keepalive_timeout 0;
  21. keepalive_timeout 65;
  22. gzip on;
  23. gzip_types text/javascript text/plain text/css application/xml application/x-javascript;
  24. gzip_disable "MSIE [1-6]\.(?!.*SV1)";
  25. proxy_connect_timeout 300;
  26. proxy_send_timeout 300;
  27. proxy_read_timeout 300;
  28. proxy_buffer_size 16k;
  29. proxy_buffers 4 32k;
  30. proxy_set_header X-Forwarded-For $remote_addr;
  31. proxy_set_header Connection Close;
  32. server_names_hash_max_size 1024;
  33. server_names_hash_bucket_size 1024;
  34. # Default cache parameters for use by virtual hosts
  35. # Set the cache path to tmpfs mounted disk, and the zone name
  36. # Set the maximum size of the on disk cache to less than the tmpfs file system size
  37. proxy_cache_path ./cache levels=1:2 keys_zone=pscms:100m max_size=800m;
  38. proxy_temp_path ./proxy;
  39. #配置后端服务器信息
  40. upstream web_server {
  41. #ip_hash;
  42. server localhost:8080 max_fails=3 fail_timeout=30s;
  43. server localhost:8180 max_fails=3 fail_timeout=30s;
  44. }
  45. server {
  46. listen 8888; ## listen for ipv4
  47. #listen [::]:80 default ipv6only=on; ## listen for ipv6
  48. server_name localhost;
  49. charset utf-8;
  50. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  51. '$status $body_bytes_sent "$http_referer" '
  52. '"$http_user_agent" "$http_x_forwarded_for"';
  53. access_log logs/host.access.log main;
  54. #access_log off;
  55. location ~ .*\.(jsp|action)?$ {
  56. proxy_set_header Host $http_host;
  57. proxy_redirect off;
  58. proxy_pass http://web_server;
  59. proxy_set_header Host $host;
  60. proxy_set_header X-Real-IP $remote_addr;
  61. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  62. }
  63. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
  64. #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
  65. proxy_next_upstream http_502 http_504 error timeout invalid_header;
  66. proxy_cache pscms; #进行缓存,使用Web缓存区cache_one
  67. proxy_cache_valid 200 304 1h; #对不同的HTTP状态码设置不同的缓存时间
  68. proxy_cache_valid 301 302 5m;
  69. proxy_cache_valid any 1m;
  70. proxy_set_header Host $host;
  71. proxy_set_header X-Real-IP $remote_addr;
  72. proxy_set_header X-Forwarded-For $remote_addr;
  73. proxy_set_header Accept-Encoding ""; #(或是后台服务器关闭gzip),这样这台机器才不会缓存被压缩的文件,造成乱码
  74. proxy_ignore_headers "Cache-Control" "Expires"; #这段配置加上后,proxy_cache就能支持后台设定的expires。
  75. proxy_pass http://web_server;
  76. expires 15m;
  77. }
  78. location / {
  79. proxy_set_header Host $http_host;
  80. proxy_redirect off;
  81. proxy_pass http://web_server;
  82. proxy_set_header Host $host;
  83. proxy_set_header X-Real-IP $remote_addr;
  84. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  85. }
  86. }
  87. }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 裤子裂开了怎么办视频 7p耗电快怎么办 战地4一直离线怎么办 战地1封永久怎么办? 战地1下载不了怎么办 手机解压包异常怎么办 电脑显示文件损坏怎么办 360解压坏了怎么办 dnf邮箱满了怎么办 origin会员过期存档怎么办 电脑文件夹删除不了怎么办 黑苹果内核错误怎么办 win10文件夹拒绝访问怎么办 苹果电脑没有系统了怎么办 黑苹果安装之后怎么办 笔记本cpu核显坏了怎么办 粘贴大量文件卡住怎么办 mx不能播放rv40怎么办 迷你世界联机卡怎么办 绝地求生被火瓶烧了怎么办 win8电脑太卡怎么办 win8关机没反应怎么办 arma3没子弹了怎么办 g350d柴油冻了怎么办 散热硅胶干了怎么办 电脑打不开pdf文件怎么办 文件变成快捷方式打不开怎么办 ai文件打不开了怎么办 电脑下载了病毒软件怎么办 打嗝停不下来怎么办 咳嗽停不下来怎么办 电动机停不下来怎么办 电脑所有程序都打不开怎么办 机顶盒画面卡顿怎么办 电脑画面卡顿怎么办 鞋舌头跑偏怎么办 球球大作战老卡怎么办 孩子被打却不敢还手怎么办? 自卫砍伤了人怎么办 系统还原节点黑屏了怎么办 我惹事了要被打怎么办