Apache+mod_jk模块代理Tomcat容器

一、背景介绍

        最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法.

        百度百科是这么描述AJP协议的:

        AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过 TCP连接 和 SERVLET容器连接。

        在开始正文前, 我们先了解下静态网站和动态网站的区别和内容.

       【静态站点

                用户通过HTTP协议查看服务的一些静态文件资源,例如文本文件、图片文件、声音文件等等,这些静态文件的内容除非人为更新,否则用户查看到的内容都是不变的。 这样也就意味着用户无法和这些文件进行交互.

       【动态站点

                用户根据界面的操作,提交表单,每个操作得到的结果html内容是动态的。 例如你修改昵称为ABC, 那么等你刷新页面,你的昵称就显示为ABC。下一次更新昵称为456,那么再刷新这个网页内容,昵称又变成了456。  背后的底层原理就是,每次你得到的html内容是动态的,并不是一成不变的静态文件内容

        说来话长, 只能简单聊一下。 早先Web网站/站点在90年代静态网站已经满足了大部分人的需求,就是发布一些静态内容文件,提供给他人浏览、下载以及文件共享。 但是随着技术的发展,大家发现静态站点有一个弊端就是, 不能和Web站点进行交互。  那也就是意味着管理员给到我们什么内容,我们就只能看到什么内容,不能对这个服务器的一些资源进行操作。人们迫切需要一种动态Web站点需求,使得我们可以和Web服务器进行交互,可以提交数据、也可以查看数据,这样才能更好地发挥Web站点的作用。

        要开发动态站点,那肯定是用编程语言来处理提交的表单数据以及业务逻辑,最后生成结果的html文本内容响应给用户,用户通过浏览器就能看到响应结果页面。 当时已经有的一些开发语言如Java、PHP、Python都想通过Web技术发展自己的影响力以及市场份额。 

        大部分语言都采用了Web服务器+后端动态站点协议的方式来进行开发。 Web服务器只负责对HTTP协议进行负责,负责HTTP协议的解析、响应,其它业务逻辑、HTML内容生成等等这些工作交给后端编程语言来实现, 这样Web服务器、后端服务器的职责都很清晰、独立,两者也不存在强耦合的关系。

        那动态站点后端协议又有哪些呢? 例如 本文要介绍的JavaEE 中,Apache Web服务器制定了AJP协议,用来规范Apache Web服务器和后端Java Sevlet容器的交互规范协议。  再比如PHP则是Nginx使用了CGI/FastGCI协议与其进行交互, 再如Python, Nginx则使用的是大家知道的WSGI协议等等。整体动态站点的运行组件图如下:

    

        所以大家在安装Tomcat的时候是不是发现除了8080有一个HTTP协议的Connector连接器,还会伴随这种一个8009的AJP协议的监听端口.    是不是自己以前没有仔细研究过这个端口到底是干嘛用的?  今天我们就通Apache mod_jk模块(使用AJP协议与Tomcat 的AJP 8009端口服务进行交互,实现Web访问)

二、操作步骤

1、安装Tomcat并且开启AJP监听8009

         我按照的版本是: apache-tomcat-9.0.82, 官网下载压缩包,解压即可, 这个就不赘述步骤了。

         开启conf/server.xml的配置:

secretRequired="false":   

        注意默认这个参数没有,默认值是true, 意味着要和8009这个AJP服务交互,要设置密码, 同时客户端要访问,则需要把密码也带过来。 为了方便我们做测试这个设置为false.  

        刚开始我没设置false, 导致访问Apache一直卡着,也看不到页面,看不到报错信息。最后看tomcat的catalina.out才发现这个问题.

设置<Engine>的jvmRoute="tomcat1":

        先记住这个点, jvmRoute="tomcat1", 后面配置Apache需要用到.

        在webapps增加了一个demo2的目录,增加一个welcome.jps文件, 这个jps文件就是简单输出:  welcome内容:

   

        最后正常启动Tomcat的bin/startup.sh完成服务的启动.

2、安装apache

yum install httpd httpd-devel  -yyum install gcc gcc-c++ make -y 

3、 编译生成mod_jk模块

1、下载mod_jk源码压缩包

https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/

2、解压源码文件,进入native

