Tomcat+Nginx+Memcached综合案例

说明

通过Nginx解析静态页面并将动态负载均衡调度给后面的多个TomcatTomcat解析java动态程序。

由于http是无状态的协议,你访问了页面A,然后在访问B,http无法确定这2个访问来自一个人,因此要用cookie或session来跟踪用户,根据授权和用户身份来显示不同的页面。比如用户A登陆了,那么能看到自己的个人信息,而B没登陆,无法看到个人信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程,你无法确定A,B的身份和购物信息,所以需要一个session ID来维持这个过程。所以就用到了session管理。

官网文档

环境规划

主机 hostname 环境
192.168.1.31 nginx.cluster.com nginx(yum安装)
192.168.1.32 tomcat1.cluster.com tomcat-9.0
192.168.1.33 tomcat2.cluster.com tomcat-9.0
192.168.1.34 memcached.cluster.com memcached(yum安装)

关闭防火墙,selinux;时间同步;host绑定等基本配置 (步骤略)

具体步骤

本案例所使用的tomcatjdk、和tomcat-session相关的jar包下载地址
链接:https://pan.baidu.com/s/1ESm_RSrFx77kWObmCt1DQw
提取码:f64n

memcached部署

说明:memcached这里不需要配置太多,安装即可,然后检查端口是否处于监听中。tomcat服务器能成功连接即可

[root@memcached ~]# yum -y install memcached
[root@memcached ~]# systemctl enable memcached
[root@memcached ~]# systemctl start memcached [root@memcached ~]# lsof -i:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
memcached memcached 26u IPv4 0t0 TCP *:memcache (LISTEN)
memcached memcached 27u IPv6 0t0 TCP *:memcache (LISTEN)
memcached memcached 28u IPv4 0t0 UDP *:memcache
memcached memcached 29u IPv6 0t0 UDP *:memcache

nginx部署

1)安装nginx

[root@nginx ~]# yum -y install nginx
[root@nginx ~]# nginx -v
nginx version: nginx/1.12.

2)配置文件配置

# 创建一个虚拟主机
[root@nginx ~]# vim /etc/nginx/conf.d/www.conf
upstream tomcat {
server 192.168.1.32: weight=;
server 192.168.1.33: weight=;
} server {
listen default_server;
server_name localhost;
root /opt/project; #已jsp结尾的动态程序调度给tomcat去处理
location ~.*\.jsp$ {
proxy_pass http://tomcat;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
} error_page /.html;
location = /40x.html {
} error_page /50x.html;
location = /50x.html {
}
} # 创建测试文件
[root@nginx ~]# mkdir /opt/project
[root@nginx ~]# echo "<h1>Nginx IP:192.168.1.31</h1>" >> /opt/project/index.html

tomcat部署

详细安装参考:https://www.cnblogs.com/yanjieli/p/11092350.html
两台tomcat服务器都要执行下面的所有操作,也可以在一台上面执行,然后copy过去。
1)上传软件包到服务器,编写一个临时使用的安装脚本

[root@tomcat1 ~]# cat install_tomcat.sh
#!/bin/bash #----安装java环境
function InstallJava (){
tar xf jdk-8u211-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1..0_211 /usr/local/java
sed -i.ori '$a export JAVA_HOME=/usr/local/java \nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH \nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
java -version
} #----安装tomcat环境
function InstallTomcat (){
tar xf apache-tomcat-9.0..tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-9.0. /usr/local/tomcat
echo "export TOMCAT_HOME=/usr/local/tomcat" >> /etc/profile
source /etc/profile
}
InstallJava
InstallTomcat /usr/local/tomcat/bin/startup.sh

2)执行脚本

[root@tomcat1 ~]# bash install_tomcat.sh
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) -Bit Server VM (build 25.211-b12, mixed mode)
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
Tomcat started. [root@tomcat1 ~]# ss -nltp |grep :
LISTEN ::: :::* users:(("java",pid=,fd=))
LISTEN ::ffff:127.0.0.1: :::* users:(("java",pid=,fd=))
LISTEN ::: :::* users:(("java",pid=,fd=))

3)下载memcached-session-manager等相关软件包并copytomcat安装目录的lib目录中

[root@tomcat1 ~]# mkdir tools && cd tools

