apache+tomcat实现动静分离和负载均衡

news2024/9/22 7:34:57

文章目录

  • Apache+Tomcat整合
    • 环境
    • 通过JK实现动静分离
      • 编译mod_jk.so
      • 创建测试页面
      • 配置jk模块
      • 启动apache和tomcat测试。
    • Apache+Tomcat负载均衡
      • 配置测试页
      • 配置mod_jk文件
      • 配置worker.properties
      • 测试

Apache+Tomcat整合

Tomcat作为一个Servlet容器,可以用于运行Java Web应用程序并提供Web服务,它内置了一个HTTP服务器,可以处理HTTP请求和响应。但是,Tomcat的HTTP服务器功能相对较为简单,对于一些特定的需求,可能无法满足用户的要求。

因此,有时候我们需要引入Apache或其他专门的HTTP服务器,来进一步扩展Tomcat的功能和灵活性,例如:

  1. 静态文件处理:Tomcat的HTTP服务器主要是用于处理Servlet/JSP请求和响应,对于静态文件的处理能力不够强大,而Apache或其他HTTP服务器具备更为强大的静态文件处理能力,能够更好地处理静态文件,提高网站性能。
  2. 负载均衡:Apache可以通过mod_jk或mod_proxy将请求转发到多个Tomcat实例,从而实现负载均衡,提高Web应用程序的可伸缩性和可用性。
  3. 安全性:Apache提供了更加丰富的安全性配置选项,例如基于IP的访问控制、SSL/TLS加密、安全认证等,可以更好地保护Web应用程序的安全。
  4. URL重写:Apache可以通过mod_rewrite模块对URL进行重写,从而优化URL的结构和SEO效果。

综上所述,虽然Tomcat已经具备了HTTP服务器的功能,但在某些特定场景下,我们仍然需要引入Apache或其他HTTP服务器来补充Tomcat的不足,从而提高Web应用程序的性能、可伸缩性和安全性。

所以这章内容我们来讲讲怎么配置与实现apache+tomcat的整合实现动静分离负载均衡

环境

  • tomcat

    tar xf apache-tomcat-8.5.20.tar.gz -C /usr/local
    ln -s /usr/local/apache-tomcat-8.5.20 /usr/local/tomcat
    
  • apache

    yum -y install httpd
    systemctl start httpd
    
  • jdk

    mkdir -p /usr/java
    tar xf jdk-8u60-linux-x64.tar.gz -C /usr/java
    

通过JK实现动静分离

JK方式是一种常用的将Apache和Tomcat整合的方法。JK代表的是Java Connector,它是一个Apache模块,负责将请求从Apache服务器转发到Tomcat服务器。

JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置。

下载和安装mod_jk模块。mod_jk是一个Apache模块,可以将请求从Apache服务器转发到Tomcat服务器。可以在Apache官方网站下载mod_jk模块的最新版本。

编译mod_jk.so

wget -c https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors1.2.48-src.tar.gz --no-check-certificate

tar xf tomcat-connectors-1.2.48-src.tar.gz -C /usr/local/src/

cd /usr/local/src/tomcat-connectors-1.2.48-src/native/

yum install -y httpd-devel

./configure --with-apxs=/usr/bin/apxs
make && make install

创建测试页面

# 创建静态页面
vim /var/www/html/index.html
<h1>static_page_from_apache</h1>

# 创建动态页面
vim /usr/local/tomcat/webapps/ROOT/test.jsp
<h1>dynamic_page_from_tomcat</h1>

配置jk模块

[root@node1 ~]# cat /etc/httpd/conf.d/mod_jk.conf
# 载入 mod_jk 模块
LoadModule jk_module modules/mod_jk.so

# 指定 workers.properties 文件的位置
JkWorkersFile conf/workers.properties

# 指定 mod_jk 日志文件的位置,并将日志级别设置为 'info'
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel info

# 设置 mod_jk 日志格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

# 设置 mod_jk 的选项
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories

# 设置 mod_jk 请求日志格式
JkRequestLogFormat "%w %V %T"

