您的位置:首页 > 数据库 > Memcache

Nginx+Tomcat+memcached负载均衡实现session共享

2015-08-02 13:44 585 查看
1. 安装各个软件不用说了。

2. 到tomcat的安装目录lib中,加入:

memcached-2.6.jar(http://spymemcached.googlecode.com/files/memcached-2.6.jar

javolution-5.4.3.1.jar

memcached-session-manager-1.5.1.jar

memcached-session-manager-tc7-1.5.1.jar

msm-javolution-serializer-1.5.1.jar

msm-kryo-serializer-1.5.1.jar

msm-xstream-serializer-1.5.1.jar
3. 配置tomcat. 在%TOMCAT_HOME%\config\context.xml文件中加入】

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:localhost:11211,n2:localhost:11212"

requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;

sessionBackupAsync="false"

sessionBackupTimeout="1800000"

copyCollectionsForSerialization="false"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"



/>

4. 测试发现,有人说:也可在server.xml配置文件的<Host>...<Host>中添加配置

<Context docBase="F:/tomcats/tomcat-7.0.2_2/webapps" path= "/msm" reloadable= "true" >

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:localhost:11211,n2:localhost:11212"

requestUriIgnorePattern=".*\.(png|gif|jpg|css|js){1}quot;

sessionBackupAsync="false"

sessionBackupTimeout="1800000"

copyCollectionsForSerialization="false"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"



/>

</Context>

我发现测试没通过。

5. nginx的配置

[java] view
plaincopy

#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 10240;

}





http {

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;



tcp_nopush on;

keepalive_timeout 60;



tcp_nodelay on;



client_body_buffer_size 512k;

proxy_connect_timeout 5;

proxy_read_timeout 60;

proxy_send_timeout 5;

proxy_buffer_size 16k;

proxy_buffers 4 64k;

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;



#gzip on;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;



upstream localhost{

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

server 127.0.0.1:9001 weight=1 max_fails=2 fail_timeout=30s;

server 127.0.0.1:9004 weight=1 max_fails=2 fail_timeout=30s;

server 127.0.0.1:9007 weight=1 max_fails=2 fail_timeout=30s;

#ip_hash;

}

server {

listen 80;

server_name localhost;

charset utf-8;



#access_log logs/host.access.log main;



location / {

root html;

index index.html index.htm;

proxy_pass http://localhost;

}



location ~ ^/(WEB-INF)/ {

deny all;

}



#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;

# server_name localhost;



# ssl on;

# ssl_certificate cert.pem;

# ssl_certificate_key cert.key;



# ssl_session_timeout 5m;



# ssl_protocols SSLv2 SSLv3 TLSv1;

# ssl_ciphers HIGH:!aNULL:!MD5;

# ssl_prefer_server_ciphers on;



# location / {

# root html;

# index index.html index.htm;

# }

#}



}

6.

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。

7. 编辑session.jsp 进行测试是否session共享。

[html] view
plaincopy

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base href="<%=basePath%>">

<title>My JSP 'session.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

</head>

<body>

<%

System.out.println(session.getId());

out.println("<br> This is (TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");

%>

</body>

</html>

要打印出n1,tomcat等字样才表示session共享成功。

8. 注意的问题。memcached最好安装成windows服务。tomcat的端口不要冲突。nginx启动最好用命令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: