热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tomcat+Nginx+Memcached综合案例

Tomcat+Nginx+Memcached综合案例说明通过Nginx解析静态页面并将动态负载均衡调度给后面的多个Tomcat,Tomcat解析java动态程序。由于http是无状

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.31nginx.cluster.comnginx(yum安装)
192.168.1.32tomcat1.cluster.comtomcat-9.0
192.168.1.33tomcat2.cluster.comtomcat-9.0
192.168.1.34memcached.cluster.commemcached(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:11211
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
memcached 4419 memcached 26u IPv4 51021 0t0 TCP *:memcache (LISTEN)
memcached 4419 memcached 27u IPv6 51022 0t0 TCP *:memcache (LISTEN)
memcached 4419 memcached 28u IPv4 51025 0t0 UDP *:memcache
memcached 4419 memcached 29u IPv6 51026 0t0 UDP *:memcache

nginx部署

1)安装nginx

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

2)配置文件配置

# 创建一个虚拟主机
[root@nginx ~]# vim /etc/nginx/conf.d/www.conf
upstream tomcat {
server 192.168.1.32:8080 weight=1;
server 192.168.1.33:8080 weight=1;
}
server {
listen 88 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 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# 创建测试文件
[root@nginx ~]# mkdir /opt/project
[root@nginx ~]# echo "Nginx IP:192.168.1.31" >> /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.8.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.21.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-9.0.21 /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) 64-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 :80
LISTEN 0 100 :::8080 :::* users:(("java",pid=2993,fd=54))
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=2993,fd=74))
LISTEN 0 100 :::8009 :::* users:(("java",pid=2993,fd=59))

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
# 在里面加上下面一段
memcachedNodes="n1:192.168.1.34:11211"
lockingMode="auto"
sticky="false"
requestUriIgnorePattern= ".*\.(png|gif|jpg|css|js)$"
sessiOnBackupAsync= "false"
sessiOnBackupTimeout= "100"
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()%>

SessionIP:<%=request.getServerName()%>

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:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 4672 root 63u IPv6 52084 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

 


推荐阅读
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 从U ... [详细]
  • Linux设备驱动开发详解-Note(3)---驱动设计的硬件基础(1)
    驱动设计的硬件基础(1)成于坚持,败于止步处理器分类不做过多说明,处理器类型很多,大同小异存储器存储器可分为只读储存器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光介质存储器和磁介质存储 ... [详细]
author-avatar
天地菲人间_984
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有