ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

基于tomcat的高可用性+nginx(haproxy)反向代理+session服务器memcached(redis)

2021-12-31 18:37:13  阅读:240  来源: 互联网

标签:haproxy tomcat memcached redis nginx session usr local


前提:需要先安装java,本质:运行在java虚拟机上的一个程序

功能:tomcat是web应用服务器,将java程序运行在tomcat内,将程序的结果以web的形式返还给用户,用户访问是结果来自于java的执行结果;nginx和apche是静态服务器,java它们不支持;

注意:网页升级后,需要清除缓存在work较深的jsp文件夹里保存

clipboard

tomcat的根目录结构:

安装路径:/usr/local/tomcat/webapps/ROOT

tomcat会认为webapps下的每个目录是一个单独的java应用,所以网站的ROOT和

配置文件:

修改子配置文件需要注意文件的属性,需要修改所属组和所有者

结合反向代理实现tomcat部署

nginx+tomcat

tomcat负载均衡

会话保持方式:

会话黏性:

基于session和cookie的来进行,相同的向统一提供服务的机器进行调度

session复制:Tomcat自己的提供的多播集群,通过多播将任何一台的session同步到其它节点。

缺点

Tomcat的同步节点不宜过多,互相即时通信同步session需要太多带宽;每一台都拥有全部session,内存损耗太多

需要修改两个地方的配置

session 共享服务器:使用memcached、redis做共享的Session服务器

memcached:小型缓存服务器

Session 问题方案总结

1. session绑定,基于IP或session cookie的。其部署简单,尤其基于session黏性的方式,粒度小,对负载均衡影响小。但一旦后端服务器有故障,其上的session丢失。

2. session复制集群,基于tomcat实现多个服务器内共享同步所有session。此方法可以保证任意一台后端服务器故障,其余各服务器上还都存有全部session,对业务无影响。但是它基于多播实现心跳,TCP单播实现复制,当设备节点过多,这种复制机制不是很好的解决方案。且并发连接多的时候,单机上的所有session占据的内存空间非常巨大,甚至耗尽内存。

3. session服务器,将所有的session存储到一个共享的内存空间中,使用多个冗余节点保存session,这样做到session存储服务器的高可用,且占据业务服务器内存较小。是一种比较好的解决session持久的解决方案。

不过以上这些方法都是在内存中实现了session的保持,可以使用数据库或者文件系统,把session数据存储起来,持久化。这样服务器重启后,也可以重新恢复session数据。不过session数据是有时效性的,是否需要这样做,视情况而定

实验:基于tomcat的高可用性+nginx(haproxy)反向代理+session服务器memcached(redis)

实验规划:

clipboard

tomcat二进制安装tomcat1和tomcat2:

yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz

tar xvf apache-tomcat-8.5.64.tar.gz -C /usr/local/ 

cd /usr/local/

#指定PATH变量

ln -s apache-tomcat-8.5.64/ tomcat

echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh

. /etc/profile.d/tomcat.sh

useradd -r -s /sbin/nologin tomcat

cat > /usr/local/tomcat/conf/tomcat.conf << EOF

#两个变量至少设置一项才能启动 tomcat,这行是至需要将java路径指向出来,如是yum安装通如下路径:

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/

#JAVA_HOME=/usr/local/jdk

#JRE_HOME=/usr/local/jdk/jre

EOF

chown -R tomcat.tomcat /usr/local/tomcat/

#创建tomcat.service文件

cat > /lib/systemd/system/tomcat.service << EOF

[Unit]

Description=Tomcat

After=syslog.target network.target 

[Service]

Type=forking

EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

User=tomcat

Group=tomcat

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable --now tomcat.service
相同情况安装tomcat2

nginx+tomcat实现动静分离:

clipboard

tomcat安装完毕;

yum install nginx -y

#增加3个页面

