本次实现项目内容:
分别实现下述架构方案:
(1)nginx|apache(mod_proxy_ajp) --> tomcat;
(2) apache(mod_proxy_ajp) --> tomcat servers;额外实现session sticky;
(3) haproxy --> apache(mod_proxy_ajp) --> tomcat session cluster;

架构环境(博主此次使用的虚拟机都是CentOS7.5):
172.16.75.5 反代服务器
172.16.75.6 Tomcat服务器1
172.16.75.7 Tomcat服务器2

架构一:
客户端-->nginx反代服务器-->Tomcat服务器1
nginx反代服务器中的操作:
~]# vim /etc/nginx/nginx.conf

添加这两行即可;
~]# nginx -t //检查是否格式正确
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
~]# nginx

~]#vim /etc/hosts
172.16.75.6 tc1.wzc.com
做到这里,我们的nginx反代服务器的配置就完成了;
Tomcat1中的操作:
首先我们要安装JDK:OpenJDK:
安装JDK:java-VERSION-openjdk、java-VERSION-openjdk-headless、java-VERSION-openjdk-devel
这里我们直接:
~]#yum install java-devel -y //这样安装即可
~]# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
如果系统没有定义JAVA_HOME环境变量,需要配置并指定Java的安装路径;
OpenJDK:
~] # vim /etc/profile.d/java.sh //写入这下面的一行内容即可
export JAVA_HOME=/usr
~]# source /etc/profile.d/java.sh

接下来是安装Tomcat:
这里我们使用官方提供的Tomcat Binary Release From ASF进行安装(博主是用的是apache-tomcat-8.0.23.tar.gz源码包,内部包含catalina.sh脚本文件):
~]# tar -xf apache-tomcat-VERSION.tar.gz -C /usr/local
~]# cd /usr/local
~]# ln -sv /usr/local/apache-tomcat-VERSION tomcat
~]# cat /etc/profile.d/tomcat.sh //下面是要在里面要编辑的内容,用来在根目录中使用catalina.sh脚本用的
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
~]# source /etc/profile.d/tomcat.sh
~]# mkdir -pv /tcapps/webapps/ROOT/{classes,lib,WEB-INF,META-INF}
~]# vim /tcapps/webapps/ROOT/index.jsp //一个简单的页面测试内容,这里博主就不粘图片了方便大家使用
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="red">tc1.wzc.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("tc1.wzc.com","tc1.wzc.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html> //保存即可
~]# vim /usr/local/tomcat/conf/server.xml

添加(不是修改)箭头所指内容即可;
~]# catalina.sh start
这两个端口打开即可;
这是我们在客户端修改host文件添加172.16.75.5 java.wzc.com和172.16.75.6 tc1.wzc.com 这样就可以访问 java.wzc.com了,他会被直接反代到tc1.wzc.com,访问如下:

架构二:
客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat服务器1
LAMT:
Linux + Apache(httpd) + MySQL/MariaDB + Tomcat
httpd的代理功能模块:
proxy_module:实现httpd代理功能的核心模块;
proxy_ajp_module:以ajp协议的客户端身份实现反向代理功能;
proxy_http_module:以http协议的客户端身份实现反向代理功能;
jk_module:以ajp协议的客户端身份实现反向代理功能;

