搭建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的信息(截图)