如何编译Apache的JK模块基于AJP协议连接Tomcat,实现负载均衡。

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介:

        nginx,Apache,HAProxy都可以通过http协议将请求代理至后端的tomcat,但是只有Apache可以支持更高效的AJP协议连接tomcat,接下来我们来看看如何实现吧。

实验环境:RHEL6.4

admin1.tuchao.com  192.168.18.201 //tomcat服务器

admin2.tuchao.com  192.168.18.202 //tomcat服务器

admin3.tuchao.com  192.168.18.203 //Apache服务器

jk模块源码包下载地址:http://tomcat.apache.org/download-connectors.cgi

jk模块文档地址:http://tomcat.apache.org/connectors-doc-archive/jk2/jk/aphowto.html

安装tomcat(略)  配置serve.xml在Engine标签加入一个jvmRoute然后启动tomcat。

wKioL1PqC2yyn65tAAHR1zArPl0586.jpg


由于在编译jk模块的时候要指定apxs程序的位置,如果没有这个程序,则安装httpd-develapr-develapr-util-devel

  • yum install httpd-devel apr-devel apr-util-devel -y

查看apxs具体位置。

rpm -ql httpd-devel

wKioL1PqBoyBJIOVAAFModXKRys210.jpg

解压源码包,开始编译。

  • tar xf tomcat-connectors-1.2.37-src.tar.gz

  • cd tomcat-connectors-1.2.37-src/native/

  • ./configure--with-apxs=/usr/sbin/apxs

  • make && make install

安装完成

wKioL1PqBsnTuJfjAAK-RzsR8l0511.jpg


配置启用此模块,定义一个配置文件来保存模块相关指令

vim /etc/httpd/conf.d/mod_jk.conf

在文件中输入以下内容:

LoadModule  jk_module /usr/lib/httpd/modules/mod_jk.so //装载jk模块

JkWorkersFile  /etc/httpd/conf.d/workers.properties  //定义工作属性的配置文件

JkLogFile  logs/mod_jk.log  //日志文件

JkLogLevel  debug //日志级别