# 将指定的 URL 映射到 'worker1' worker
JkMount /*.jsp worker1
JkMount /servlet/* worker1
JkMount /*.do worker1
JkMount /*.action worker1

# 将 /jkstatus URL 映射到 'status' worker
JkMount /jkstatus status


[root@node1 ~]# cat /etc/httpd/conf/workers.properties

#路径根据实际情况填写
workers.tomcat_home=/usr/local/tomcat/
workers.java_home=/usr/java/jdk1.8.0_261-amd64
worker.list=worker1

# Set properties for worker1 下面的都可以不用修改,感兴趣可以搜索相关含义
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
#worker.worker1.cachesize=10
#worker.worker1.cache_timeout=600
#worker.worker1.socket_keepalive=1
#worker.worker1.socket_timeout=300
worker.list = status
worker.status.type=status

配置文件可以参考/usr/local/src/tomcat-connectors-1.2.48-src/conf/httpd-jk.conf

启动apache和tomcat测试。

systemctl restart httpd tomcat

Apache+Tomcat负载均衡

Tomcat1:192.168.133.150

Tomcat2:192.168.133.130

在tomcat2上配置好tomcat和jdk

配置测试页

# cd /usr/local/tomcat/webapps/ROOT
# mv index.jsp index.jsp.bak
# vim index.jsp

TomcatA:

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="green">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>

TomcatB:

<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="yellow">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>

配置mod_jk文件

# vim /etc/httpd/conf/mod_jk.conf

LoadModule jk_module modules/mod_jk.so
#JkWorkersFile 路径根据实际情况填写
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

#根据实际情况自己定义即可,就是将什么样的请求转发给lb1处理
#JkMount /* lb1
JkMount /* lb1
JkMount /servlet/* lb1
JkMount /*.do lb1
JkMount /*.action lb1
#JkMount /*.class lb1
#JkMount /*.jar lb1
JkMount /jkstatus status 
# 状态页

配置worker.properties

# workers 列表
workers.tomcat_home=/usr/local/tomcat/
workers.tomcat_home=/usr/java/jdk1.8.0_261-amd64
worker.list = lb1,TomcatA,TomcatB
#-------------------------------------------------
# tomcat实例1
#-------------------------------------------------
worker.TomcatA.type = ajp13              ##定向包协议
worker.TomcatA.host = 192.168.133.150     ##tomcat主机地址
worker.TomcatA.port = 8009            ##TomcatA实例端口
worker.TomcatA.lbfactor = 1          ##负载均衡权重为1
worker.TomcatA.activation = A
#-------------------------------------------------
# tomcat实例2
#-------------------------------------------------
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.133.130
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1
worker.TomcatB.activation = A
#-------------------------------------------------
# load balancer worker --负载均衡控制器
# ------------------------------------------------
worker.lb1.type = lb             ##负载均衡work,lb内置类
worker.lb1.sticky_session = 0       ##会话是否绑定
worker.lb1.balance_workers = TomcatA, TomcatB     ##指定集群拥有实例


worker.list=status
worker.status.type = status                    ##状态信息

测试

image-20230418221705423

yum安装 elinks 来测试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity之c#专题篇——【不动如山核心章】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

连接VPN后无法上网 Windows Route 轻松解决

连接VPN后无法上网 Windows Route 轻松解决 引言文档添加路由 引言 很多时候&#xff0c;我们公司的 VPN 为了不占用公司的外网带宽和安全起见&#xff0c;都会禁止访问外网。我们的电脑连接 VPN 后&#xff0c;所有的网络数据包都会走 VPN&#xff0c;从而导致我们无法访问互…

ES集群配置和分词器(九)

一直在坑自己家人&#xff0c;对&#xff0c;说的就是你&#xff0c;大A. 上一章简单介绍了SpringBoot整合 EasyES (八), 如果没有看过,请观看上一章 一. Windows 集群部署 一.一 服务复制 将 es 复制3份 一.二 配置文件配置 每个服务节点的 config/eslsticsearch.yml 配置…

AANet: CTPA图像中肺动脉栓塞检测的动脉感知网络

AANet: Artery-Aware Network for Pulmonary Embolism Detection in CTPA Images 摘要 肺栓塞(PE)是危及生命的疾病&#xff0c;计算机断层肺血管造影(CTPA)是临床上最好的诊断技术 然而&#xff0c;在CTPA图像中&#xff0c;PE通常表现为血液动脉明亮区域中的黑点&#xff0…

UE4/5多人游戏详解(一、基础理论与局域网内部的连接)

目录 多人游戏理论简单讲解 点对点&#xff1a; 于是&#xff0c;服务端和客户端的概念出现了&#xff1a; 局域网连接&#xff1a; 从第三人称c项目开始 创建项目&#xff1a; 以一个客户端作为监听服务器 3个客户端&#xff0c;在场景后方使用服务器&#xff1a; 局…

leetcode:同构字符串(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构…

数字营销(三)如何确定合适的流量渠道?

一、为什么要确定付费客户特征&#xff1f; 首先营销策略是什么&#xff1f;营销策略&#xff0c;即战略&#xff0c;就是为实现主要流量侧的长期目标&#xff0c;所采取的具体打法和步骤。 比如一个网站的成功离不开获取网站流量和用户信任的建立。除了谷歌 SEO 获取流量&am…

【JavaEE初阶】多线程(一)

摄影分享&#xff01; 文章目录 认识线程&#xff08;Thread&#xff09;概念执行多线程编程创建线程的写法1.继承Thread&#xff0c;重写run2.实现Runnable接口3.使用匿名内部类&#xff0c;继承Thread4.使用匿名内部类&#xff0c;实现Runable5.使用Lambda表达式 Thread用法…

【ARMv8/v9 MMU 页表配置 01 】

文章目录 1.1 MMU1.1.1 虚拟地址位宽配置1.1.2 页面大小(grandule size)配置1.1.3 AArch64 页表项描述符格式1.1.4 内存属性配置 1.1 MMU 1.1.1 虚拟地址位宽配置 64 位虚拟地址中&#xff0c;并不是所有位都用上&#xff0c;除了高 16 位用于区分内核空间和用户空间的虚拟地…

SpringCloud:ElasticSearch之数据聚合

聚合&#xff08;aggregations&#xff09; 可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f;这些手机的平均价格、最高价格、最低价格&#xff1f;这些手机每月的销售情况如何&#xff1f; 实现这些统计功能的比数据…

数组题目总结 -- 双指针

目录① 快慢指针&#xff1a;一. 删除有序数组中的重复项1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a;2. 总结二. 删除排序链表中的重复元素&#xff08;扩展&#xff09;1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a;2. 总结三. 移…

硬件语言Verilog HDL牛客刷题day08 综合部分

1. Johnson Counter 1.题目&#xff1a; 请用Verilog实现4位约翰逊计数器&#xff08;扭环形计数器&#xff09;&#xff0c;计数器的循环状态如下。 电路的接口如下图所示 2.解题思路 2.1 一个简单的状态机的配置。 2.2 注意 起始状态 是 0000 就行 3.解题代码 timescale …

动态内存管理——C语言【进阶】(下)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;进阶C语言&#xff0c;本专栏主要讲解数据存储&#xff0c;进阶指针&#xff0c;动态内存管理&a…

前端面试题 - 计算机网络与浏览器相关

系列文章目录 vue常见面试题总结 htmlcss 面试题总结附答案 初级前端面试题总结&#xff08;html, css, js, ajax&#xff0c;http&#xff09; js基础面试题整理(包含ES5&#xff0c;ES6) 文章目录 系列文章目录一、网络协议相关1. 从浏览器地址栏输入url到显示页面的步骤…

蓝桥杯欲伸手CTF?有多远爬多远

注意&#xff1a;网络安全类比赛 或者说 CTF 参赛不会需要任何费用 只有国赛/省赛有可能会收取一定运维费用 其他比赛都不会收费 望周知。 先来看个特离谱的事情 早上起床看到几位师傅的朋友圈一脸懵&#xff0c;再仔细一看&#xff0c;好嘛。。。。。。 先看看探姬的回复 接下…

人工智能大模型多场景应用原理解析

前言 在上篇文章《人工智能大模型之ChatGPT原理解析》中分享了一些大模型之ChatGPT的核心原理后&#xff0c;收到大量读者的反馈&#xff0c;诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式人工智能和元宇宙能擦出什么样的火花&#xff1f;)&#xff0c;大模型…

伪命题之MYSQL分库分表

看到使用分库分表来解决性能问题的时候心里总是不能太理解。 如果同事发生大量请求的时候&#xff0c;损害性能的是硬盘的随机读。那么分库分表也没有对性能的瓶颈进行“分治”啊。 应该的做法是使用一块新的硬盘来创建分库。但是基本的文章都没有提到这点。而且基本上也不会有…

价值导向型研发管理数字化建设方案——易趋亮相CCTI中国研发管理峰会

4月15日-16日&#xff0c;由光环国际举办的2023 CCTI中国研发管理峰会在北京中关村国家自主创新示范区会议中心成功举办。 &#xff08;现场签到处&#xff09; 此次峰会邀请了20余位来自腾讯、华为、网易、阿里云等知名企业的研发管理领域专家&#xff0c;带来最新前沿知识和内…

【网络安全知识体系】外网渗透测试 | 14个小实验

写在前面&#xff1a;视频地址 成功上岸360&#xff01;0基础网络安全 入行 到 入yu、漏洞挖掘-外网渗透测试流程目录 一、导读&#xff1a; 二、汇总&#xff1a; 三、知识导图 四、面试常见问题 五、渗透测试流程 1、简述&#xff1a; 2、寻找测试目标 3、信息收集 …

webgl-简单动画

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…