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

Nginx+Tomcat+Memcached 集群Session共享[memcached服务安装、tomcat使用memcache存储session、nginx安装配置实现tomcat负载均衡]

2015-10-24 17:12 1501 查看
参考文章:

Nginx+Tomcat+Memcached集群Session共享
http://blog.csdn.net/shimiso/article/details/8979044
tomcat采用msm往memcached保存sessoin
http://576017120.iteye.com/blog/1172763
Memcache 查看列出所有key方法:
http://www.ttlsa.com/memcache/memcache-list-all-keys/
安装顺序:

1、安装配置memcache服务器,并确定memcached服务成功安装

2、tomcat采用msm (memcached-session-manager)往memcached保存sessoin,并测试session是否正常!【自己确认,本文省略】

3、安装并配置nginx,并确定nginx成功安装

4、nginx实现tomcat的负载均衡,并确定tomcat已经实现负载均衡。

详情如下 :

cookie是怎样工作的?

例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、domain、expires等进行了指定。

Set-Cookie:login=Michael Jordan;path=/;domain=msn.com;

expires=Monday,01-Mar-99 00:00:01 GMT

上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的URL编码操作的。

这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。

此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传到指定的服务器上,而决不会跑到其他的如www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。当然,如果浏览器上Cookie太多,超过了系统所允许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。

说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。

session又是如何工作的?

由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人,因此要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程,你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。

cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会返给服务器。注意:cookie可以被禁用,所以要想其他办法,这就是session。比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠。该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)。

为什么要持久化SESSION?

在客户端每个用户的Session对象存在Servlet容器中,如果Tomcat服务器重起/当机的话该session就会丢失,而客户端的操作应为session的丢失而造成数据丢失,而且当前用户访问量巨大,每个用户的Session里存放大量的数据的话,那么就很占用服务器大量的内存,从而是服务器的性能受到影响。

有关集群几种session同步方案请参考 /article/1636609.html

有关Nginx 介绍和使用请参考 /article/1354096.html

Nginx+Tomcat+Memcached实现tomcat集群和session共享

一、下载并安装Memcache服务器端

具体安装和测试见此文章 http://blog.csdn.net/buster2014/article/details/49385715
操作memcache方法大体如下:详情自己搜

1. cmd上登录memcache或者xshell中

连接到自己memcache指定的端口号【最好是1024以上的端口,我设置的12000】telnet 127.0.0.1 12000

2. 列出所有keys

stats items // 这条是命令
STAT items:7:number 1
STAT items:7:age 188
END
3. 通过itemid获取key

接下来基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列

stats cachedump 7 0 // 这条是命令
ITEM Sess_sidsvpc1473t1np08qnkvhf6j2 [183 b; 1394527347 s]
END
4. 通过get获取key值

上面的stats cachedump命令列出了我的session key,接下来就用get命令查找对应的session值

get Sess_sidsvpc1473t1np08qnkvhf6j2 //这条是命令
VALUE
Sess_sidsvpc1473t1np08qnkvhf6j2 1440 1
83
Sess_|a:5:{s:6:"verify";s:32:"e70981fd305170c41a5632b2a24bbcaa";s:3:"uid";s:1:"1
";s:8:"username";s:5:"admin";s:9:"logintime";s:19:"2014-03-11 16:24:25";s:7:"log
inip";s:9:"127.0.0.1";}


OK,此处完成后,你自己应该测试一下,tomcat能否把session正常存到memcache中,而且关闭浏览器或则不操作页面时,memcache中存储的sessionID会在设置的时间内自动删除。

上面确定没有任何问题,开始下面的操作。

二、Nginx部分

2.1、Nginx介绍

  Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

  Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。

  据说他当初是F5的成员之一,英文主页:http://nginx.net 。

2.2、Nginx优点

  Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性:

  在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue作为开发模型.

  Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

  作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.

  Nginx 是一个 安装非常的简单 , 配置文件 非常简洁(还能够支持perl语法), Bugs非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级.

2.3、Nginx安装

  到官网http://nginx.org/en/download.html下载最新的稳定版本,目前是0.7.67。

此处Nginx基本安装省略,相信你一定可以成功编译的......

下面验证Nginx是否正常启动,浏览器中输入nginx服务器地址,出现如下图说明nginx正常工作。



二、利用Nginx和memcached配置Tomcat实现负载均衡和session共享

Tomcat、memcached安装这里就不讲了,主要介绍如何配置Nginx实现Tomcat的负载均衡和利用memcached实现session共享。

配置Nginx+Tomcat集群实现负载均衡

修改配置文件nginx\conf\nginx.conf

1)、找到内容server {

在它的上面加入如下内容:

upstream 192.168.2.182 { #nginx所在服务器IP或者公网域名:192.168.2.182

ip_hash;#ip_hash策略将同一IP的所有请求都转发到同一应用服务器 【只有自己一台机测试时,此项可以屏蔽,不然,会误以为错误】

server 192.168.2.182:8087;#我的tomcat端口号

server 192.168.2.182:8012;

}

(这是负载切换使用的服务器网站IP)

2)、找到location / {

root html;

index index.html index.htm;

}

