当前位置: 首页 > news >正文

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连接器注释掉了。

相关文章:

Apache+mod_jk模块代理Tomcat容器

一、背景介绍 最近在看Tomcat运行架构原理, 正好遇到了AJP协议(Apache JServ Protocol). 顺道来研究下这个AJP协议和具体使用方法. 百度百科是这么描述AJP协议的: AJP&#xff08;Apache JServ Protocol&#xff09;是定向包协议。因为性能原因&#xff0c;使用二进制格式来传输…...

Nginx访问FTP服务器文件的时效性/安全校验

背景 FTP文件服务器在我们日常开发中经常使用&#xff0c;在项目中我们经常把FTP文件下载到内存中&#xff0c;然后转为base64给前端进行展示。如果excel中也需要导出图片&#xff0c;数据量大的情况下会直接返回一个后端的开放接口地址&#xff0c;然后在项目中对接口的参数进…...

【VSCode】自定义配置

VSCode自定义配置 Visual Studio Code (VSCode) 是一个强大的开源代码编辑器&#xff0c;支持丰富的自定义配置。下面是一些常见的自定义配置选项&#xff0c;你可以根据个人喜好和工作流程进行调整&#xff1a; 1. 主题和配色方案: 在 “settings.json” 中设置&#xff1a…...

SpringBoot整合Kafka (一)

&#x1f4d1;前言 本文主要讲了SpringBoot整合Kafka文章⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&#xff0c;优秀一点 目录 文章目录 &…...

随机分词与tokenizer(BPE->BBPE->Wordpiece->Unigram->sentencepiece->bytepiece)

0 tokenizer综述 根据不同的切分粒度可以把tokenizer分为: 基于词的切分&#xff0c;基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三种分词模型。其中WordPiece可以认为是一种特殊的BPE。完…...

成都工业学院Web技术基础(WEB)实验四:CSS3布局应用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…...

TikTok科技趋势:平台如何引领数字社交革命?

TikTok作为一款颠覆性的短视频应用&#xff0c;不仅改变了用户的娱乐方式&#xff0c;更在数字社交领域引领了一场革命。本文将深入探讨TikTok在科技趋势方面的引领作用&#xff0c;分析其在数字社交革命中的关键角色&#xff0c;以及通过技术创新如何不断满足用户需求&#xf…...

【上海大学数字逻辑实验报告】六、时序电路

一、 实验目的 掌握同步二进制计数器和移位寄存器的原理。学会用分立元件构成2位同步二进制加计数器。学会在Quartus II上设计单向移位寄存器。学会在Quartus II上设计环形计数器。 二、 实验原理 同步计数器是指计数器中的各触发器的时钟脉冲输入端连接在一起&#xff0c;接…...

docker版zerotier-planet服务端搭建

1:ZeroTier 介绍2:为什么要自建PLANET 服务器3:开始安装 3.1:准备条件 3.1.1 安装git3.1.2 安装docker3.1.3 启动docker3.2:下载项目源码3.3:执行安装脚本3.4 下载 planet 文件3.5 新建网络 3.5.1 创建网络4.客户端配置 4.1 Windows 配置 4.2 加入网络4.2 Linux 客户端4.…...

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》&#xff…...

node.js和浏览器之间的区别

node.js是什么 Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;可以在服务器端运行JavaScript代码 Node.js 在浏览器之外运行 V8 JavaScript 引擎。 这使得 Node.js 非常高效。 浏览器如何运行js代码 nodejs运行环境 在浏览器中&#xff0c;大部分时间你所…...

【python并发任务的几种方式】

文章目录 1 Process:2 Thread:3 ThreadPoolExecutor:4 各种方式的优缺点&#xff1a;5 线程与进程的结束方式5.1 线程结束的几种方式5.2 进程的结束方式 6 应用场景效率对比 在Python中&#xff0c;有几种方法可以处理并行执行任务。其中&#xff0c;Process、Thread和ThreadPo…...

使用ROS模板基于ECS和RDS创建WordPress环境

本文教程介绍如何使用ROS模板基于ECS和RDS&#xff08;Relational Database Service&#xff09;创建WordPress环境。 前提条件 如果您是首次使用ROS&#xff0c;必须先开通ROS服务。ROS服务免费&#xff0c;开通服务不会产生任何费用。 背景信息 WordPress是使用PHP语言开…...

龙迅LT2611UXC 双PORT LVDS转HDMI(2.0)+音频

描述&#xff1a; LT2611UXC是一个高性能的LVDS到HDMI2.0的转换器&#xff0c;用于STB&#xff0c;DVD应用程序。 LVDS输入可配置为单端口或双端口&#xff0c;有1个高速时钟通道&#xff0c;3~4个高速数据通道&#xff0c;最大运行1.2Gbps/通道&#xff0c;可支持高达9.6Gbp…...

websocket和SSE通信示例(无需安装任何插件)

websocket和SSE通信示例&#xff08;无需安装任何插件&#xff09; 源码示例&#xff08;两种方案任意切换&#xff09; data(){return {heartBeatInterval:5000,// 心跳间隔时间&#xff0c;单位为毫秒webSocket:null,heartBeatTimer:null,} }, mounted() {// this.initWebS…...

计算机网络(三)

&#xff08;十一&#xff09;路由算法 A、路由算法分类 动态路由和静态路由 静态路由&#xff1a;人工配制&#xff0c;路由信息更新慢&#xff0c;优先级高。这种在实际网络中要投入成本大&#xff0c;准确但是可行性弱。 动态路由&#xff1a;路由更新快&#xff0c;自动…...

HttpURLConnection OOM问题记录

使用HttpURLConnection 上传大文件&#xff0c;会出现内存溢出问题&#xff1a; 观察HttpURLConnection 源码&#xff1a; Overridepublic synchronized OutputStream getOutputStream() throws IOException {connecting true;SocketPermission p URLtoSocketPermission(th…...

WT588F02B单片机语音芯片在磁疗仪中的应用介绍

随着健康意识的普及和科技的发展&#xff0c;磁疗仪作为一种常见的理疗设备&#xff0c;受到了广大用户的关注。为了提升用户体验和操作便捷性&#xff0c;唯创知音WT588F02B单片机语音芯片被成功应用于磁疗仪中。这一结合将为磁疗仪带来智能化的语音交互功能&#xff0c;为用户…...

深度学习——第5章 神经网络基础知识

第5章 神经网络基础知识 目录 5.1 由逻辑回归出发 5.2 损失函数 5.3 梯度下降 5.4 计算图 5.5总结 在第1课《深度学习概述》中&#xff0c;我们介绍了神经网络的基本结构&#xff0c;了解了神经网络的基本单元组成是神经元。如何构建神经网络&#xff0c;如何训练、优化神…...

微信网页授权步骤说明

总览 引导用户进入授权页面同意授权&#xff0c;获取code通过code换取网页授权access_token&#xff08;与基础支持中的access_token不同&#xff09;如果需要&#xff0c;开发者可以刷新网页授权access_token&#xff0c;避免过期&#xff08;一般不需要&#xff09;通过网页…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...