JkMount  /* TomcatA  //将哪个路径转发至哪个work实例,实例名称要基于后端tomcat jvmRoute配置。

JkMount  /status/ stat1

创建jk模块工作属性的配置文件。

vim /etc/httpd/conf.d/workers.properties

在文件中输入以下内容:

worker.list=TomcatA,stat1  //定义work实例列表

worker.TomcatA.port=8009  //指定tomcatA所监听的端口,这里worker实例的名称要基于后端tomcat服务器,server.xml 配置文件 Engine标签中jvmRoute指令的定义。

worker.TomcatA.host= 192.168.18.201  //主机地址

worker.TomcatA.type=ajp13  //指定协议

worker.TomcatA.lbfactor=1  //权重

worker.stat1.type= status  //配置输出状态接口

配置完成后保存,启动httpd。


work常见的工作类型:

ajp13:使用ajp13协议连接tomcat

lb:使用负载均衡

status:用于显示环境中各实际worker工作状态。

worker其它常见的属性说明:

hostTomcat 7worker实例所在的主机;

portTomcat 7实例上AJP1.3连接器的端口;

connection_pool_minsize:最少要保存在连接池中的连接的个数;默认为pool_size/2

connection_pool_timeout:连接池中连接的超时时长;

mount:可以定义请求的路径转发至某个实例,如果有多个则使用空格格开;此属性可以由JkMount指令替代;

retries:错误发生时的重试次数;

socket_timeoutmod_jk等待worker响应的时长,默认为0,即无限等待;

socket_keepalive:是否启用keep alive的功能,1表示启用,0表示禁用;

lbfactorworker的权重,可以在负载均衡的应用场景中为worker定义此属性;


现在我们尝试访问Apache服务器的地址。

wKioL1PqDb_B79B2AAN8Qa5zbvM628.jpg


配置进阶—实现负载均衡。

admin1主机:

配置Engine

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" >

添加虚拟主机

wKioL1PqFB6TMfMxAAGOtRyVezw647.jpg

创建测试页面 vim /usr/local/tomcat/webapps/luntan/index.jsp

复制以下代码:

<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA </font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("abc","abc"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

测试页面

wKiom1PqFN3TNYMMAAD2XaaaZiE432.jpg

admin2主机:

配置Engine

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB" >

添加虚拟主机

wKioL1PqF3nDHeYsAACcQQ1KnG8248.jpg

创建测试页面 vim /web/index.jsp

复制以下代码:

<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB </font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("abc","abc"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

测试页面

wKioL1PqGCHx2-CtAADmL-GReio038.jpg

admin3主机:

编辑Apache jk模块配置文件 vim /etc/httpd/conf.d/mod_jk.conf

LoadModule  jk_module  /usr/lib/httpd/modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  lbcluster1  //将哪个路径转发至哪个work实例

JkMount  /status/  stat1

编辑jk模块工作属性配置文件 vim /etc/httpd/conf.d/workers.properties

worker.list = lbcluster1,stat1  //定义work实例

worker.TomcatA.type = ajp13  

worker.TomcatA.host = 192.168.18.201  

worker.TomcatA.port = 8009  //这里定义的端口要和tomcat AJP协议监听的端口一致。

worker.TomcatA.lbfactor = 1

worker.TomcatB.type = ajp13

worker.TomcatB.host = 192.168.18.202

worker.TomcatB.port = 8009

worker.TomcatB.lbfactor = 1  //定义权重

worker.lbcluster1.type = lb  //定义工作类型

worker.lbcluster1.sticky_session = 1  //启用会话保持

worker.lbcluster1.balance_workers = TomcatA, TomcatB  //定义后端实例,这里worker实例的名称要基于后端tomcat服务器,server.xml 配置文件 Engine标签中jvmRoute指令的定义。注意在这里实例名第一个字母要大写,不然会出错。

worker.lbcluster1.method = R  //定义调度算法,可以设定为R、T或B;默认为R,即根据请求的个数进行调度;T表示根据已经发送给worker的实际流量大小进行调度;B表示根据实际负载情况进行调度。

worker.stat1.type = status

配置完成后保存,重启httpd服务。

修改本机的hosts文件,www.tuchao.com  192.168.18.203 

访问www.tuchao.com

wKioL1PqIXzj8XnjAAEYkkQ9DWQ966.jpg

刷新,由于这里启用了会话保持的功能,要多刷几次才会切换。

wKiom1PqIOfRgeS9AAECi6tlWpQ984.jpg

实验完成,我admin1主机tomcat http协议监听的端口是8080,而admin2主机tomcat  http协议监听的端口我改成了80,在负载均衡转发的时候却毫不受影响,应该是因为Apache是通过AJP协议8009端口与tomcat通信的,所以tomcat服务http协议监听在哪个端口无所谓。 

哈哈,不知道这样理解是不是对了。


本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1539166


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
负载均衡 算法 网络协议
slb监听协议UDP
SLB的UDP监听器适用于实时性高、数据完整性要求低的场景,如视频流和在线游戏。它无连接、不可靠,不保证数据顺序和重传,适合延迟敏感应用。SLB进行UDP会话保持依赖应用层协议或数据包标识符,使用定制健康检查检测后端服务器状态,并支持多种负载均衡算法。配置时注意网络环境对UDP的支持,确保流量畅通。
91 4
|
5月前
|
负载均衡 网络协议 算法
slb监听协议与端口
SLB是云服务商提供的负载均衡服务,用于分发客户端请求到多台后端服务器,提升服务可用性和响应速度。关键概念包括监听协议(TCP、UDP、HTTP、HTTPS、TCPSSL)和监听端口。监听协议决定了SLB处理请求的方式,而监听端口则是SLB接收请求的入口。配置时需根据应用选择合适协议和端口,并可设置负载均衡算法(如轮询、最少连接等)。客户端应通过SLB统一入口访问后端服务,避免绕过SLB导致的问题。
460 2
|
5月前
|
负载均衡 网络协议 安全
slb选择监听协议和端口
阿里云SLB中,监听协议(TCP、HTTP、HTTPS)与端口(80、443等)决定客户端请求的处理方式。TCP适用于纯TCP或自处理HTTP的场景,HTTP用于智能调度Web服务,HTTPS提供安全的HTTP传输。监听端口通常匹配应用标准,如80 for HTTP,443 for HTTPS。配置时,可考虑HTTPS重定向和传递`X-Forwarded-Proto`头以识别请求来源。选择应基于业务需求和安全考虑。
210 3
|
5月前
|
SQL Java 数据库连接
Apache Doris 支持 Arrow Flight SQL 协议,数据传输效率实现百倍飞跃
近年来,随着数据科学、数据湖分析等场景的兴起,对数据读取和传输速度提出更高的要求。而 JDBC/ODBC 作为与数据库交互的主流标准,在应对大规模数据读取和传输时显得力不从心,无法满足高性能、低延迟等数据处理需求。为提供更高效的数据传输方案,Apache Doris 在 2.1 版本中基于 Arrow Flight SQL 协议实现了高速数据传输链路,使得数据传输性能实现百倍飞跃。
|
2月前
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
|
5月前
|
负载均衡 算法 网络协议
【专栏】网络高可用性和负载均衡关键在于VRRP、VGMP和HRP协议
【4月更文挑战第28天】网络高可用性和负载均衡关键在于VRRP、VGMP和HRP协议。VRRP实现路由器冗余,保证流量转发;VGMP优化多播流量传输,适合多媒体服务;HRP提供无缝故障转移,适用于电信级网络。选择需考虑网络环境和业务需求,VRRP简单易部署,VGMP处理多播流量,HRP适合高稳定性场景。理解协议特点,确保网络最佳性能和可用性。
149 4
|
5月前
|
运维 监控 算法
slb监听协议http
SLB的HTTP监听器用于处理HTTP请求,配置时选择协议类型为HTTP和前端端口(如80)。SLB根据负载算法将请求转发至健康后端服务器,并支持会话保持。通过`X-Forwarded-For`和`X-Forwarded-Proto`头处理请求信息。由于不涉及SSL/TLS,数据传输不安全,推荐升级至HTTPS以加密通信。SLB提供性能监控和故障排查工具,帮助运维管理。
120 5
|
5月前
|
负载均衡 网络协议 安全
slb监听协议tcp
SLB的TCP监听协议适用于WebSocket支持和通用TCP服务,如FTP、SMTP。配置时设定监听端口,健康检查通过TCP握手检测服务器可用性。会话保持基于源IP,可配置SSL/TLS卸载或端到端加密。注意特定HTTP头传递和平台限制。适用于需要传输层流量管理和不依赖HTTP的应用。
109 3
|
5月前
|
负载均衡 Ubuntu 应用服务中间件
Apache(mod_proxy)+Tomcat负载均衡配置
Apache(mod_proxy)+Tomcat负载均衡配置
|
5月前
|
存储 缓存 负载均衡
【Apache ShenYu源码】如何实现负载均衡模块设计
整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。/***/核心方法很清晰,我们传入Upsteam列表,通过这个模块的负载均衡算法,负载均衡地返回其中一个对象。这也就是这个模块提供的功能。

推荐镜像

更多