三种代理模型:Client(http/https) --> httpd(proxy_http_module)(http) --> tomcat(http connector)Client(http/https) --> httpd(proxy_ajp_module)(http) --> tomcat(ajp connector)Client(http/https) --> httpd(jk_module)(http) --> tomcat(ajp connector)第一种模型:使用http协议连接tomcat服务器的http连接器;/etc/httpd/conf.d/proxy_http_mod.conf<VirtualHost *:80>ProxyRequests OffProxyPreserveHost On<Proxy *>Require all granted</Proxy>ProxyPass / http://tc1.wzc.com:8080<Location />Require all granted</Location></VirtualHost>第二种模型:使用ajp协议连接tomcat服务器的ajp连接器;
/etc/httpd/conf.d/proxy_ajp_mod.conf<VirtualHost *:80>ProxyRequests OffProxyPreserveHost On<Proxy *>Require all granted</Proxy>ProxyPass / ajp://tc1.wzc.com:8009<Location />Require all granted</Location></VirtualHost>第三种模型:使用mod_jk模块通过ajp协议连接tomcat服务器的ajp连接器;mod_jk.so模块不是httpd自带的模块,属于第三方功能模块,需要额外编译安装;此模块有tomcat官方提供,可以从tomcat.apache.org站点下载tomcat-connector程序包;进行编译安装即可;确保系统上已经安装了完整的开发环境,并且保证httpd-devel也已经正确安装;

]# yum -y groupinstall "Development Tools" "Server Paltform Develop"
]# yum -y install httpd-devel
]# tar xf tomcat-connectors-1.2.40-src/native
]# cd tomcat-connectors-1.2.40-src/native
]# ./configure --with-apxs=/usr/bin/apxs
]# make -j 4 && make install

    安装成功后,mod_jk模块会被复制到/usr/lib64/httpd/modules/mod_jk.so对于mod_jk来说,所有后端被代理的服务器,都被称为"worker";创建mod_jk的配置文件:/etc/httpd/conf.d/proxy_jk_mod.confLoadModule jk_module modules/mod_jk.soJkWorkersFile /etc/httpd/conf.d/workers.propertiesJkMount /* tc1JkLogFile logs/jk_module.logJkLogLevel warnJkMount /jk-status tcstat<Location />Require all granted</Location>创建workers的属性定义文件:/etc/httpd/conf.d/workers.propertiesworker.list=tc1,tcstatworker.tc1.host=172.16.75.6worker.tc1.port=8009worker.tc1.type=ajp13worker.tcstat.type=status重新启动httpd即可;

这里我们使用apache(mod_proxy_ajp)
在反代服务器中的操作:
~]# nginx -s stop
~]# cd /etc/httpd/conf.d/
conf.d]# vim proxy_ajp_lb.conf

保存,完成反代服务器中的操作;
在Tomcat1中的操作:
~]# vim /usr/local/tomcat/conf/server.xml

像我一样,把这一段注释掉<!-- -->注释号

修改之前的localhost为图示内容即可;

~]# catalina.sh stop //隔几秒在开启
~]# catalina.sh start //再次开启
这是我们就可以在客户端中进行访问了:

架构三(LAMT负载均衡):
客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat服务器1,Tomcat服务器2
这里我们还是使用apache(mod_proxy_ajp)
在反代服务器中的操作:
~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf
<Proxy "balancer://tcsrvs">
BalancerMember ajp://tc1.wzc.com:8009
BalancerMember ajp://tc2.wzc.com:8009
ProxySet lbmethod=byrequests

</Proxy>

<VirtualHost *:80>
ServerName java.wzc.com
ProxyRequests Off
ProxyPass / balancer://tcsrvs
<Location />
Require all granted
</Location>
</VirtualHost>
~]# systemctl restart httpd
~]#vim /etc/hosts
172.16.75.7 tc2.wzc.com
在Tomcat2中的操作同Tomcat1,该安装安装,该编辑配置文件并重载的就和Tomcat1一样,该注释注释,该添加添加,该修改修改;
然后在客户端访问java.wzc.com即可看到如下图示,重复刷新查看效果:


怎样额外实现session sticky呢?
这里只需在反代服务器中修改配置文件即可:
~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://tcsrvs">
BalancerMember ajp://tc1.wzc.com:8009 route=tc1
BalancerMember ajp://tc2.wzc.com:8009 route=tc2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</Proxy>

<VirtualHost *:80>
ServerName java.wzc.com
ProxyRequests Off
ProxyPass / balancer://tcsrvs
<Location />
Require all granted
</Location>
</VirtualHost>
~]# systemctl restart httpd
再次访问:

再怎么刷新,也都是这一种显示了,但这时负载均衡就失去了意义;

架构四:
客户端-->apache(mod_proxy_ajp,mod_proxy_http,mod_jk)反代服务器-->Tomcat session cluster
这里我们还是使用apache(mod_proxy_ajp):
在反代服务器中的操作:
~]# vim /etc/httpd/conf.d/proxy_ajp_lb.conf
<Proxy "balancer://tcsrvs">
BalancerMember ajp://tc1.wzc.com:8009
BalancerMember ajp://tc2.wzc.com:8009
ProxySet lbmethod=byrequests

</Proxy>

<VirtualHost *:80>
ServerName java.wzc.com
ProxyRequests Off
ProxyPass / balancer://tcsrvs
<Location />
Require all granted
</Location>
</VirtualHost>
~]# systemctl restart httpd
然后在Tomcat服务器中的操作
~]# vim /usr/local/tomcat/conf/server.xml //Tomcat2中要添加的内容,在Tomcat1中做同样的操作修改address="172.16.75.7"为address="172.16.75.6"即可;
<Host name="tc2.wzc.com" appBase="/tcapps/webapps"
unpackWARs="true" autoDeploy="true">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.DeltaManager"expireSessionsOnShutdown="false"notifyListenersOnReplication="true"/><Channel className="org.apache.catalina.tribes.group.GroupChannel"><Membership className="org.apache.catalina.tribes.membership.McastService"address="228.100.0.4"port="45564"frequency="500"dropTime="3000"/><Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"address="172.16.75.7"port="4000"autoBind="100"selectorTimeout="5000"maxThreads="6"/><Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"><Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/></Sender><Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/><Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel><Valve className="org.apache.catalina.ha.tcp.ReplicationValve"filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/><Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"tempDir="/tmp/war-temp/"deployDir="/tmp/war-deploy/"watchDir="/tmp/war-listen/"watchEnabled="false"/><ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>
</Host>
~]# catalina.sh stop //还是和刚才一样等一会在开启,并且两台Tomcat服务器中做相同操作
~]# catalina.sh start

为集群内生效的webapp提供web.xml部署描述符配置文件,并于其中添加<distributable/>元素;
~]# cp /usr/local/tomcat/conf/web.xml /tcapps/webapps/ROOT/WEB-INF
~]# vim /tcapps/webapps/ROOT/WEB-INF/web.xml
添加这个<distributable/>,如图所示;
~]#vim /etc/sysconfig/network-scripts/ifcfg-配置_1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=172.16.75.6
PREFIX=16
DEFROUTE=yes
NAME=$'\751\605\615\747\675\656 1'
UUID=951188c1-b210-4027-8e67-669095a737e8
ONBOOT=yes
GATEWAY=172.16.75.5 //设置网关,两台Tomcat服务器做相同配置
这时我们就可以在客户端进行访问了,重复刷新看到如下内容:


看到的结果是session ID和timestamp是不变的,只有tc1.wzc.com和tc2.wzc.com时轮流显示的。

转载于:https://blog.51cto.com/huliheeyu/2149411

LNMT、LAMT架构简单实例相关推荐

  1. velocity用法简单实例说明 .

    http://blog.csdn.net/renxianzuo/article/details/4457381 2009-08-18 01:48 3516人阅读 评论(8) 收藏 举报 velocit ...

  2. 基于Linux的 Open×××网络之网络架构应用实例

    基于Linux的 Open×××网络之网络架构应用实例 Open××× 概述 Open××× 是一个开源的加密隧道构建工具,基于 OpenSSL 的 SSL/TLS 协议,可以在 Internet中实 ...

  3. c语言怎么取字符串首字母,C语言 字符串首字母转换成大写简单实例

    C语言 字符串首字母转换成大写简单实例 C语言 字符串首字母转换成大写简单实例 举例: 输入:this is a book 返回:This Is A Book #include #include #i ...

  4. 一个使用Ruby on Rails开发LBS网站的简单实例

    一个使用Ruby on Rails开发LBS网站的简单实例 cheungmine 2011-7 这几天一直在学习使用Ruby on Rails(RoR),想建立一个功能全面一点的LBS(Locatio ...

  5. Istio 架构简单说明

    Istio 架构简单说明 Istio 1.5之前 整体架构 控制平面 版本说明 数据平面 Istio 1.5之前 整体架构 Istio服务网格之前说过分为控制平面和数据平面两部分 控制平面Pilot负 ...

  6. java查询mysql装载bean_jsp与javabean链接mysql数据库并查询数据表的简单实例源码

    jsp与javabean链接mysql数据库并查询数据表的简单实例源码.这个简单的实例是给新手学习的,或者一些高手临时忘记怎么使用jsp操作mysql数据库时候查找的,包括了建立mysql数据库连接的 ...

  7. js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称

    1,列举对象属性的名称 <script language="javascript"> var obj=new Object(); obj.a="您好,我是田洪 ...

  8. 关于webservice的异步调用简单实例

    于webservice的异步调用简单实例 无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明. ...

  9. (三)AJAX基本介绍和简单实例03

    (三)AJAX基本介绍和简单实例03-----Ajax与数据库的动态应用 前台显示界面: 选择所有客户之后: 选择其中一个客户---杜森: Demo03.html代码 <html> < ...

  10. protobuf和socket通信简单实例

    protobuf和socket通信简单实例   protobuf是 Google 公司内部的混合语言数据标准,可以用来定义通信的协议,由于其有序列化和反序列化的操作,减小了存储或通信的数据量,从而达到 ...

最新文章

  1. Datawahle文化衫来了!
  2. 9path 导致的一场冤假错案
  3. channel rabbitmq 配置_「喵咪MQ(2)」RabbitMQ单机模式使用
  4. Python练习-一个简单易懂的迭代器,了解一下
  5. linux的idle命令,DBA 常用Linux命令
  6. 踏上Silverlight的征程 体验Silverlight之美
  7. Java设计模式-简单工厂模式(Static Factory Method)
  8. Elman神经网络介绍以及Matlab实现
  9. 实现网络IPv6平滑演进的DS-Lite CGN技术
  10. 15-基于51单片机的篮球计时器
  11. thon3爬虫之urllib携带cookie爬取网页的方法
  12. java.util.zip.ZipException: invalid stored block lengths的错误
  13. Vant2 源码分析之 vant-sticky
  14. https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot
  15. 教程篇(6.4) 07. 诊断和故障排除 ❀ FortiManager ❀ Fortinet 网络安全专家 NSE 5
  16. Mybatis + mysql获取元数据时出现问题以及解决
  17. 中国石油大学(北京)-《外国文学作品选读》在线考试
  18. 聊聊跨端技术的本质与现状
  19. 黑客入侵应急分析手工排查
  20. IE11卸载不掉的问题

热门文章

  1. uva 1587 题解
  2. python二维数组切片_python语言多维数组切片方法
  3. 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
  4. 贝叶斯公式和共轭分布
  5. 一个求整系数多项式的全部有理根的方法
  6. 一台电脑安装多个Chrome
  7. (转)CocosCreator零基础制作游戏《极限跳跃》五、制作游戏主场景背景滚动
  8. js面向对象写法及栈的实现
  9. ESP8266文档阅读ESP8266 SDK 入门指南
  10. 新建samba配置步骤