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

加入以下代码
##########first tomcat###########
CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
TOMCAT_HOME=/usr/local/tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME
##########first tomcat############
##########second tomcat##########
CATALINA_2_BASE=/usr/local/tomcat_2
CATALINA_2_HOME=/usr/local/tomcat_2
TOMCAT_2_HOME=/usr/local/tomcat_2
export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME
##########second tomcat##########
保存退出。
再输入:source /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信息共享。

原文地址:https://www.cnblogs.com/shihaiming/p/5896537.html