[root@tomcat1 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar
[root@tomcat1 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/2.3.0/memcached-session-manager-tc9-2.3.0.jar
[root@tomcat1 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar
[root@tomcat1 ~]# wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.2/spymemcached-2.12.2.jar
[root@tomcat1 ~]# wget https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar
[root@tomcat1 ~]# wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.0/reflectasm-1.11.0.jar
[root@tomcat1 ~]# wget https://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar
[root@tomcat1 ~]# wget https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.0/kryo-4.0.0.jar
[root@tomcat1 ~]# wget https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar
[root@tomcat1 ~]# wget http://repo1.maven.org/maven2/org/objenesis/objenesis/3.0.1/objenesis-3.0.1.jar [root@tomcat1 tools]# cp ./* /usr/local/tomcat/lib/

4)编辑配置文件,添加连接memcached

# No-Stick模式
[root@tomcat1 ~]# vim /usr/local/tomcat/conf/context.xml
# 在<Context>和</Context>里面加上下面一段
<!-- 这里的ip为memcached服务器的IP,如果有多个memcached服务器,用逗号隔开 -->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.1.34:11211"
lockingMode="auto"
sticky="false"
requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync= "false"
sessionBackupTimeout= ""
copyCollectionsForSerialization="true"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />

5)准备测试文件

[root@tomcat1 ~]# rm -rf /usr/local/tomcat/webapps/*
[root@tomcat1 ~]# mkdir /usr/local/tomcat/webapps/ROOT
[root@tomcat1 ~]# vim /usr/local/tomcat/webapps/ROOT/index.jsp
SessionID:<%=session.getId()%> <BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%>

6)重启tomcat

[root@tomcat1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@tomcat1 ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat1 ~]# lsof -i:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java root 63u IPv6 0t0 TCP *:webcache (LISTEN)

7)测试

访问tomcat1:

访问tomcat2:

访问nginx默认页面:

访问jsp动态程序:

通过上面的访问可以看出,访问静态页面时nginx自身处理,当访问jsp动态的时候会调度给tomcat去处理。并且当一个浏览器访问后,便会一直访问这一个,so,这样就达到了session会话保持。

补充

memcached-session-manager 参数说明:

memcachedNodes 必选项,memcached的节点信息,多个memcached节点,中间需要使用空格

failoverNodes="n2"  表示当前session保持到n1的memcached节点上
failoverNodes 可选项,不能使用在non-sticky sessions模式。故障转移配置节点,多个使用空格或逗号分开,配置某个节点为备份节点,
当其他节点都不可用时才会存储到备份节点,官方建议配置为和tomcat同服务器的节点。
理由如下:
假如有两台服务器m1,m2,其中m1部署tomcat和memcached节点n1,m2部署memcached节点n2。
如果配置tomcat的failoverNodes值为n2或者不配置,则当服务器m1挂掉后n1和tomcat中保存的session会丢失,而n2中未保存或者只保存了部分session,
这就造成 部分用户状态丢失。
如果配置tomcat的failoverNodes值为n1,则当m1挂掉后因为n2中保存了所有的session,所以重启tomcat的时候用户状态不会丢失。
为什么n2中保存了所有的session? 因为failoverNodes配置的值是n1,只有当n2节点不可用时才会把session存储到n1,所以这个时候n1中是没有保存任何session的。
lockingMode 可选值,默认none,只对non-sticky有效。
requestUriIgnorePattern 可选值,制定忽略那些请求的session操作,一般制定静态资源如css,js一类的。
sessionBackupAsync 可选值,默认true,是否异步的方式存储到memcached。
sessionBackupTimeout 可选项,默认100毫秒,异步存储session的超时时间。

相关软件包jar包下载:

memcached-session-manager 下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/2.3.0/memcached-session-manager-tc9-2.3.0.jar msm-kryo-serializer 下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/
http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar spymemcached 下载地址:http://repo1.maven.org/maven2/net/spy/spymemcached/
http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.2/spymemcached-2.12.2.jar serializers 下载地址:https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/
https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar reflectasm 下载地址:https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm
https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.0/reflectasm-1.11.0.jar minlog 下载地址:https://repo1.maven.org/maven2/com/esotericsoftware/minlog
https://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar kryo 下载地址:https://repo1.maven.org/maven2/com/esotericsoftware/kryo
https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.0/kryo-4.0.0.jar asm 下载地址:https://repo1.maven.org/maven2/org/ow2/asm/asm/
https://repo1.maven.org/maven2/org/ow2/asm/asm/7.0/asm-7.0.jar objenesis 下载地址:http://repo1.maven.org/maven2/org/objenesis/objenesis/
http://repo1.maven.org/maven2/org/objenesis/objenesis/3.0.1/objenesis-3.0.1.jar