echo /usr/local/tomcat/webapps/ROOT/tomcat1_static.html >/usr/local/tomcat/webapps/ROOT/test.html

echo /usr/local/tomcat/webapps/ROOT/tomcat1_dynamic.jsp >/usr/local/tomcat/webapps/ROOT/test.jsp

echo nginx1 > /usr/share/nginx/html/test.html

vim /etc/nginx/nginx.conf

#下面位置增加这么3行

location ~* \.jsp$ {

proxy_pass http://127.0.0.1:8080; 

}
clipboard

curl 192.168.37.105/test.html

curl 192.168.37.105/test.jsp
clipboard

nginx实现负载均衡:

vim /etc/nginx/nginx.conf

#添加如下语句块:

upstream tomcat-server {

#ip_hash; 

server t1.lijian.com:8080;

server t2.lijian.com:8080;

}

location ~* \.(jsp|do)$ {

proxy_pass http://tomcat-server;

}

systemctl restart nginx
clipboard

配置代理103上的hosts文件

vim /etc/hosts

192.168.37.105 t1.lijian.com t1

192.168.37.106 t2.lijian.com t2
clipboard

在tomcat1上安装配置memcached:

yum install memcached -y

检查配置文件,无问题

clipboard

cat /etc/sysconfig/memcached 

PORT="11211"     #监听端口

USER="memcached" #启动用户

MAXCONN="1024"  #最大连接数

CACHESIZE="64"  #最大使用内存

OPTIONS="-l 127.0.0.1,::1" #其他选项

修改tomcat1配置文件:

vim /usr/local/tomcat/conf/server.xml

#修改默认页面

<Engine name="Catalina" defaultHost="www.lijian.com">

#配置虚拟机

<Host name="www.lijian.com" appBase="/data/webapps"

unpackWARs="true" autoDeploy="true">

</Host>
clipboard

clipboard

#创建测试页面:

vim /data/webapps/ROOT/index.jsp

<%@ page import="java.util.*" %> 

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>tomcat test</title>

</head>

<body>

<div>On <%=request.getServerName() %></div>

<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>

<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>

<%=new Date()%>

</body>

</html>

#修改权限

chown -R tomcat.tomcat /data/webapps/
测试session在变化:

clipboard

clipboard

#sticky 模式配置msm

vim /usr/local/tomcat/conf/context.xml

###倒数第一行前,即</Context>行的前面,加下面内容

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:192.168.37.105:11211,n2:192.168.37.106:11211"                     

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

#相关包放到/usr/local/tomcat/lib下

asm-5.2.jar

kryo-3.0.3.jar

kryo-serializers-0.45.jar

memcached-session-manager-2.3.2.jar

memcached-session-manager-tc8-2.3.2.jar

minlog-1.3.1.jar

msm-kryo-serializer-2.3.2.jar

objenesis-2.6.jar

reflectasm-1.11.9.jar

spymemcached-2.12.3.jar

tomcat2的配置:按照tomcat配置

#配置msm

vim /usr/local/tomcat/conf/context.xml

###倒数第一行前,即</Context>行的前面,加下面内容

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:192.168.37.105:11211,n2:192.168.37.106:11211"                     

failoverNodes="n2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

#non-sticky 模式配置msm

#在前面实验基础上修改,memcached配置不变,只需要修改tomcat配置

sticky="false"

sessionBackupAsync="false"

lockingMode="uriPattern:/path1|/path2"
clipboard

测试:

clipboard

clipboard

redis缓存

yum -y install redis

sed -i.bak 's/^bind.*/bind 0.0.0.0/' /etc/redis.conf

systemctl enable --now redis

#和non-sticky的memcached相比,只修改此行

vim /usr/local/tomcat/conf/context.xml 

memcachedNodes="redis://10.0.0.103:6379"
clipboard

标签:haproxy,tomcat,memcached,redis,nginx,session,usr,local
来源: https://www.cnblogs.com/fengshen220/p/15754107.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有