使用memcached 实现session共享:
session 会话:从打开网站开始到退出该网站的过程。
http协议是无状态连接协议 ,服务器不会记录终端访问过本服务器。第一次连接服务器时需要握手连接,同样的终端第二次连接服务器时不记得上一次的连接,还要握手连接。
web服务器往往多台使用集群技术,并使用第三方软件进行代理访问。由代理服务器决定每次访问哪一台web主机,也就会导致同一次session过程中,几次http请求会被分散到不同的web服务器。但是该session往往内部有很强的关联,这样被分散到不同的web服务器上后,容易数据丢失,产生错误。
例: 淘宝购物,选择完衣服,鞋子,书,最后去结账时,可能购物车只有衣服和书,鞋子在其他服务器上没找到。
http://www.taobao.com
cookies session_id 97
http://www.taobao.com
client 衣服 鞋子 书 去结账
|
nginx
taobao_1 taobao_2
memcached mem
使用session_id,第一次连接成功后回服务器生成记录session_id,并发给客户端,客户端将session_id存储在cookies文件中。客户端再次连接时,协议会携带cookies信息,memcached就识别出该连接 。web服务器虽然分发sessionID,但是web服务器并不记录sessionID
构建nginx+tomcat+memcached服务:
双tomcat网站服务,单memcached缓存服务,单nginx反向代理服务(默认不缓存数据)
client
|
1.1.1.254
nginx
192.168.0.254
|
tomcat_web_100 tomcat_web_101
主_mem_20 备_mem_30
200m 200m
网页文件时用java编写的时候,要搭建tomcat服务器:
service httpd stop#关闭其他版本的web服务
chkconfig --level 35 httpd off
yum -y install glibc.i686 glibc-devel.i686#库文件安装,系统预装x86版本glibc,安装i686版本glibc
chmod +x jdk-6u27-linux-i586.bin#tomcat服务运行环境包,加执行权限即可使用
./jdk-6u27-linux-i586.bin#执行安装,生成jdk1.6.0_27
mv jdk1.6.0_27 /usr/local/jdk#将目录移动到系统目录
cd /usr/local/jdk/
[root@pc205 jdk]# bin/java -version#查看版本信息
java version "1.6.0_27"
Java(TM) SE Runtime Environment (build 1.6.0_27-b07)
Java HotSpot(TM) Client VM (build 20.2-b06, mixed mode, sharing)
编辑系统配置文件指定jdk程序的安装位置,配置环境变量:
[root@www ~]# vim /etc/bashrc
export JRE_HOME=/usr/local/jdk
export JAVA_BIN=/usr/local/jdk/bin
export PATH=$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JRE_HOME/lib/dt.jar:$JRE_HOME/lib/tools.jar
export JRE_HOME JAVA_BIN PATH CLASSPATH
[root@www ~]# source /etc/bashrc#重新加载该文件
[root@pc205 jdk]# echo $JRE_HOME#查看环境变量
/usr/local/jdk
安装tomcat:
tar -zxvf apache-tomcat-6.0.32.tar.gz -C /usr/local/#提供tomcat服务的软件包,解压即可用,免安装
cd /usr/local/
mv apache-tomcat-6.0.32 tomcat#更改名字
cd tomcat
bin/startup.sh 启动服务命令
bin/shutdown.sh 停止服务命令
webapps/ROOT/ 网页目录
conf 配置文件存放目录,使用xml语言编写
[root@pc205 conf]# netstat -untnalp | grep :8080#tomcat默认监听8080端口,检查该端口
[root@pc205 conf]# /usr/local/tomcat/bin/startup.sh #启动服务脚本
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar
[root@pc205 conf]# netstat -untnalp | grep :8080#服务启动成功
tcp 0 0 :::8080 :::* LISTEN 26140/java
http://localhost:8080报错401认证错误,默认有安全认证机制,需要添加登录管理页面认证用户才能登陆。
vim /usr/local/tomcat/conf/tomcat-users.xml
<tomcat-users>
<role rolename="manager-gui" />#角色类型,有四种角色
<user username="admin" password="123456" roles="manager-gui" />
</tomcat-users>
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh#重新启动tomcat服务
登陆http://localhost:8080,输入用户名密码
建立测试页面:
vim /usr/local/tomcat/webapps/ROOT/test.jsp
1 <html>
2 <body bgcolor="green">
3 <center>
4 <%= request.getSession().getId() %>#获取sessionID值
5 <h1>tomcat 192.168.0.100</h1>
6 </center>
7 </body>
8 </html>
配置nginx 做反向代理,把自己接收到的请求以轮询的方式分发给tomcat服务器。
sed -i '/^$/d' nginx.conf
sed -i '/^#/d' nginx.conf#清除空行和注释
vim /usr/local/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream "tomcatweb" {
server 192.168.0.100:8080;
server 192.168.0.101:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcatweb;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
在20 和 30 服务器上运行memcached 服务器 使用200M物理内存做数据缓存 :
/usr/local/bin/memcached -u root -m 200M -d
给tomcat服务器安装连接memcahced服务器的连接工具 (msm)
cd session
cp *.jar /usr/local/tomcat/lib/#将连接程序复制到tomcat的库中
tomcat编辑自己的配置文件,指定memcached服务器的ip地址:
vim /usr/local/tomcat/conf/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="mem20:192.168.0.20:11211 mem30:192.168.0.30:11211" failoverNodes="mem30" #备用缓存服务器 requestUrilgnorePattern=".*\(ico|png|gif|jpg|css|js)$" #不缓存的文件类型transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" #连接memcached时调用的类 />
</Context>
重新启动tomcat服务:
[root@pc205 conf]# /usr/local/tomcat/bin/shutdown.sh
[root@pc205 conf]# /usr/local/tomcat/bin/startup.sh
实际结果,web服务还是一直轮询的,但是sessionID不会改变,除非memcached坏掉了。