Tomcat+Nginx+Memcached综合案例的更多相关文章

  1. Tomcat+nginx+keepalived+memcached实现双VIP负载均衡及Session会话保持

    准备好tomcat 第一台 tar vxf apache-tomcat-7.0.54.tar.gz mv apache-tomcat-7.0.54 /usr/local/tomcat tar vxf ...

  2. Nginx+Memcached+Tomcat集群配置(MSM--win7 64bit)

    本次主要是在win7 64 上演示操作. web应用构建 Memcached安装配置启动 Tomcat配置 所需jar包 memcached-session-manager 序列化 contextxm ...

  3. Nginx反代至Tomcat基于memcached的session保持

    实现功能:基于前面tomcat基础简介与示例文章 (1) tomcat cluster将会话保存至memcached中:实现模型: 这里写图片描述 配置B,C主机安装openjdk与tomcat[本次 ...

  4. Tomcat通过Memcached实现session共享的完整部署记录

    对于web应用集群的技术实现而言,最大的难点就是:如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点, 大体上有两种方式:一种是把所有Ses ...

  5. 企业级应用,如何实现服务化五(dubbo综合案例)

    这是企业级应用,如何实现服务化第五篇.在上一篇企业级应用,如何实现服务化四(基础环境准备)中.已经准备好了zookeeper注册中心,和dubbo管理控制台.这一篇通过一个综合案例,看一看在企业级应用 ...

  6. tomcat+nginx+redis集群试验

    Nginx负载平衡 + Tomcat + 会话存储Redis配置要点   使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运 ...

  7. Solr综合案例深入练习

    1. 综合案例 1.1. 需求 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字.分类.价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能. 界面如下: 1.2. 分析 开发人员需要 ...

  8. 黑马eesy_15 Vue:04.综合案例(前端Vue实现)

    黑马eesy_15 Vue:02.常用语法 黑马eesy_15 Vue:03.生命周期 黑马eesy_15 Vue:04.Vue案例(ssm环境搭建) 黑马eesy_15 Vue:04.综合案例(前端 ...

  9. solr综合案例

    1.  综合案例 1.1. 需求 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字.分类.价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能. 界面如下: 1.2分析 开发人员需要的 ...

随机推荐

  1. elk配置路径

    elk/usr/local/etc/elasticsearch-6.5.1/usr/local/Cellar/logstash/6.5.1/./logstash -f/usr/local/Cellar ...

  2. General VDPConfig对讲配置工具

    General VDPConfig大华楼宇对讲配置工具是ConfigTool的一个对讲模块,主要服务对象为可视对讲的门口机和室内机,大华可视对讲在独户应用中,利用了自身在视频监控领域的优势,充分整合了 ...

  3. [ARM-Linux开发]mknod命令使用

    mknod - make block or character special files mknod [OPTION]... NAME TYPE [MAJOR MINOR]     option 有 ...

  4. SQL2014做数据库主从镜像备份(也可以用于高可用)备忘(非域控)。

    部份内容参考原始文章链接:https://www.cnblogs.com/stragon/p/5643754.html ,同时比较有参考价值的文章:https://blog.csdn.net/sqls ...

  5. IntelliJ IDEA 常用快捷键 之 Windows 版

    IntelliJ IDEA(简称 IDEA),是 Java 语言开发的集成环境,IDEA 在业界被公认为最好的 Java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持.各类版本 ...

  6. JDK动态代理为什么必须针对接口

    查看jdk的动态代理源码发现: 动态代理实际上是程序在运行中,根据被代理的接口来动态生成代理类的class文件,并加载class文件运行的过程,通过反编译被生成的$Proxy0.class文件发现: ...

  7. c++11多线程记录1 -- std::thread

    启动一个线程 话不多说,直接上代码 void func(); int main() { std::thread t(func); //这里就开始启动线程了 t.join(); // 必须调用join或 ...

  8. Django-12-auth认证组件

    1. 介绍 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. Django作为一个完美主义者的终极框架,当然也会 ...

  9. 2019-7-16 import / from...import... 模块的调用

    模块调用的总结:如果你是pycharm打开文件,会自动帮你把文件根目录加到system.path中,你要调用模块直接以根目录为基准开始找.1.假如你要调用和文件根目录为同级的文件,你直接import ...

  10. 《学渣Linux笔记》——关于.bashrc与profile(涉及交互式与非交互式、登录与非登录shell)

    <学渣Linux笔记>--关于.bashrc与profile(涉及交互式与非交互式.登录与非登录shell) 1.基本概念(个人理解) 交互式shell:等待用户输入,并执行相应操作的sh ...