Nginx+Tomcat+memcached负载均衡实现session共享
原文:http://blog.csdn.net/zht666/article/details/38515147
以下内容是参考原文修改后的
测试环境linux centOS 6
在一台真实windows机上装了两台虚拟机
192.168.1.249
192.468.1.248
每台虚拟机都装了2个tomcat
因为nginx已经是安装好的了,所以没有按照原博客安装,没有验证是否正确。
tomcat也是安装好的,我在每一台服务器上都安装了2个tomcat,第二个tomcat是复制的第一个tomcat,
要编辑环境变量:vi /etc/profile
然后再修改第二个tomcat的server.xml中的端口号,要与第一个tomcat的端口号不能一样,不然端口冲突起不来服务。
最后再修改tomcat/bin/catalina.sh找到下面粉红字,
# OS specific support. $var _must_ be set to either true or false.
在下面增加如下代码
export CATALINA_BASE=$CATALINA_2_BASE
export CATALINA_HOME=$CATALINA_2_HOME
可以参考http://www.cnblogs.com/shihaiming/p/5896283.html
1.安装Nginx
Nginx官网:http://nginx.org/
下载最新稳定版本。在安装Nginx之前,需要先安装gcc、 openssl、 pcre和zlib软件库。
1.1安装gcc、gcc-c++
安装命令:
#sudo yum install gcc
# sudo yum install gcc-c++
1.2安装openssl
openssl官网:http://www.openssl.org/
安装版本:openssl-1.0.1i.tar.gz
安装命令:
#tar -zxvf openssl-1.0.1i.tar.gz
#cd openssl-1.0.1i
#sudo ./config --prefix=/usr/local/openssl-1.0.1i #prefix指定安装目录
#sudo make
#sudo make install
【注意】:此处使用的是config命令,而不是平常的configure命令
安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。
1.3安装pcre
pcre官网:http://www.pcre.org/
安装版本:pcre-8.35.tar.gz
安装命令:
#tar -zxvf pcre-8.35.tar.gz
#cd pcre-8.35
#sudo ./configure --prefix=/usr/local/pcre-8.35 #prefix指定安装目录
#sudo make
#sudo make install
安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。
【注意】:如果没有安装c++编译器,这个软件的安装会报错!
1.4安装zlib
zlib官网:http://www.zlib.net/
安装版本:zlib-1.2.8.tar.gz
安装命令:
#tar -zxvf zlib-1.2.8.tar.gz
#cd zlib-1.2.8
#sudo ./configure --prefix=/usr/local/zlib-1.2.8 #prefix指定安装目录
#sudo make
#sudo make install
安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。
1.5安装Nginx
安装版本:nginx-1.6.1.tar.gz
安装命令:
#tar -zxvf nginx-1.6.1.tar.gz
#cd nginx-1.6.1
#sudo ./configure
--prefix=/usr/local/nginx-1.6.1 #prefix指定安装目录
--with-openssl=/home/zht/src/openssl-1.0.1i #指的是openssl源码路径
--with-pcre=/home/zht/src/pcre-8.3.5 #指的是pcre的源码路径
--with-zlib=/home/zht/src/zlib-1.2.8 #指的是zlib 的源码路径
--with-http_ssl_module
#sudo make
#make install
安装完成后,到/usr/local/下查看是否安装成功。如果安装出错,需要重新加压缩,重新安装。
1.5.1 配置Nginx
配置文件目录:/usr/local/nginx-1.6.1/conf/nginx.conf
cd /usr/local/nginx-1.6.1/conf
vi nginx.conf
修改后的配置文件如下:
在#gzip on;后面加入upstream
#gzip on;
upstream tomcat {
# ip_hash;
server 192.168.1.249:8080 weight=1;
server 127.0.0.1:8082 weight=1;
server 192.168.1.248:8081 weight=1;
server 192.168.1.248:8083 weight=1;
}
server {
listen 8088;
server_name localhost;
location / {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
root /usr/share/nginx/html;
index index.html index.htm ;
proxy_pass http://tomcat;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_send_timeout 10;
}
}
此处nginx配置的listen坚挺端口是8088,那么等配置好后访问nginx就是192.168.1.249:8088,这样就会显示nginx欢迎页
在与tomcat集群配好后在访问192.168.1.249:8088,会显示tomcat的首页,
要是测试集群是否正常,在每个tomcat的webapps目录下建个test目录,将测试用的index.jsp放在此目录下即可,此时访问http://192.168.1.249:8088/test/
就会显示index.jsp内容。以上说的192.167.1.249是我nginx安装目录所在,自己测试时要根据自己实际的nginx所在服务器的ip来访问。
效果如下图:
访问测试用tomcat的webapps目录下的test/index.jsp的页面
upstream tomcat{ # 负载均衡站点的名称为tomcat,可以自己取
# ip_hash; # 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
server 127.0.0.1:8080 weight=1; # web服务器的IP地址及tomcat发布端口, #weigth参数表示权值,权值越高被分配到的几率越大
server 127.0.0.1:8082 weight=1;
server 192.168.1.248:8081 weight=1;
server 192.168.1.248:8083 weight=1;
}
说明:红色字体的tomcat这个名称随便命名,但在location中proxy_pass ,http://后面的名称要一致
weigth参数表示权值,权值越高被分配到的几率越大
location 中加入有下划线的代码
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://tomcat; # 负载均衡指向的发布服务tomcat
proxy_redirect default;
proxy_connect_timeout 10; #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
}
proxy_pass http://tomcat; #是必须要加的
proxy_connect_timeout 10; #这个参数是连接的超时时间。 我设置成10,表示是10秒后超时会连接到另外一台服务器
#其他参数自己选吧。
2. Memcache安装
Memcached官网:http://memcached.org/
安装memcached需要先安装libevent,libevent官网:http://libevent.org/
本次安装版本:
memcached-1.4.31.tar.gz
libevent-2.0.22-stable.tar.gz
2.1安装livevent
查看是否已安装:# rpm qa | grep libevent
如果已安装且版本低于1.3,则先通过:
# rpm -e libevent --nodeps 进行卸载。
# tar zxvf libevent-2.0.22-stable.tar.gz
# cd libevent-2.0.22-stable
# sudo ./configure --prefix=/usr/local/libevent-2.0.22-stable #prefix指定安装路径
# sudo make
# sudo make install
安装完成后,到prefix指定的目录下,看看是否存在libevent-2.0.22-stable目录,如下图所示。
图片中版本是2.0.21,因为重命名弄错了,实际版本还是2.0.22
2.2安装Memcached
# tar zxvf memcached-1.4.31.tar.gz
# cd memcached-1.4.31
sudo ./configure --prefix=/usr/local/memcached-1.4.31 --with-libevent=/usr/local/libevent-2.0.22-stable
# sudo make
# sudo make install
2.2.1检查看装情况
安装完成后,到prefix指定的目录下查看是否有memcached-1.4.31目录,如下图所示。
2.2.2查看memcached和libevent版本信息
首先定位到Memcached的bin目录下:
# cd /usr/local/memcached-1.4.31/bin
执行命令:
# sudo ./memcached -i
2.2.3启动memcached
# sudo ./memcached -d -v -p 12000 -m 512 -u root
解释:-d表示以守护进程方式运行memcached;-v表示输出浸膏和错误信息;-p指定监听的端口号;-m指定能使用的最大内存,单位MB;-u指定运行memcached的账户。
红色的12000这个参数非常重要,在tomcat的context.xml中配置memcache时memcachedNodes必须要与其一致,不然启动tomcat时报错,拒绝链接。
如果在同一台服务器上安装多个memcached时,此数字不能一样,这个数字自有定义,只要没被占用。
Memcache
使用# ps -ef | grep memcached查看进程。
3. tomcat配置Memcache
到tomcat的安装目录lib中,加入:需要的jar包
每个tomcat的lib下都要加入这些jar
Tomcat6、Tomcat7、Tomcat8使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar、memcached-session-manager-tc7-1.6.5.jar、memcached-session-manager-tc8-2.0.0.jar,
只可选一,安装tomcat的版本下载该jar,否则启动报错。
配置tomcat. 在tomcat安装目录下的context.xml文件中加入:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:12000"
sticky="false"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
说明:红色字体n1表示memcached服务器节点的名称,12000表示该节点的端口号,此端口号与启动memcached时的端口号要一致
有人说:也可在server.xml配置文件的<Host>...<Host>中添加配置
<Context docBase="webapps" path="" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:12000"
sticky="false"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
</Context>
这个我没试
【参数说明】:
docBase:与<Host>中的appBase一致,网站部署目录。
memcachedNodes:memcached服务器信息,此属性是必须的。这个属性必须包含你所有运行的memcached节点。每个节点的定义格式为<id>:<host>:<port>,多个服务器之间用空格或半角逗号隔开,如:
n1:127.0.0.1:12001 n2:127.0.0.1:12002 n3:127.0.0.1:12003
如果你设置单个memcache节点<id>是可选的,所以它允许设置为<host>:<port>,如:memcachedNodes="localhost:11211"
打开server.xml文件,在<Engine>节点的中添加jvmRoute="jvm1",这个是用于指定Tomcat集群的路由。Tomcat2设置成jvmRoute="jvm2",Tomcat3设置成jvmRoute="jvm3",依次类推。
注意: sticky模式时,要配置jvmroute参数,每台tomcat的jvmroute参数都不能一样
在tomcat目录的/conf/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
4. 测试Session共享
测试JSP代码如下:index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Tomcat+memcached共享session测试</title>
</head>
<body>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
这里是服务器192.168.1.249
<BR>
tomcat端口是8080
</body>
</html>
上面的红色字体根据实际的tomcat服务配置来写,方便看是否集群且session共享成功。
下面是我测试的效果:
千万要记住:浏览器输的地址是nginx服务的地址,不是某一个tomcat的地址,因为是nginx来做的负载均衡,由nginx来分配具体访问哪个服务。
要在每一个tomcat中webapps下新建一个test目录,把index.jsp放进去。
由图可以看到,三个Tomcat的SessionID都是一样的:BBE70447F8121E0A011CB3879FBF17A7-n1.jvm1 ,
-n1是memcached服务器的节点名称,jvm1 是我在其中一个tomcat的server.xml中<Engine>节点的中添加jvmRoute="jvm1 ",这个是用于指定Tomcat集群的路由,可以不写,写的话就会在sessionid里显示。
只要不关闭浏览器,不管怎么刷新,SessionID都是不变了。由此可以,三个Tomcat通过memcached实现了Session信息共享。
看完打开支付宝扫一扫领个红包吧!