nginx或httpd实现负载均衡tomcat(三)
接博客nginx或httpd实现反向代理tomcat并实现会话保持(二)
实例四:使用httpd负载均衡后端tomcat服务
第一步:准备两个tomcat服务器节172.16.240.203
修改tomcat的server.xml配置文件,添加一个host。
<Host name="tomcatA.com"appBase="/myweb/webapp/" unpackWARS="TRUE"autoDeploy="no">
<Contextpath="webapp" docBase="Root" reloadable="true"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/myweb/logs"
prefix="myweb_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
</Host>
在修改其默认engine
<Engine name="Catalina"defaultHost="tomcatA.com" jvmRoute="tomcatA">
然后在为其提供测试文件
[root@lpw4 webapp]# cat Root/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.lpw.com</font></h1>
<table border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("lpw.com","lpw.com");%>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
启动tomcat服务,并在浏览器中测试:
第一个节点准备完毕
修改tomcat的配置文件server.xml,添加一个host
<Host name="tomcatB.lpw.com"appBase="/myweb/webapp/" unpackWARS="TRUE"autoDeploy="no">
<Contextpath="webapp" docBase="Root" reloadable="true"/>
<ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="/myweb/logs"
prefix="myweb_access_log." suffix=".txt"
pattern="%h %l %u %t"%r" %s %b" />
</Host>
并修改其默认的engine:
<Engine name="Catalina"defaultHost="tomcatB.lpw.com" jvmRouter="tomcatB"
为此节点准备测试页面:
启动tomcat并在浏览器中测试:
两个节点准备完毕。
接下来配置httpd的负载均衡
使用httpd与后端tomcat链接的有三种方式:
1、 基于mod_httpd模块(使用http协议)与后端tomcat实现负载均衡;
2、 基于mod_ajp模块(使用ajp协议)与后端tomcat实现负载均衡;
3、 基于mod_jk模块(使用ajp协议)与后端tomcat实现负载均衡;
每一种方案使用的模块:
(1) apache:
mod_proxy
mod_proxy_http
mod_proxy_balancer
tomcat:
http connector
(2) apache:
mod_proxy
mod_proxy_ajp
mod_proxy_balancer
tomcat:
ajp connector
(3) apache:
mod_jk #mod_jk自身就有负载均衡的功能,因此不需要mod_balancer模块
tomcat:
ajp connector
第一种方案:基于module_httpd模块实现负载均衡
修改虚拟主机的配置文件:
<proxy balancer://lbcluster1>
BalancerMember http://172.16.249.203:8080 loadfactor=1 route=tomcatA
BalancerMember http://172.16.249.204:8080 loadfactor=1 route=tomcatB
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
然后重启httpd服务,并在浏览器中测试:
要实现session绑定,只需修改虚拟主机的配置文件:
Header add Set-Cookie"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember http://172.16.249.203:8080 loadfactor=1 route=tomcatA
BalancerMember http://172.16.249.204:8080 loadfactor=1 route=tomcatB
ProxySet stickysession=ROUTEID
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
重启httpd服务,并用浏览器测试:
第二种方法:基于mod_ajp实现负载均衡tomcat:
修改虚拟主机的配置文件如下
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.249.203:8009 loadfactor=1 route=tomcatA
BalancerMember ajp://172.16.249.204:8009 loadfactor=1 route=tomcatB
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
在浏览器中测试:
要实现session,修改虚拟主机配置文件如下,
#Header add Set-Cookie"ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
BalancerMember ajp://172.16.249.203:8009 loadfactor=1 route=tomcatA
BalancerMember ajp://172.16.249.204:8009 loadfactor=1 route=tomcatB
# ProxySet stickysession=ROUTEID
</proxy>
<VirtualHost *:80>
ServerName tomcat.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<proxy *>
Require all granted
</proxy>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/
<Location />
Require all granted
</Location>
</VirtualHost>
重启httpd服务,并使用浏览器测试:
注意:以上两种方法都是使用proxy_balancer_module模块实现的负载均衡,此模块也自带了内置的后端各节点主机管理页面,因此,此页面也需要做访问控制,在虚拟主机配置文件中启用此功能。添加如下Location段。
<Location /balancer-manager> #balancer-manager是自定义的网页访问时的页面名称
SetHandlerbalancer-manager #此项指明内置的管理器为balancer-manager,这是内置的固定格式。
Proxypass! #感叹号表示在做负载均衡时请求的资源是balancer-manager页面的时候不想后端节点做负载均衡。
require ip 172.16.1.104 #指明访问控制的允许访问的主机ip地址
require all denied #指明此页面拒绝其他用户访问。此页面也可以使用基于用户的访问控制。
</Location>
或者基于用户的访问控制:配置如下:
基于ip地址的访问控制测试:
在其他主机上使用curl命令来访问此页面
基于用户访问控制测试:
第三种方法:使用mod_jk实现负载均衡后端tomcat
这里首先配置mod_jk模块实现反向代理后端tomcat:
mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器)。
mok_jk模块实现与后端tomcat做负载均衡也是基于ajp协议的,因为mod_jk模块已经不在是httpd服务的自带模块,因此要使用mod_jk模块实现,必须手动编译mod_jk模块为httpd的模块才可使用。
首先解压tomcat-connectors软件包:
[root@lpw3 src]# tar -xftomcat-connectors-1.2.40-src.tar.gz -C /usr/local/
[root@lpw3 local]# cdtomcat-connectors-1.2.40-src/
[root@lpw3 tomcat-connectors-1.2.40-src]#cd native/
要编译mod_jk为httpd的模块,需要指定—with-apxs选项,表示将mod_jk模块编译为httpd的模块,这里使用的是httpd-2.4,支持动态装载模块,因此只要编译mod_jk就可以直接让httpd加载,所有首先确认是否有apxs工具,如:
而apxs是由http-devel包提供,因此安装http-devel包即可。(需要安装开发包和开发工具)
[root@lpw3 native]# yum install http-devel
在native目录下执行./configure
[root@lpw3 native]# ./configure --with-apxs
[root@lpw3 native]# make && makeinstall
然后在httpd的配置文件中装载此模块:
安装完成后可httpd的模块目录下查看是否有此模块:
此模块安装后不会自动被httpd装载,需要手动装载,为此模块创建一个独立配置文件:
[root@lpw3 conf.d]# vim http-jk.conf
LoadModule jk_module modules/mod_jk.so #加载mod_jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties #指明mod_jk模块使用的配置worker属性的文件,此文件需要自己创建
JkLogFile logs/mod_jk.log #开启日志功能
JkLogLevel debug #开启调试功能
JkMount /* TomcatA #指明将所有的请求资源都代理至后端tomcaA来处理
JkMount /status/ stat1 #stat1是jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。
然后创建workers.properties文件
[root@lpw3 conf.d]# vim workers.properties
worker.list=TomcatA,stat1 #指明worker名单列表,这里一个是TomcatA,后端的tomcat服务器,一个是stat1,是jk模块内置的一个worker。
worker.TomcatA.port=8009 #指明后端tomcat的端口
worker.TomcatA.host=172.16.249.204 #指明后端tomcat的ip地址
worker.TomcatA.type=ajp13 #指明基于ajp-1.3协议与后端tomcat进行连接
worker.TomcatA.lbfactor=1 #指明负载均衡时后端tomcatA主机的权重,(mo_jk做负载均衡时此项必须给出一个值,只做反向代理的情况下可以不指定此项)
worker.stat1.type = status #指明stat1这个worker的类型,可以认为此项是默认的写法。
[root@lpw3 conf.d]# httpd -t
Syntax OK
[root@lpw3 conf.d]# systemctl reloadhttpd.service
在浏览器中查看:
由于status页面不应该让所有人都能访问,因此要对此页面做访问控制:
修改http-jk.conf配置文件,在其中添加访问控制:
<Location /status> #定义对status页面做访问控制
require ip 172.16.1.104 #定义只允许172.16.249.104访问此页面
require all denied #拒绝所有的主机访问
</Location>
然后检查httpd的配置文件是否有错误,重新载入配置文件,并在另一主机上使用curl命令访问此页面:
[root@lpw3 conf.d]# vim http-jk.conf
[root@lpw3 conf.d]# httpd -t
Syntax OK
[root@lpw3 conf.d]# systemctl reloadhttpd.service
[root@lpw3 conf.d]# curl http://172.16.249.208/status/ #这里使用虚拟机的curl命令模拟访问status页面。
然后开始配置使用mod_jk模块实现负载均衡后端tomcat服务器:
编辑http-jk.conf配置文件:
[root@lpw3 conf.d]# vim http-jk.conf
LoadModule jk_module modules/mod_jk.so #加载mod_jk模块
JkWorkersFile /etc/httpd/conf.d/workers.properties #定义mok_jk模块用来定义个work属性的配置文件,负载均衡的后端主机的配置都在此文件中,需要手动编辑。
JkLogFile logs/mod_jk.log #开启日志功能
JkLogLevel debug #开启调试功能
JkMount /* lbcluster1 #定义所有请求使用负载均衡调度
JkMount /status/ stat1 #定义status页面
然后编辑workers.properties文件
worker.list = lbcluster1,stat1 #定义worker列表,第一个为负载均衡worker名,第二个是内置的stat1的worker。
worker.TomcatA.type = ajp13 #定义负载均衡的一个节点node为TomcatA,指明使用的协议为ajp1.3版本
worker.TomcatA.host = 172.16.249.203 #定义TomcatA的ip地址
worker.TomcatA.port = 8009 #指明TomcatA 监听的端口
worker.TomcatA.lbfactor = 1 #指明TomcataA的权重为1
worker.TomcatB.type = ajp13 #定义负载均衡的一个节点node为TomcatB,指明使用的协议为ajp1.3版本.
worker.TomcatB.host = 172.16.249.204 #定义TomcatB的ip地址
worker.TomcatB.port = 8009 #指明TomcatB 监听的端口
worker.TomcatB.lbfactor = 1 #指明TomcataB的权重为1
worker.lbcluster1.type = lb #指明lbcluster1这个worker的类型是lb(表示负载均衡),此项是定义负载均衡的关键。
worker.lbcluster1.sticky_session = 0 #指明是否开启session绑定机制,0表示不开启,1表示开启,如果后端是session集群的情况下,可以不开启此功能。
worker.lbcluster1.balance_workers =TomcatA, TomcatB #定义负载均衡的两个节点。
worker.stat1.type = status #stat1是jk模块内置的一个worker,用来显示status管理页面信息的,此页面不应该让管理员以外的人查看,因此需要做访问控制。
然后检查httpd配置文件的语法,并重新载入配置文件,在浏览器中测试:
要想实现session绑定只需修改worker.lbcluster1.sticky_session = 1即可
实例五:使用nginx做负载均衡后端tomcat服务器,只需要将前端调度器使用nginx实现:
编辑nginx的配置文件:
upstream upserver{
server 172.16.249.203:8080 weight=1;
server 172.16.249.204:8080 weight=1;
}
server {
listen 80;
location ~* \.(jsp|do)$ {
proxy_pass http://upserver;
}
}
使用浏览器测试:
要实现session绑定功能,只需要再nginx的配置文件中添加调度算法,基于ip_hash算法。
即可实现基session绑定机制。
注意:一个tomcat实例最大占据内存为32G,因此在一个性能良好的服务器上,可以同时启动多个tomcat实例(只要使用不同的端口),即可提高服务器的利用率!
后续实例见博客四:tomcat实现session集群及tomcat+memcached共享session服务器实现会话保持
转载于:https://blog.51cto.com/qikexing/1709449
相关文章:

为 PHP 应用提速、提速、再提速
原文地址: http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps1/ http://www.ibm.com/developerworks/cn/opensource/os-php-fastapps2/index.html为 PHP 应用提速、提速、再提速!PHP 是一种脚本语言,常用于创建 Web 应用程序…

冬奥会夺金的背后杀手锏,竟是位 AI 虚拟教练
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 近日,一则消息登上了热搜: 2月14日晚,在北京冬奥会自由式滑雪女子空中技巧决赛中,徐梦桃为中国代表团再添一金。她选择了难度系数4.293的动作,…

Socket-实例
import socket,os,time server socket.socket() server.bind(("localhost",9999)) server.listen()while True:conn,addrserver.accept()print("new conn",addr)while True:print("等待新指令")data conn.recv(1024)if not data:print("客…

kcachegrind安装
http://kcachegrind.sourceforge.net/cgi-bin/show.cgi/KcacheGrindDownload http://hi.baidu.com/wangxinhui419/blog/item/4a7409c78c22b4c8d100608a.html http://wxiner.blog.sohu.com/156841393.html说明:linux下如果安装不上,直接下载windows版的吧…

Java【小考】
课上, 老师出了一个题: 考察:1、类的定义 2、类的属性 3、类的方法、重载、构造方法、代码块 题目是这样的: 设计 一个 类:Tree 要求: 1、包含main方法 2、属性:静态: String name ; double hei…

首个深度强化学习AI,能控制核聚变,成功登上《Nature》
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 最近,DeepMind 开发出了世界上第一个深度强化学习 AI ,可以在模拟环境和真正的核聚变装置中实现对等离子体的自主控制。 这项研究成果登上了《Nature》杂志。 托卡马克是一种用于…

windows下安装mysql8.0压缩版
下面总结下安装过程: 首先解压下载好的压缩版本。将解压后mysql的bin文件目录配置系统环境path变量中使用cmd打开命令窗口,输入mysqld --initialize命令初始化mysql的data数据目录,记住初始化完毕后,会在解压目录下生成一个data文…

Linux实时监控工具Nmon使用
官网:http://nmon.sourceforge.net/pmwiki.php?nMain.HomePage 下载:http://sourceforge.net/projects/nmon/files/nmon_linux_14g.tar.gz 解压: #chmod ux nmon_x86_64_sles11 #chmod 777 nmon_x86_64_sles11 版本不同,对应文件…

英特尔2022年投资者大会:公布技术路线图及重要节点
在英特尔2022年投资者大会上,英特尔CEO帕特基辛格和各业务部门负责人概述了公司发展战略及长期增长规划的主要内容。在半导体需求旺盛的时代,英特尔的多项长期规划将充分把握转型增长的机遇。在演讲中,英特尔公布了其主要业务部门的产品路线图…

20151102adonet2
实现增删改查 ExecuteNonQuery:执行增删改语句,返回值为该命令所影响的行数. ExecuteReader:执行查询,并返回 一个DataReader对象. ExecuteScalar:执行查询,返回查询数.(删除修改时判断记录是否存在) string strSql string.Format("select count(*) from RNews where New…

day07 -文件的基本操作
1、什么是文件? 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位文件的操作核心就:读、写即我们只需要对于进行读写操作,就是对操作系统发起请求,然后由操作系统将用户或者应用程序对文件的读写操作转换成具体的硬盘…

淘宝Tengine服务器开源
http://tengine.taobao.org/index_cn.htmlTengine是由 淘宝核心系统部基于Nginx开发的Web服务器,它在 Nginx的基础上,针对大访问量网站的需求,添加了很多功能和特性。Tengine的性能和稳定性已经在大型的网站如 淘宝网, 淘宝商城等…

22个案例详解Pandas数据分析/预处理时的实用技巧,超简单
作者 | 俊欣来源 | 关于数据分析与可视化今天小编打算来讲一讲数据分析方面的内容,整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货,我们大致会说Pandas计算交叉列表Pandas将字符串与数值转化成时间类型Pandas将字符串转化成数值类型Pandas当…

PL/SQL 中Returning Into的用法
ORACLE的DML语句中可以指定RETURNING INTO语句。RETURNING INTO语句的使用在很多情况下可以简化PL/SQL编程,少一次select into语句。DELETE操作:RETURNING返回的是DELETE之前的结果; INSERT操作:RETURNING返回的是INSERT之后的结果…

Java常用多线程辅助工具---countdownLatch
为什么80%的码农都做不了架构师?>>> 前言 上一篇博文说到semaphore,一个加强版的synchronized,该多线程辅助工具适用于控制对资源操作或者访问的场景。现在有一张场景是,需要等各个线程都都执行完了再进行下一步的操作…

听说,英特尔要对外开放 x86 授权?
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)同为主流芯片架构,相较于可申请授权的 ARM 和开源的 RISC-V,x86 一直以来都保持着“高高在上”的立场——唯有英特尔和 AMD 拥有 x86 授权。但目前看来,x86 的“高冷…

Linux下gedit显示行号
Gedit 编辑->视图

关于String数组的用法
android ContextWrapper.getResources(ContextWrapper.java:89) getResources()报错原因是在OnCreate方法外 无法完成Context的初始化 正确做法: String[] names;names new String[6];names[0] getResources().getString(R.string.a);names[1] getResources().g…

使用RabbitMQ做数据接收和处理时,自动关闭
场景:N个客户端向MQ里发送数据;服务器上有另一个控制台程序(假设叫ServerClient)来处理这里数据(往数据库保存)。方向为Client * n→MQSERVER→ServerClient 问题:ServerClient自动关闭,没有错误日志&#…

在 Python 中妙用短路机制
作者 | 费弗里来源 | Python大数据分析本期我们即将学习的是:Python中短路机制的妙用。不同于物理学中的「短路」(Short circuit)那般危险,Python中的短路机制非常有用,跟很多其他编程语言中的短路机制作用类似&#x…

《Advanced PHP Programming》读书笔记
此书无中文版,但是写的极好!本来想翻译的,可是时间不允许了。 http://www.amazon.com/Advanced-PHP-Programming-George-Schlossnagle/dp/0672325616/refpd_rhf_dp_p_t_1约定:加粗字体表示章节,由于时间关系解释性的说…

cookie记录用户的浏览商品的路径
在电子商务的网站中,经常要记录用户的浏览路径,以判断用户到底对哪些商品感兴趣,或者哪些商品之间存在关联。 下面将使用cookie记录用户的浏览过的历史页面。该网站将每个页面的标题保存在该页面的$TITLE 变量中,用户每访问一次&a…

如何快速写一个违背双亲委托机制的classloader
很多情况下,不得以必须写个classloader来满足需求。例如你一个工程里你想用相同的数据库的多个版本,自己制定了一个jar包目录,没有classloader管理等等。如果是一个遵循java已经规定好的机制的classloader(双亲委托以及加载依赖类…

让我们谈谈RAID
转自:http://soft.zdnet.com.cn/techupdate/2004/0330/397707.shtml 更新时间: 2004-03-30 17:14:00 作者: 赵效民 感觉写的很好就转来了。 RAID的种类 RAID的英文全称为Redundant Array of Inexpensive(或Independent) Disks&…

Ampere 携手 Rigetti 开发混合量子经典计算机
该合作旨在为价值 160 亿美元的机器学习市场提供服务,赋能机器学习应用的发展双方将把 Ampere Altra Max 处理器和 Rigetti 量子处理单元进行优化结合,为机器学习提供整合的云平台 2022 年 2 月 21 日,安晟培半导体科技有限公司(A…

[C++] NULL VS nullptr
NULL VS nullptr 转载于:https://www.cnblogs.com/tianhangzhang/p/4945623.html

swift 的defer使得资源的分配和释放代码可以放到一起
只是一种语法和逻辑上的优化

烂泥:haproxy学习之手机规则匹配
2019独角兽企业重金招聘Python工程师标准>>> 本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb。 今天我们来介绍下有关haproxy匹配手机的一些规则配置。 一、业务需要 现在根据业务的实际需要&a…

jQuery日期选择器插件date-input
官网:http://jonathanleighton.com/projects/date-input/下载: http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js http://github.com/jonleighton/date_input/raw/master/jquery.date_input.js http://github.com/jonleighton/date_inp…

厉害了,用Python绘制动态可视化图表,并保存成gif格式
作者 | 俊欣来源 | 关于数据分析与可视化最近有粉丝问道说“是不是可以将这些动态的可视化图表保存成gif图”,小编立马就回复了说后面会写一篇相关的文章来介绍如何进行保存gif格式的文件。那么我们就开始进入主题,来谈一下Python当中的gif模块。安装相关…