nginx+tomcat+memcache实现负载均衡与session共享
利用nginx作为前端服务器,反向代理,将请求分发到后端tomcat服务器,同时使用两台memcache缓存服务器(主备)做session共享服务器,实现集群
先给出参考文档链接https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
我这里使用了3台centos7
node1: 30.67.133.151 环境: Java1.8+Tomcat8.5+memcache
node2: 30.67.133.152 环境: Java1.8+Tomcat8.5+memcache
node3: 30.67.133.153 环境:nginx
架构图
如下
1.在node1和node2上安装java和 memcache(两个节点都要做)
安装java
yum install java
安装memcache
yum install memcached
开启memcache并设置开机启动
systemctl start memcached
systemctl enable memccached
memcache默认是没有开启认证的,我也不开启了
防火墙需要放行memcache端口11211,为了实验省事,我干脆关掉防火墙
systemctl stop firewalld
systemctl disable firewalld
2.下载tomcat8.5并配置
我并没有使用yum一键安装Tomcat,yum源的Tomcat版本有点旧了,默认Tomcat7,而且。。。。我在tomcat7上没有实验成功。。。。
你可以上Tomcat官网去下载新的Tomcat8,需要注意的是memcached-session-manager支持tomcat6,7,8,但是实现的jar包不同
2.1先下载Tomcat
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.tar.gz
解压并赋权给$CATALINA_HOME/bin下的catalina.sh
http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
http://memcached-session-manager.googlecode.com/svn/maven/javolution/javolution/5.4.3.1/
最后一个包好像要翻墙的,反正我是下载不来,不过github上有,可以去找找,或者用我提供的
2.3将以上jar放置到$CATALINA_HOME/lib目录下
2.4编辑$CATALINA_HOME/conf/server.conf文件
在node1(第一台tomcat)的$CATALINA_HOME/conf/server.conf节点内加入以下内容
<Context path="/myapp" docBase="test.war" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:30.67.133.151:11211,n2:30.67.133.152:11211"
failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>
简单解释下上面的配置,首先,一个Context容器对应一个应用,path是访问的uri路径,docBase指明应用的位置,可以指向目录甚至war包,reloadable表示应用可以热部署,重载,memcachedNodes=”n1:30.67.133.151:11211,n2:30.67.133.152:11211”指明memcache的服务器IP及其端口,failoverNodes=”n1”表示把n1作为备用节点,n2才是主节点;requestUriIgnorePattern=”.*.(ico|png|gif|jpg|css|js)$”表示不理会这些静态请求,这些静态文件不需要做session保持
2.5 同2.4修改node2上的Tomcat文件
在node2上操作,修改Tomcat文件,加入以下内容,注意,此时failoverNodes=”n2”
<Context path="/myapp" docBase="test.war" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:30.67.133.151:11211,n2:30.67.133.152:11211"
failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>
把测试war包test.war包分别放到两个Tomcat的$CATALINA_HOME/webapps/下
2.6分别启动Tomcat 8
catlina.sh start
注意,如果启动失败,注意看报错信息,注意test.war和新添加的jar包的读写权限,确认没问题后访问
访问node1
http://30.67.133.151:8080/myapp/Test
访问node2
http://30.67.133.152:8080/myapp/Test
会看到session ID后面会带个后缀n2,表示session现在是存储在node2上
session共享部分完成,下面实现nginx反向代理
3.在node3上安装nginx
yum install nginx
没有源的话自己去找一下
安装完成后,修改配置文件nginx.conf
在http段里面加入
upstream tomcatservers{
server 30.67.133.151:8080;
server 30.67.133.152:8080;
}
把location / {
}
修改成代理到后端server
location / {
http://tomcatservers/;
}
测试下配置文件,没问题就启动
nginx -t
nginx
访问
http://30.67.133.153/myapp/Test
刷新,可以看到请求在node1和node2之间轮询,而且session id不变
所需jar和配置文件等
链接:http://pan.baidu.com/s/1hszTpxa 密码:1f1z