nginx+tomcat+msm(memcached-session-manager)
下面就配置nginx+tomcat+msm(memcached-session-manager)做综合应用
由于http是无状态的协议,你访问了页面A,然后在访172.16.1.52/1.jsp问B,http无法确定这2个访问来自一个人
,因此要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。
比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。
还有A可能在购物,把商品放入购物车,此时B也有这个过程,你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。
cookie是服务器发给客户端,并且保持在客户端的一个文件,里面包含了用户的访问信息(账户密码等),可以手动删除或设置有效期,在下次访问的时候,会返给服务器。
注意:cookie可以被禁用,所以要想其他办法,这就是session。
比如:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠.该卡可以自己保存(cookie),或是商场代为保管,由于会员太多,个人需要保存卡号信息(session ID)
--------------------------------------------------------
一、Session Replication 方式管理 (即session复制)
简介:将一台机器上的Session数据广播复制到集群中其余机器上
使用场景:机器较少,网络流量较小
优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问
缺点:广播式复制到其余机器有一定廷时,带来一定网络开销
二、Session Sticky 方式管理
简介:即粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上
使用场景:机器数适中、对稳定性要求不是非常苛刻
优点:实现简单、配置方便、没有额外网络开销
缺点:网络中有机器Down掉时、用户Session会丢失、容易造成单点故障
三、缓存集中式管理
简介:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息
使用场景:集群中机器数多、网络环境复杂
优点:可靠性好
缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入
---------------------------------------------------
关于session的讨论
方法大概有:
一,用cookies
二,用nginx里的ip_hash,做成类似sticky session(粘贴会话在一台服务器上)的做法
upstream tomcat {
ip_hash;
server 192.168.122.128:8080 weight=1;
server 192.168.122.129:8080 weight=1;
}
优点:配置简单,方便
缺点:可能会造成负载不均衡
三,如果是使用tomcat,可以使用tomcat的组播功能(session复制)
缺点:难配置,组播会影响整个架构性
四,利用nginx插件实现tomcat集群和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能,可通过http://code.google.com/p/nginx-upstream-jvm-route/downloads/list获取。
五,memcache来共享session(memcached-session-manager)
我client
张三 李四
tomcat1 tomcat2
王五memcached
==========================================
下图中:
10.1.1.0/24网络我模拟外网(这里我用vmware的桥接网络来模拟)
192.168.122.0/24网络我模拟内网(这里我用vmware的vmnet1网络来模拟)
nginx做反向加解析静态页面
tomcat解析java动态程序
client 10.1.1.9
|
|
| 10.1.1.10
nginx
192.168.122.127
|
|
|-----------------------------|
tomcat1 tomcat2
192.168.122.128 192.168.122.129
| |
|-----------------------------|
|
|
192.168.122.130 memcache服务器
实验前准备:
1,主机名三步绑定
192.168.122.127 nginx.cluster.com
192.168.122.128 tomcat1.cluster.com
192.168.122.129 tomcat2.cluster.com
192.168.122.130 memcached.cluster.com
2,时间同步
3,关闭iptables,selinux
4,配置yum
第一步:
1,在192.168.122.127上安装nginx
软件包在 笔记目录/program/lnmp_soft/
# yum install pcre-devel -y
# useradd -r -d /dev/null -s /bin/false nginx ----我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑
uid=517(nginx) gid=518(nginx) groups=518(nginx)
# tar xf nginx-1.8.0.tar.gz -C /usr/src/
# cd /usr/src/nginx-1.8.0/
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module
# make ;make install
2,配置nginx
# cat /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 8;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 65535;
use epoll;
}
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"';
sendfile on;
keepalive_timeout 65;
upstream tomcat {
server 192.168.122.128:8080 weight=1;
server 192.168.122.129:8080 weight=1;
}
server {
listen 80;
server_name 10.1.1.10;
root /nginxroot/;
index index.jsp index.html;
access_log logs/host.access.log main;
location ~ .*\.jsp$ {
proxy_pass http://tomcat;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
# mkdir /nginxroot/
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx
# lsof -i:80
第二步:
在192.168.122.128和192.168.122.129上安装两台tomcat(过程省略,建议tomcat重新安装,因为如果前面tomcat安装了jspxcms这个应用的话,会对后面的测试造成影响)
tomcat1和tomcat2上把下面的软件包都scp到/usr/local/tomcat/lib/目录下
# ls 笔记目录/program/tomcat_soft/msm/ ----这些软件包是针对tomcat8的,如果你是tomcat6或者tomcat7你需要自行网上下载
asm-3.2.jar msm-kryo-serializer-1.8.1.jar
kryo-1.04.jar reflectasm-1.01.jar
memcached-session-manager-1.8.1.jar serializers-0.11.jar
memcached-session-manager-tc8-1.8.1.jar spymemcached-2.11.1.jar
minlog-1.2.jar
第三步:
在tomcat1和tomcat2上操作
# vim /usr/local/tomcat/conf/context.xml (在此文件的<Context>和</Context>里面加上下面一段)
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.122.130:11211" --这里的ip为memcached服务器的IP,如果有多个memcached服务器,用逗号隔开
lockingMode="auto"
sticky="false"
requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync= "false"
sessionBackupTimeout= "100"
copyCollectionsForSerialization="true"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
并把两台tomcat分别启动(如果你先前启动了要重启)
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh
# lsof -i:8080
第四步:
在192.168.122.130上安装并启动memcached
软件包在 笔记目录/program/lnmp_soft/
# tar xf libevent-1.4.11-stable.tar.gz -C /usr/src/
# cd /usr/src/libevent-1.4.11-stable/
# ./configure ;make ;make install
# tar xf memcached-1.4.22.tar.gz -C /usr/src/
# cd /usr/src/memcached-1.4.22/
# ./configure --with-libevent=/usr/local/ ;make ;make install
# /usr/local/bin/memcached -d -m 100 -u root
# lsof -i:11211
第五步:
我这里nginx,tomcat1,tomcat2是合起来做一个应用,所以它们的家目录里的内容应该是一样的,如何让一个应用内容在它们那里一致?
方法1:远程实时rsync同步
方法2:共享存储或分布式存储(后面课程会讲,但现在也可以使用nfs来模拟共享存储)
在nginx的家目录/nginxroot/里,并且在tomcat1和tomcat2的家目录/usr/local/tomcat/webapps/ROOT/里建立一个测试文件(如果有nfs做共享存储,则只需要建立一次就可以了)
# vim session.jsp
SessionID:<%=session.getId()%> <BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>
第六步:
确认nginx和tomcat1和tomcat2和memcached都是启动状态,客户端使用firefox来测试
测试一:
http://10.1.1.10/session.jsp --不断F5刷新,sessionID是不变的
elinks -dump http://10.1.1.10/session.jsp --不要使用这种方式来测,这样测试session id是会变的(elinks不能像firefox那样存放session id),但也会存储到memcache中
在memcache服务器上进行下面的操作
# echo "stats cachedump 3 0" | nc 192.168.122.130 11211 > /tmp/session.txt
# cat /tmp/session.txt |head -1 --导出的第一行的session ID就等于上面页面刷新时的session id,说明session id确实存放在memcache里
ITEM validity:A8F853F36B9931DD5ADF51DFB806A0CF-n1 [20 b; 1442225217 s]
测试二:
分别把tomcat1和tomcat2里的第三步做的加到/usr/local/tomcat/conf/context.xml这个文件里的一段给注释掉,重启tomcat,再做上面的测试