./configure --with-apxs=/usr/bin/apxsmake

  返回上级目录,执行find ./ -name mod_jk.so, 拿到文件路径, 拷贝到:  /etc/httpd/modules/

4、配置apache的配置文件

1、/etc/httpd/conf.d新增mod_jk.conf文件

LoadModule jk_module /etc/httpd/modules/mod_jk.so                     
JkWorkersFile conf/workers.properties                        
JkLogFile /var/log/httpd/mod_jk.log                          
JkLogLevel debug
JkShmFile /var/log/httpd/mod_jk.shm             
JkRequestLogFormat "%w %V %T"JkMount /*.jsp balancer

   2、/etc/httpd/conf新增workers.properties文件

# tomcat1  就是在Tomcat的Engine配置的jvmRoute名称
worker.list=balancer,jk_watcher,tomcat1#tempalte 负载模板配置 , 使用的协议是ajp1.3
worker.template.type=ajp13
#worker全局的重试次数,在apache服务器启动后,会最多尝试若干次连接这些负载均衡服务器,若连接不上则任务down掉
worker.retries=3#balancer 负载配置  
worker.balancer.type=lb
# tomcat1  就是在Tomcat的Engine配置的jvmRoute名称
worker.balancer.balance_workers=tomcat1
worker.balancer.sticky_session=true#tomcat1的配置  
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.reference=worker.template
worker.tomcat1.activation=A
#worker.tomcat1.lbfactor=1#负载均衡监视器
worker.jk_watcher.type=status
worker.jk_watcher.read_only=false
worker.jk_watcher.mount=/jkStatus

5、启动httpd服务并且访问测试

systemctl start httpd

 Apache 端口是80,所以访问测试的URL可以省略80端口.

测试访问URL:  http://localhost/demo2/welcome.jsp

  

        我们可以看到,Tomcat没有开启8080服务,我们访问Apache服务的80端口+mod_jk模块(使用AJP协议与8009AJP服务进行交互), 最后访问到了Tomcat的这个jps的响应的HTML内容.

三、总结

        那为什么我们也直接可以通过Tomcat的8080端口就能访问到jsp页面了呢?  说白了就是Tomcat自己内置实现了一个HTTP协议Web服务器功能, 最后解析HTTP协议将数据再传给Servlet容器, 本质上是一样的方式。 只是Tomcat把这个Web服务器实现进行了内置实现。

        还有一个疑问Nginx支持代理AJP协议或者存在其它的协议能和Servlet容器进行交互吗?

        这个目前Nginx是不支持和Servlet容器进行交互的,但是理论上来说,只要你去实现了AJP协议的内容,也可以自己写一个Nginx的模块去做和mod_jk一样的事情。只是这种方式不太主流,生产环境很少看到有人使用Nginx加AJP模块进行交互的, Apache的mod_jk都很少见。

        大部分还是直接使用内置Tomcat的HTTP服务器8080来提供HTTP服务, AJP协议的监听器直接关闭, 如果为了应对集群,那么使用Nginx直接通过HTTP协议再代理到Tomcat的8080.

        大家看到通过Nginx直接再代理到Tomcat的8080HTTP服务器,虽然HTTP协议被重复解析了一次,但是对于运维和排查问题很方便(大家对HTTP协议都相对熟悉,对AJP相对陌生), 也不在乎这么一点性能损耗。

        同时单台Tomcat本来能支撑的并发数是有限的,所以通过Nginx+Tomcat构成集群水平拓展才能发挥更大的威力, 单台Tomcat再怎么垂直提升单机性能,效果也没集群那么明显。  所以这个AJP的方式只是在本地做的一个实验,让我们了解和加深动态站点的运行原理。

        实际生产环境这个AJP+Apache的方式慎用, 反正我基本上是没看到有人这么用的。  况且Tomcat后面9的版本以上, 默认配置文件把这个AJP的8009端口Connector连接器注释掉了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/256667.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的三种代理模式实现

代理模式的定义&#xff1a; Provide a surrogate or placeholder for another object to control access to it.&#xff08;为其他对象提供一种代理以控制对这个对象的访问。&#xff09; 简单说&#xff0c;就是设置一个中间代理来控制访问原目标对象&#xff0c;达到增强原…

JAVA导出PDF(一)

思路一&#xff1a;直接导出pdf 使用freemarker和itext把html转pdf&#xff0c;存在中文乱码&#xff0c;宋体不识别&#xff0c;需下载simsun.ttc字体&#xff0c;空白占位符不识别等等问题&#xff0c;对前端依赖性较大&#xff0c;不推荐&#xff1b; 适用范围&#xff1a;…

[Geek Challenge 2023] klf_2详解

考点 SSTI、join拼接绕过 fuzz测试后发现过滤了很多关键字 我们先试试构造__class__ {% set podict(po1,p2)|join()%} //构造pop {% set alipsum|string|list|attr(po)(18)%} //构造_ {% set cl(a,a,dict(claa,ssa)|join,a,a)|join()%} //构造__class__ {% set …

人工智能企业引入S-SDLC,推动安全能力大跃升,保障AI技术体系深化落地

某人工智能公司是国际知名的上市企业&#xff0c;核心技术处于世界前沿水平。多年来&#xff0c;该企业在智慧教育、智慧医疗、智慧城市、智慧司法、金融科技、智能汽车、运营商、消费者等领域进行深度技术赋能&#xff0c;深入推进各个行业的智能化、数字化转型建设。 人工智能…

微服务2 Docker学习 P42-P60

Docker学习视频https://www.bilibili.com/video/BV1LQ4y127n4?p42&vd_source8665d6da33d4e2277ca40f03210fe53a 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r Docker 其他笔记 服务器容器化-docker(全…

labelme等标注工具/数据增强工具输出JSON文件格式检查脚本

标注的文件太多了&#xff0c;还有用数据增强工具生成了一票的新数据。在转换或使用训练时候会报错&#xff0c;错误原因是json中语法有问题&#xff0c;这样会中断程序运行&#xff0c;调试造成很大困扰。 检查确实最后有问题&#xff0c;多写了一次 写一个脚本&#xff0c;用…

CentOS上配置和管理HTTP服务器的工具和实用程序

在CentOS系统上&#xff0c;有多个工具和实用程序可以帮助你配置和管理HTTP服务器。以下是一些常用的工具和实用程序&#xff1a; Apache HTTP服务器&#xff1a; Apache是CentOS上最常用的HTTP服务器之一。它是一个开源的Web服务器软件&#xff0c;具有高度的可配置性和可扩…

ARCGIS 中使用 ChatGPT 的 5 种方式

ChatGPT 一度成为最热门的话题。什么是 ChatGPT&#xff1f;谁能比 ChatGPT 本身更好地回答这个问题呢&#xff1f;我们要求它写一个关于 ChatGPT 是什么的简短描述&#xff0c;这是它的回应&#xff1a; ChatGPT 是一个聊天机器人&#xff0c;使用 OpenAI 开发的 GPT-3 语言模…

【智能家居】六、摄像头安装实现监控功能点、人脸识别(face_recognition的使用)

一、定义及第三方库的说明 OCR &#xff08;光学字符识别&#xff09;文字识别、图像识别mjpg-streamer实时流式传输视频工具树莓派mjpg-streamer Face Recognition人脸识别 Dlib 计算机视觉问题的工具和算法face_recognition库OpenCV 计算机视觉和机器学习的开源库 三、香…

大数据分析与应用实验任务十一

大数据分析与应用实验任务十一 实验目的 通过实验掌握spark Streaming相关对象的创建方法&#xff1b; 熟悉spark Streaming对文件流、套接字流和RDD队列流的数据接收处理方法&#xff1b; 熟悉spark Streaming的转换操作&#xff0c;包括无状态和有状态转换。 熟悉spark S…

【深度学习】一维数组的聚类

在学习聚类算法的过程中&#xff0c;学习到的聚类算法大部分都是针对n维的&#xff0c;针对一维数据的聚类方式较少&#xff0c;今天就来学习下如何给一维的数据进行聚类。 方案一&#xff1a;采用K-Means对一维数据聚类 Python代码如下&#xff1a; from sklearn.cluster im…

[VSCode] Java开发环境配置

文章目录 1 VSCode & Java 安装1.1 安装 VSCode1.2 安装 JDK 2 环境变量配置3 在 VSCode 中安装 Java 扩展4 运行测试 1 VSCode & Java 安装 1.1 安装 VSCode Visual Studio Code 官方下载 地址&#xff1a; https://code.visualstudio.com/详细安装步骤这里不做赘…