搭建nginx+3*tomcat环境 1)画出架构图; 2)把配置文件发出来 (nginx.conf和server.xml); 注:server.xml未作修改,只修改了context.xml和index.jsp 3)要求实现session共享。
2 解答:
2.1 环境准备:
主机名 IP地址 软件部署
lb03 10.0.0.15/24 172.16.1.15/24 nginx
web03 10.0.0.17/24 172.16.1.17/24 jdk-8、3个tomcat-8
cache01 10.0.0.21/24 172.16.1.21/24 memcached-1.4.15
2.2 需解决的问题:
问题一:
使用Nginx+Tomcat进行负载均衡时,一般使用轮询方式进行负载。但是如果使用轮询方式的话,可能会访问不同的Tomcat,此时如果不进行Session共享,则相当于是一个新的Session。就比如现有系统都是需要认证登录的系统,如果没有Session共享,则会导致用户退出登录。
问题二: Nginx配置中可以使用ip_hash的方式简单实现session共享.但是这种方式只能将session固定到单台tomcat机器上,如果这台tomcat机器挂掉,则session信息就会丢失,不能实现session的故障转移.
2.3 拓扑图:
2.4 实现步骤: 2.4.1 web服务器部署安装JDK和Tomcat
2.4.2 编写tomcat的测试页面 ① web03服务器tomcat中index.jsp [root@web03 tomcat]# cp /application/tomcat/webapps/ROOT/index.jsp{,.bak}
[root@web03 tomcat]# cat webapps/ROOT/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> SessionID:<%=session.getId()%> <br/> SessionIP:<%=request.getServerName()%> <br/> tomcat_node1 page
② web03服务器tomcat_1中index.jsp [root@web03 tomcat]# cp /application/tomcat_1/webapps/ROOT/index.jsp{,.bak}
[root@web03 tomcat_1]# cat webapps/ROOT/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> SessionID:<%=session.getId()%> <br/> SessionIP:<%=request.getServerName()%> <br/> tomcat_node2 page
③ web03服务器tomcat_2中index.jsp [root@web03 tomcat]# cp /application/tomcat_2/webapps/ROOT/index.jsp{,.bak}
[root@web03 msm]# cat /application/tomcat_2/webapps/ROOT/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> SessionID:<%=session.getId()%> <br/> SessionIP:<%=request.getServerName()%> <br/> tomcat_node3 page
2.4.3 编写反向代理负载均衡服务器nginx配置文件
① lb03 服务器nginx.conf
[root@lb03 ~]# cat /application/nginx/conf/nginx.conf
worker_processes 2;
error_log logs/www_error.log error;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream oldboy {
server 10.0.0.17:8080;
server 10.0.0.17:8081;
server 10.0.0.17:8082;
}
server {
listen 80;
server_name www.etiantian.org;
root html;
index index.html index.htm;
location / {
proxy_pass http://oldboy;
proxy_set_header host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
2.4.4 将域名www.etiantian.org解析到10.0.0.15上,访问http://www.etiantian.org,发现访问请求结果会负载到10.0.0.17:8080和10.0.0.17:8081、10.0.0.17:8082的tomcat上了。(如下截图)
如上,在配置memcached-session-manager会话共享,访问http://www.etiantian.org的请求会轮询负载到web03 8080,8081,8082三个端口上,我们接着配置memcached和tomcat中的context.xml
2.4.5 一台缓存服务器安装部署Memcached ① [root@cache01 ~]# yum install memcached nc telnet -y [root@cache01 ~]# systemctl start memcached.service [root@cache01 ~]# systemctl enable memcached.service
2.4.6 修改memcached配置文件 ① cache01 配置文件 [root@cache01 ~]# cat /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 172.16.1.21"
查看端口 [root@cache01 ~]# ss -lntup|grep memcache udp UNCONN 0 0 172.16.1.21:11211 : users:(("memcached",pid=1446,fd=27)) tcp LISTEN 0 128 172.16.1.21:11211 : users:(("memcached",pid=1446,fd=26))
2.4.7 配置Tomcat,通过MSM实现共享session(一台web服务器上不同目录操作) ① 介绍MSM MSM(memcached session manager), MSM是一款实现Tomcat会话保持的管理组件 ② 将下载好的MSM的类库文件复制到tomcat的lib目录里 [root@web03 msm]# ll total 1212 -rw-r--r-- 1 root root 53259 Aug 27 09:53 asm-5.2.jar -rw-r--r-- 1 root root 323740 Aug 27 09:51 kryo-4.0.0.jar -rw-r--r-- 1 root root 85217 Aug 27 09:51 kryo-serializers-0.38.jar -rw-r--r-- 1 root root 152401 Aug 27 09:49 memcached-session-manager-1.9.7.jar -rw-r--r-- 1 root root 10788 Aug 27 09:49 memcached-session-manager-tc8-1.9.7.jar -rw-r--r-- 1 root root 5711 Aug 27 09:52 minlog-1.3.0.jar -rw-r--r-- 1 root root 37160 Aug 27 09:51 msm-kryo-serializer-1.9.7.jar -rw-r--r-- 1 root root 51287 Aug 27 09:53 objenesis-2.4.jar -rw-r--r-- 1 root root 20883 Aug 27 09:52 reflectasm-1.11.3.jar -rw-r--r-- 1 root root 472838 Aug 27 09:50 spymemcached-2.12.2.jar
cp msm/* /application/tomcat/lib/
④ web03的tomcat中context.xml文件追加内容
[root@web03 tools]# cat /application/tomcat/conf/context.xml
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.1.21:11211"
lockingMode="auto"
sticky="false"
sessionBackupAsync="false"
sessionBackupTimeout= "1000"
copyCollectionsForSerialization="true"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
⑤ web03的tomcat_1中context.xml文件追加内容
[root@web06 tools]# cat /application/tomcat_1/conf/context.xml
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.1.21:11211"
lockingMode="auto"
sticky="false"
sessionBackupAsync="false"
sessionBackupTimeout= "1000"
copyCollectionsForSerialization="true"
requestUriIgnorePattern="..(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
⑥ web03的tomcat_2中context.xml文件追加内容
[root@web06 tools]# cat /application/tomcat_2/conf/context.xml
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.1.21:11211"
lockingMode="auto"
sticky="false"
sessionBackupAsync="false"
sessionBackupTimeout= "1000"
copyCollectionsForSerialization="true"
requestUriIgnorePattern="..(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
2.4.8 MSM会话共享测试(如下截图) 访问http://blog.etiantian.org,按ctrl+F5刷新页面,发现session信息会变,但是sessionid不会改变!说明session实现了共享!
2.4.9 如下是本地浏览器Cookies的信息(截图)