Nginx(Openresty)+Tomcat+Memcache实现负载均衡和Session共享

本文详细介绍了如何通过Nginx(Openresty)实现Tomcat服务器的负载均衡,并结合Memcache进行Session共享。首先讲解了Tomcat的基本概念和安装配置,然后阐述了配置Nginx实现server1与server2的负载均衡,最后通过Memcache解决了Session数据在服务器间丢失的问题,确保了会话的连续性。
Nginx(openresty)部分的内容查看我之前博文:https://blog.csdn.net/y_yang666/article/details/87797541
Tomcat简介:
  • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
  • 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式,Tomcat一般处理动态页面而处理静态HTML的能力不如Apache服务器。
一.Tomcat的安装与配置

安装包:

apache-tomcat-7.0.37.tar.gz
jdk-7u79-linux-x64.tar.gz

1.下载tomcat安装包和jdk(java)并解压

[root@server1 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/     ##-C:指定目录解压
[root@server1 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/

在这里插入图片描述
2.制作软连接

[root@server1 local]# ln -s apache-tomcat-7.0.37 tomcat
[root@server1 local]# ln -s jdk1.7.0_79 java
[root@server1 local]# ls
apache-tomcat-7.0.37  games    jdk1.7.0_79  libexec    sbin   tomcat
bin                   include  lib          lnmp       share
etc                   java     lib64        openresty  src

在这里插入图片描述
3.更改环境变量并刷新

[root@server1 local]# cd /usr/local/tomcat/   
[root@server1 local]# vim /etc/profile   ##最后写入以下内容
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@server1 local]# source /etc/profile   ##刷新

在这里插入图片描述
在这里插入图片描述
4.测试java

[root@server1 ~]# vim test.java
public class test {
       public static void main(String[] args)
       {
               System.out.println("Hello World!");
       }
}
[root@server1 ~]# javac test.java    ##检查java语法
[root@server1 ~]# java test

在这里插入图片描述
在这里插入图片描述
5.测试Tomcat

[root@server1 local]# cd /usr/local/tomcat/bin   ##进到bin目录下执行脚本
[root@server1 bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

在这里插入图片描述
6.更改nginx配置文件

[root@server1 local]#cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf   ##
 74         location ~ \.jsp$ {
 75             proxy_pass   http://127.0.0.1:8080;
 76         }
 81             #set $key $uri$args;      ##注释掉之前openresty实验写入的以下内容
 82             #srcache_fetch GET /memc $key;
 83             #srcache_store PUT /memc $key;

在这里插入图片描述
在这里插入图片描述
7.重新加载配置文件

[root@server1 sbin]# ./nginx -s reload     ##sbin目录下

8.网页测试
网页输入:172.25.4.1/index.jsp,即可访问到tomcat默认发布网页
在这里插入图片描述

二.实现server1与server2的tomcat负载均衡

server1:
1.修改nginx配置文件

[root@server1 local]#cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf 
 17 http {
 18           upstream tomcat {
 19               server 172.25.4.1:8080;
 20               server 172.25.4.2:8080;
 21          }
 22     include       mime.types;
 23     default_type  application/octet-stream;
 
 54         #location /memc {     ##注释掉我之前做opebresty实验写入的内容(此步骤可忽略)
 55         #   internal;
 56         #  memc_connect_timeout 100ms;
 57         #   memc_send_timeout 100ms;
 58         #   memc_read_timeout 100ms;
 59         #   set $memc_key $query_string;
 60         #   set $memc_exptime 300;
 61         #   memc_pass memcache;
 62         #}
 
 74         location ~ \.jsp$ {
 75             proxy_pass   http://tomcat;
 76         }

在这里插入图片描述
在这里插入图片描述
2.重新加载配置文件

[root@server1 local]#cd /usr/local/openresty/nginx/sbin
[root@server1 sbin]# ./nginx -s reload

3.编写test.jsp文件

[root@server1 html]# pwd
/usr/local/openresty/nginx/html
[root@server1 html]# cat index.jsp 
the time is: <%=new java.util.Date() %>
[root@server1 html]# cp index.jsp /usr/local/tomcat/webapps/ROOT/test.jsp

server2:
1.拷贝server1上tomcat与jar的解压目录到server2上

[root@server2 ~]# scp -r root@server1:/usr/local/tomcat /usr/local
[root@server2 ~]# scp -r root@server1:/usr/local/java /usr/local

在这里插入图片描述
在这里插入图片描述
2.同样更改环境变量并刷新

[root@server2 ~]# cd /usr/local/
[root@server2 local]# cd tomcat/
[root@server2 tomcat]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@server2 tomcat]# source /etc/profile

在这里插入图片描述

在这里插入图片描述
3.编写/usr/local/tomcat/webapps/ROOT/的test.jsp文件

[root@server2 ROOT]# vim test.jsp 
[root@server2 ROOT]# cat test.jsp 
server2 the time is: <%=new java.util.Date() %>

4.开启tomcat

[root@server2 tomcat]# cd bin/
[root@server2 bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
测试:

server1与server2都开启tomcat,server1上nginx重启
1.网页输入172.25.4.1:8080,出现tomcat页面
在这里插入图片描述
2.网页输入172.25.4.1/test.jsp,不断刷新页面,轮询出现server1与server2上test.jsp网页
在这里插入图片描述
在这里插入图片描述

三.session共享(交叉存储)
什么是session?
  • 在计算机专业术语里:session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册入系统到注销系统之间所经过的时间以及如果需要的话,可能还有一定操作空间。
  • session技术则是服务端的解决方案,它是通过服务器来保持状态的。由于Session这个词汇包含的语义很多,因此需要在这里明确一下 Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。要使用Session,第一步当然是创建Session了。那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
sessioin的部署:

1.server1与server2修改测试页面文件test.jsp

[root@foundation4 Desktop]# scp test.jsp root@172.25.4.1:/usr/local/tomcat/webapps/ROOT    ##从我的真机拷贝次文件到指定目录
[root@foundation4 Desktop]# scp test.jsp root@172.25.4.2:/usr/local/tomcat/webapps/ROOT
[root@server1 ROOT]#cat test.jsp    ##这是一个简单的用户信息提交页面
 <%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>

2.关闭之前的nginx

[root@server1 nginx-1.10.1]# cd /usr/local/openresty/nginx/sbin/
[root@server1 sbin]# ./nginx -s stop

3.下载旧版本的nginx(因为旧版本的nginx支持sticky(交叉存储)模块)并解压

软件包: nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz

在这里插入图片描述
4.隐藏版本号与关闭debug日至

[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# vim src/core/nginx.h
 14 #define NGINX_VER          "nginx/"
 [root@server1 nginx-1.10.1]# vim auto/cc/gcc
179 #CFLAGS="$CFLAGS -g" 

在这里插入图片描述
在这里插入图片描述
5.编译安装nginx
由于需要sticky模块,所以需要下载该模块的安装包:nginx-sticky-module-ng.tar.gz

[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz
[root@server1 ~]# cd nginx-1.10.1   ##进到nginx解压目录
[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx/ --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng    ##创建编译环境
[root@server1 nginx-1.10.1]# make && make install    ##编译与安装

在这里插入图片描述
6.更改nginx配置文件

[root@server1 nginx-1.10.1]# cd /usr/local/lnmp/nginx/conf/
[root@server1 conf]# cp /usr/local/openresty/nginx/conf/nginx.conf .   ##直接复制openresty的nginx配置文件,进行覆盖
[root@server1 conf]# vim nginx.conf
 17 http {
 18           upstream tomcat {
 19               sticky;       ##sticky模块
 20               server 172.25.4.1:8080;
 21               server 172.25.4.2:8080;
 22          }

在这里插入图片描述
7.检测语法是否有误,无误后开启nginx

[root@server1 ~]# cd /usr/local/lnmp/nginx/sbin/
[root@server1 sbin]# ./nginx -t    ##语法检测
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful
[root@server1 sbin]# ./nginx    ##启动nginx
[root@server1 sbin]# netstat -tnlp    ##查看端口是否正确

在这里插入图片描述
在这里插入图片描述

网页测试:

此时提交后不会交替接受,可以一直存于某一个服务器,这样数据就不容易丢失
在这里插入图片描述
不足之处:但如果某个后端服务器挂了,可是客户端并不知晓,当你再提交请求时,便会由另一个后端服务器接管,虽然还是可以提交数据,但你之前提交的数据便会丢失

解决方法如下:利用memcache存储与tomcat的jar 包使用交叉存储的方式进行存储,进而实现session共享
server1:
1.拷贝jar包(存有所需要的软件包)

[root@foundation4 jar]# pwd
/home/kiosk/Desktop/jar
[root@foundation4 jar]# ls
asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc6-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar
[root@server1 lib]# cd /usr/local/tomcat/lib
[root@server1 lib]# scp root@172.25.4.250:/home/kiosk/Desktop/jar/* .
[root@server1 lib]# rm -rf memcached-session-manager-tc6-1.6.3.jar    ##不需要i此包

在这里插入图片描述在这里插入图片描述
2.更改配置文件

[root@server1 conf]# pwd
/usr/local/tomcat/conf
[root@server1 conf]# vim context.xml 
 35 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
 36 memcachedNodes="n1:172.25.4.1:11211,n2:172.25.4.2:11211"
 37 failoverNodes="n1"
 38 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
 39 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoder    Factory"
 40 />

在这里插入图片描述
3.重启tomcat

[root@server1 bin]# pwd
/usr/local/tomcat/bin
[root@server1 bin]# ./shutdown.sh    ##先关闭
[root@server1 bin]# ./startup.sh        ##在开启

在这里插入图片描述
4.重起后查看端口

[root@server1 bin]# netstat -tnlp    ##80端口(nginx)前面已经启动了
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3833/nginx    
tcp        0      0 :::8080                     :::*                        LISTEN      3904/java   

在这里插入图片描述
5.安装memcache

[root@server1 bin]# yum install -y memcached
[root@server1 bin]# /etc/init.d/memcached status
memcached is stopped
[root@server1 bin]# /etc/init.d/memcached start
Starting memcached:                                        [  OK  ]

在这里插入图片描述
server2:
1.同样拷贝jar包

[root@server2 lib]# cd /usr/local/tomcat/lib
[root@server2 lib]# scp root@172.25.4.250:/home/kiosk/Desktop/jar/* .
[root@server2 lib]# rm -rf memcached-session-manager-tc6-1.6.3.jar    ##删除不用的包

在这里插入图片描述
2.编辑配置文件

[root@server2 conf]# pwd
/usr/local/tomcat/conf
[root@server2 conf]# vim context.xml
 35 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
 36 memcachedNodes="n1:172.25.4.1:11211,n2:172.25.4.2:11211"
 37 failoverNodes="n2"
 38 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
 39 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoder    Factory"
 40 />

在这里插入图片描述
3.重起tomcat

[root@server2 bin]# ./shutdown.sh    ##先关闭
[root@server2 bin]# ./startup.sh       ##在开启

在这里插入图片描述
4.重起tomcat后查看端口

[root@server2 bin]# netstat -tnlp

在这里插入图片描述
5.安装memcache,并开启服务

[root@server2 bin]# yum install -y memcached
[root@server2 bin]# /etc/init.d/memcached status
memcached is stopped
[root@server2 bin]# /etc/init.d/memcached start
Starting memcached:                                        [  OK  ]

在这里插入图片描述

测试:

网页输入172.25.4.1/test.jsp,连续提交信息
在这里插入图片描述
此时我们连续添加三个信息在server1上了(可查看日至),此时我们关掉server1的tomcat,查看当另一个服务器server2接管后,会不会保留我们之前添加的这些信息

[root@server1 bin]# ./shutdown.sh 

在这里插入图片描述
网页再次提交信息:
在这里插入图片描述
server2接管,之前的信息依旧存在,这就实现了session共享(交叉存储)

查看添加的信息:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值