把内容更改如下:

location / {

proxy_pass http://192.168.2.182;
proxy_redirect default;

proxy_connect_timeout 10; (跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒.当一台服务器当掉时,过10秒转发到另外一台服务器)

}

3)、找到server {

listen 80;

server_name localhost;

把内容改成如下:

server {

listen 80;

server_name 192.168.2.182;

(这是监听访问域名绑定那台服务器80端口的请求)

好,在这里就这么简单配置好了,下面看下以上3步配置的图:

我的配置文件目录在这里/etc/nginx/nginx.conf[有的在这里,看你怎么编译的吧,nginx\conf\nginx.conf ]

[以下红色为必须修改的,其余部分根据自己需要适当修改]

#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 {
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;#是否gzip压缩
<span style="color:#990000;">upstream  192.168.134.11 {
#ip_hash;<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;">#ip_hash策略将同一IP的所有请求都转发到同一应用服务器,线上环境可以取消此项屏蔽</span>
server   192.168.134.11:8080;
server   192.168.134.12:8080;
} </span>
server {
<span style="color:#990000;">listen       8081;
server_name  192.168.134.11;<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 25.2px;">(这是监听访问域名绑定那台服务器8081端口的请求)</span></span>

#charset koi8-r;

#access_log  logs/host.access.log  main;

location / {
<span style="color:#cc0000;">#root   html;
#index  index.html index.htm;
proxy_pass http://192.168.134.11; proxy_redirect default;
proxy_connect_timeout 10;</span>
}

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

}
以上配置完成以后,重新启动nginx,测试nginx是否已经实现tomcat的负载均衡,具体效果,刷新页面时,不断切换两个tomcat主页【自己加标记,或者按照下面的方法测试,在ROOT目录下面新建一个test.jsp页面,写入标记】

2.2、Tomcat配置

  使用memcached-session-manager这个开源项目(http://code.google.com/p/memcached-session-manager,下面简称msm)配置Tomcat和memcached实现session共享。

首先将下面的包下载到Tomcat的lib目录下,这些包都是msm所依赖的包【共6个,在我的百度云盘里】。

javolution-5.4.3.1.jar (442.1 KB)

memcached-2.5.jar (260.9 KB)

memcached-session-manager-1.3.0.jar (79.1 KB)

msm-javolution-serializer-1.3.0.jar (61 KB)

msm-javolution-serializer-cglib-1.3.0.jar (3.7 KB)

sm-javolution-serializer-jodatime-1.3.0.jar (5 KB)

下面修改Tomcat配置文件,让Tomcat结合memcached实现session共享

[root@localhost lib]# vi /usr/local/tomcat/conf/server.xml

  在配置文件中加入如下内容【应该只针对某一个web目录,未验证,我是在context.xml中只添加下面的Manager就可以】

[html] view
plaincopy

<Context docBase="/var/www/html" path="" reloadable="true">

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

memcachedNodes="n1:localhost:11211"

requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"

sessionBackupAsync="false"

sessionBackupTimeout="100"

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

copyCollectionsForSerialization="false" />

</Context>

说明:

这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如:

n1:localhost:11211 n2:localhost:11212 /localhost改为安装memcached的服务器的IP

sessionBackupTimeout的单位为分钟

/var/www/html改为Tomcat服务器web根目录的路径

修改后重启两个TOMCAT和nginx即可,这个时候已经解决SESSION的共享问题.

测试Nginx和Tomcat

  测试Nginx是否实现负载均衡已经Tomcat能否共享session信息,分别在两个Tomcat服务器的/var/www/html目录下新建两个test.jsp页面

Tomcat1

[html] view
plaincopy

[root@localhost lib]# vi /var/www/html/test.jsp /输入如下内容

SessionID:<%=session.getId()%>

<BR>

SessionIP:<%=request.getServerName()%>

<BR>

SessionPort:<%=request.getServerPort()%>

<%

out.println("This is Tomcat Server 111111!");

%>

Tomcat2

[html] view
plaincopy

[root@localhost lib]# vi /var/www/html/test.jsp /输入如下内容

SessionID:<%=session.getId()%>

<BR>

SessionIP:<%=request.getServerName()%>

<BR>

SessionPort:<%=request.getServerPort()%>

<%

out.println("This is Tomcat Server 222222!");

%>

通过浏览器访问Nginx服务器,如下图将访问地址改成Nginx所在服务器。

反复刷新浏览器,如果SessionID一直不变,下面的SessionPort的内容在不断变化则说明负载均衡和sessin共享配置成功。【由于我上面配置的端口号一致,所以此处只能根据最下面的11111和22222进行区分】

一台电脑测试效果第一次访问:



第二次刷新:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: