Nginx/Httpd负载均衡tomcat配置

  在前一篇博客中我们聊了下用Nginx和httpd对后端tomcat服务做反代相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13334180.html;今天我们来聊一聊用Nginx和httpd对tomcat集群做负载均衡的配置以及需要注意的点;在前边的演示和配置都是以单台tomcat来配置使用;但是在生产中单台tomcat实在支撑不了大规模的访问,这个时候我们就需要考虑把多台tomcat做成集群对外提供服务;多台tomcat做成集群对外提供服务就必然要有一个调度器来对客户端的请求做调度,常用的调度器有nginx httpd haproxy lvs等等;用这些调度器来对tomcat做负载均衡的配置和对其他web服务器做负载均衡的配置没有本质的不同;我们都可以把tomcat当作web服务器来配置就好;

  1、环境准备

  运行docker 启动两个tomcat容器当作后端tomcat server 并且把两台tomcat容器的网页目录分别用存储卷的方式映射到/tomcat/doc/tomcat1和tomcat1目录

  提示:以上就运行了两个tomcat容器,分别是tct1和tc2,并且我们把/usr/local/tomcat/webapps/myapp映射到宿主机的/tomcat/doc/tomcat1和tomcat2,这样做我们就可以直接把网页脚本放到宿主机上的这个目录从而实现把网页部署到tomcat的默认虚拟主机上;

  编辑两个容器的主页文件内容

  提示:以上分别给tomcat1和tomcat2提供了一个测试主页;

  现在分别放tomcat1和tomcat2看看对应主页是否能够访问到

  提示:可以看到tomcat1和tomcat2都能够访问到,到此后端tomcat的环境就准备好了;接下来我们来配置nginx来对他们做负载均衡;

  2、配置nginx对tomcat做负载均衡

  提示:以上配置就是把两台tomcat容器归并为tcsevs组,然后反代/的访问到这个组上即可。这样配置默认是轮询的;

  验证:访问宿主机上的80端口看看是否分别能够访问到后端两台tomcat容器提供的主页?

  检查nginx配置文件语法格式并启动nginx

  访问宿主机的80端口,看看是否能够访问到后端tomcat提供的页面?

  提示:可以看到访问宿主机的80端口是能够正常访问到后端tomcat服务器上的,并且也看出了默认轮询调度的效果;但是这里存在一个问题,同一用户访问宿主机的80端口,给我们响应的结果session id都不同,这意味着nginx并没有追踪到用户的状态信息,原因是因为http请求本来就是无状态的,为了让服务记录用户的状态信息,在nginx上我们可以基于源ip做调度,什么意思呢,就是同一源ip地址,nginx都把该请求调度到同一台后端server上,使得同一用户访问的状态信息始终调度到同一后端server上;

  nginx基于源ip做会话保持

  提示:ip_hash和hash $remote_addr都表示对源ip进行哈希计算,然后把取得到结果和总权重做模运算,结果落到那个节点,就调度到那个节点;什么意思呢,如上所示,后端server有两个,且权重都为1,那么他们的权重和就是2,ip_hash和hash $remote_addr就是把客户端的ip地址的前三段进行hash计算,然后把得到的值再和权重和做取模运算,很显然取模后端结果要么是0要么是1,如果取模后的结果是1,那么nginx基于它内部的对应关系,把该请求就调度到tomcatB或者tomcatA;

  测试:重启niginx ,访问宿主机的80端口看看是否都把请求调度到同一后端server上?

  提示:可以看到现在访问宿主机的80端口就没有在轮询了,而是始终调度到tomcatA这台server上进行响应;但是我们访问127.0.0.1的80端口它又调度到tomcatB上去了,这是因为nginx的调度算法中hash $remote_addr 和ip_hash是把IP地址的前24位做hash,所以如果你的IP前三段相同时,nginx它会认为是和nginxserver是同一局域网,所以它会把请求调度到同一局域网之前来请求过的后端server上进行响应;当然除了我们可以对源地址做hash,我们也可以对其他首部做hash计算,原理都是类似的,都是把对应首部的值做hash计算,然后同权重和做取模运算;然后根据nginx内部的对应关系,把取模后端结果相同的请求调度到同一后端server,就是基于这样的原理,把客户端和后端server绑定到一起实现了会话绑定;

  httpd对tomcat做负载均衡

  httpd做负载均衡器,需要确认httpd是否开启了proxy_http_module、proxy_module  、proxy_balancer_module如果需要用到ajp还需要确定proxy_ajp_module模块是否启用,以及调度算法的三个模块 lbmethod_bybusyness_module 、lbmethod_byrequests_module、lbmethod_bytraffic_module;以上模块对于调度算法来说用到那个启用那个也行,对于http或者ajp也是一样的;用得到就启用,用不上不启用也没关系;

  提示:可以看到我们需要用的模块都是启用了的;

  配置httpd对后端tomcat 做负载均衡

  提示:从上面的配置,其实感觉和nginx的配置逻辑很相似,首先把后端server归并成一个组,然后反代时把请求代理到定义的组上即可;这里说一下调度算法吧,proxyset lbmethod 用来指定调度算法的,默认不写是使用byrequests,这个算法就是httpd里的轮询调度算法,当然在每个balancermember 后面加上权重,就成了加权轮询了;除此调度算法,我们还可以使用bytraffic,这个调度算法是根据和后端server的传输流量来调度,如果某个服务器传输流量很大,那么他会把请求往传输流量相对小的服务器上调度;bybusyness这个调度算法是根据后端server的繁忙程度来调度;类似nginx里的least_conn最少连接算法;对balancermember 我们也可以向nginx 那样设置单独属性,只需要在后面写上对应的属性即可;常用的属性有status 这个属性表示表示对应balancermember是处于什么状态,其中对status有6种取值;D表示禁用对应server,不提供任何请求;S表示人工手动标识为不可用;I表示强制上线模式(强制忽略错误模式);H表示热备模式(相当于nginx里的backup,只有组里的其他server都不可用时,它才会被激活,用于say sorry);E表示强制处于错误模式(即便没有错误也要让他处于有错误);N表示排干模式;除了status来指定balancermember的状态,还可以使用loadfactor来指定权重,类似于nginx里的weight;

  停掉nginx,检查httpd 的配置文件语法,如果没有问题就启动httpd

  访问httpd提供的服务,看看是否访问到后端tomcat的页面

  提示:可以看到和nginx的访问一样,都可以实现轮询;

  httpd基于cookie对后端tomcat做会话粘性

  提示:以上配置表示给客户端请求cookie首部添加一个标识,ROUTEID=%{BALANCER_WORKER_ROUTE}e表示,我们指定的ROUTEID标识的值为balancermember 后面的route属性指定的值;env=BALANCER_ROUTE_CHANGED表示,如果我们指定的route的值发生变化时,它需要重新调度;简单讲就是给cookie信息打标签;proxyset stickysession=ROUTEID 表示给该组所有成员设置会话粘性KEY的名称为ROUTEID,这个值通常要和上面的set-cookie后面的KEY对应;如果把它写到每个balancermember后面表示单独给某个server设置会话粘性KEY的名称;如果写在proxy配置段里需要用proxyset指令来设置,表示给该组的所有member设置 stickysession;简单讲就是声明以那个key来当做会话粘性的基准来做调度;这个逻辑和haproxy里面的会话保持设定类似;有关haproxy配置会话保持可以参考https://www.cnblogs.com/qiuhom-1874/p/12776261.html

  测试:检查httpd的配置文件语法,如果没有问题就重启httpd,然后访问httpd看看会有什么变化

  用curl 来模拟第一次访问httpd服务器,看看响应首部有什么变化?

  提示:可以看到访问httpd服务器,在响应首部会多一个set-cookie首部,并且该首部的的值就是我们之前在配置文件中配置的KEY和value;set-cookie首部主要是在浏览器下次请求时,它会把set-cookie首部的值用cookie首部携带去访问服务器,这样一来,服务器就可根据客户端请求报文的cookie的值,来分析本次请求是那个客户端发送过来,后续服务端该怎么调度;

  用浏览器访问,看看客户端第一次访问请求,看看服务端会这么响应客户端

  提示:可以看到浏览器第一次访问,服务器会在响应首部中添加一个set-cookie的首部;这个首部的值就是ROUTEID是目前响应我们的后端server上的route的值;

  提示:可以看到客户端在请求首部cookie中,把之前set-cookie中的值都携带过去了;此时httpd收到客户端请求就可以根据设置的stickysession 指定的KEY来判断该把对应请求发送到那个后端server上进行响应了;这样一来,只要客户端的cookie不变,那么它每次访问服务端都会以cookie首部的值去告诉服务端该调度到那台后端server上;

  用curl模仿客户端请求携带cookie访问服务端

[root@docker_node01 ~]# curl -I --cookie "ROUTEID=.TOMCAT1" http://192.168.0.22/myapp/ 
HTTP/1.1 200 
Date: Mon,20 Jul 2020 14:26:02 GMT
Server: Apache/2.4.6 (CentOS)
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Set-Cookie: JSESSIONID=F03BABD6CC4905066B3BF78947D024CC; Path=/myapp; HttpOnly
Via: 1.1 www.test1.com

[root@docker_node01 ~]# curl --cookie "ROUTEID=.TOMCAT1" http://192.168.0.22/myapp/     

<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="blue">TomcatA</font></h1>
        <table align="centre" border="1">
            <tr>
            <td>Session ID</td>

            <td>FDD5095817FBEE6B58054666B64E46C2</td>
            </tr>
            <tr>
            <td>Created on</td>
            <td>1595255172651</td>
            </tr>
        </table>
    </body>
</html>
[root@docker_node01 ~]# curl --cookie "ROUTEID=.TOMCAT2" http://192.168.0.22/myapp/ 

<html>
    <head><title>TomcatB</title></head>
    <body>
        <h1><font color="green">TomcatB</font></h1>
        <table align="centre" border="1">
            <tr>
            <td>Session ID</td>

            <td>BC5EAC6B1B75E54F4C92CCB0B5018808</td>
            </tr>
            <tr>
            <td>Created on</td>
            <td>1595255213765</td>
            </tr>
        </table>
    </body>
</html>
[root@docker_node01 ~]#

  提示:可以看到当我们使用curl模仿客户端访问携带cookie时,在响应首部就不会在给我们发set-cookie首部(这里的set-cookie是指和我们在服务器设定相关的首部),并且我们携带不同ROUTEID的cookie,它会根据我们携带的ROUTEID的值把我们调度到不同的后端server上进行响应;对于httpd负载均衡代理后端tomcat用ajp的配置方式和http的配置方式一样的,不同的只是把后端server的http协议修改成ajp,后端tomcat的端口修改成ajp协议监听的端口即可,默认tomcatajp协议监听在8009端口;

  配置httpd后端管理界面页

  提示:以上配置表示启动httpd管理页面,并绑定到/manager-page这个uri上,对于/manager-page这个uri不做任何代理,并且该rui只能允许ip地址为192.168.0.232的主机访问,其他主机都没有权限,包括服务器本身;

  验证:用非192.168.0.232的主机访问192.168.0.22/manager-page看看是否能够访问到?

[root@docker_node01 ~]# ip a l ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:22:36:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.22/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe22:367f/64 scope link 
       valid_lft forever preferred_lft forever
[root@docker_node01 ~]# httpd -t
Syntax OK
[root@docker_node01 ~]# systemctl restart httpd
[root@docker_node01 ~]# curl http://192.168.0.22/manager-page  
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /manager-page
on this server.</p>
</body></html>
[root@docker_node01 ~]#

  提示:可以看到用192.168.0.22去访问,提示403没有权限;

  用192.168.0.232去访问,看看是否能够访问到管理页面?

  提示:用192.168.0.232上的浏览器上可以正常访问到httpd的管理页面的;

  动态修改tomcat1的权重

  提示:正因为这个页面可以动态的更改后端服务器的属性,所以通常需要做访问限制;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


&lt;servlet&gt; &lt;servlet-name&gt;tomcatpooljsp&lt;/servlet-name&gt; &lt;jsp-file&gt;/WEB-INF/tomcatpool.jsp&lt;/jsp-file&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;tomcatpooljsp&lt;/servlet-nam...
遵循Java Servlet 规范第4节中的建议 ,Apache Tomcat实现了系统地重新加载Java类的方法,以允许在不重新启动整个服务器的情况下更新应用程序的组件。 此功能对于开发非常重要,因为事实证明,随着服务器启动和重启时间的延长,这会严重浪费开发人员的时间。实际上,Java EE堆栈应用服务器的服务器重新启动时间很慢,这是Tomcat广泛用于个人和企业级项目的推动力之一。但是,即使Tomcat也无法 像运行时重新加载应用程序一样快地启动。通过仅重新加载隔离的应用程序的更改的类,开发人员..
JMX(Java管理扩展)是一项非常强大的技术,可让您管理,监视和配置Tomcat MBean。如果您是Tomcat管理员,那么您应该熟悉如何在tomcat中启用JMX来监视堆内存,线程,CPU使用率,类以及配置各种MBean。在本文中,我将讨论如何使用JConsole启用并连接到Tomcat。我假设您已经安装了Tomcat(如果没有);您可以参考安装指南。转到安装了Tomcat的路径 转到bin文件夹 将文件创建为“ setenv.sh” 使用vi编辑器修改文件并添加以下内容
总览介绍 建立 取得Java 获取TomCat 将TomCat安装为Windows服务 将TomCat设置为Linux服务(系统化) 使用Nginx作为反向代理 基本用法 手动启动和停止TomCat 验证TomCat服务器正在运行 服务静态文件 服务Java服务器页面(JSP) 修改设定 部署网络应用 使用管理网页界面 创建一个TomCat管理员用户 访问管理网络应用 管理网络应用 结论 参考链接介绍在最简单的概念中,To.
PSI Probe是Lambda Probe的社区驱动分支,使用相同的开源许可证(GPLv2)分发。它旨在替换和扩展Tomcat Manager,从而使管理和监视Apache Tomcat实例更加容易。与许多其他服务器监视工具不同,PSI Probe不需要对现有应用程序进行任何更改。它通过可访问Web的界面提供所有功能,只需将其部署到服务器即可使用。这些功能包括:请求:即使在每个应用程序的基础上,实时监视流量。 会话:浏览/搜索属性,查看上一个IP,到期,估计大小。 JSP:浏览,查看源代码,进
监视和管理Tomcat目录介绍 启用JMX远程 使用JMX远程Ant任务管理Tomcat JMXAccessorOpenTask-JMX打开连接任务 JMXAccessorGetTask:获取属性值Ant任务 JMXAccessorSetTask:设置属性值Ant任务 JMXAccessorInvokeTask:调用MBean操作Ant任务 JMXAccessorQueryTask:查询MBean Ant任务 JMXAccessorCreateTask:远程创建MBean Ant任
1.tomcat与jetty都是一种servlet引擎,他们都支持标准的servlet规范和javaEE规范
“The origin server did not find a current representation for the target resource...
Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;
使用 IDEA 编辑器开发项目十分便捷,这里介绍使用 IDEA 编辑器添加 Tomcat
这篇“servlet和tomcat的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅...
这篇文章主要讲解了“Tomcat管理平台实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Tomcat管理平...
本文小编为大家详细介绍“tomcat虚拟主机怎么配置”,内容详细,步骤清晰,细节处理妥当,希望这篇“tomcat虚拟主机怎么配置”文章能帮助大家解决疑惑,下面跟
今天小编给大家分享一下tomcat相关配置与eclipse集成的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇“Tomcat之web应用的目录组成结构是怎样的”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,
今天小编给大家分享一下tomcat目录映射的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大...
这篇“tomcat的环境怎么配置”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文...
环境:tomcat:apache-tomcat-7.0.35 cactiEZ:10.1系统:centos5.6_x64一、配置tomcat服务器1、添加账号vim tomcat-users.xml 重启tomcat2、安装snmp协议yum...
一、 软环下载地址软件链接地址https://files.cnblogs.com/files/jinrf/openssl-1.0.2-latest.tar.gzhttps://files.cnblogs.com/files/jinrf/apr-util-1.6...