5.Nginx+Tomcat负载均衡群集

article/2025/6/10 16:47:32

Tomcat服务器应用场景:tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或者Nginx这些Web服务器一样,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端。

一.Tomcat的安装部署

1.1实施准备

(1)关闭firewalld防火墙

systemctl stop firewalld

setenforce 0

(2)在安装Tomcat之前必须先安装JDK

JDK的全称是Java Development Kit,是sun公司免费提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM)。编写好的Java源程序经过编译可形成Java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了Java的跨平台性。

1.2查看JDK是否安装

java -version

1.3安装配置Tomcat

(1)Tomcat的安装和配置步骤如下:

解压软件包

tar zxvf apache-tomcat-.......

(2)将解压后的文件夹移动到/usr/local下并改名为tomcat

mv apache-tomacat-....  /usr/local/tomcat

(3)启动tomcat

cat/usr/local/tomcat/bin/startup.sh

Tomcat默认运行在8080端口,运行netstat命令查看8080端口监听的net

netstat -anpt | grep 8080

(4)打开浏览器访问测试:http://192.168.10.101:8080/,如果出现如下图,则表示已经启动成功

如果想关闭Tomcat,则运行/usr/local/tomcat/bin/shutdown.sh命令

1.4Tomcat配置相关说明

Tomcat的主目录为/usr/local/tomcat

ll /usr/local/tomcat/

(1)主要目录说明

bin/:存放Windowns或Linux平台上启动和关闭Tomcat的脚本文件

conf/:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml

lib/:存放Tomcat运行需要的库文件(JARS)

logs/:存放Tomcat执行时的LOG文件

webapps:Tomcat的主要Web发布目录(包括应用程序实例)

work:存放JSP编译后产生的class文件

(2)配置文件说明

catalina.policy:权限控制配置文件

catalina.propertise:Tomcat属性配置文件

context.xml:上下文配置文件

logging.properties:日志log相关配置文件

server.xml:主配置文件

tomcat-users.xml:manager-gui管理用户配置文件

web.xml:Tomcat的servlet、servlet-mapping、filter、MIME等相关配置

2.5Tomcat主配置文件说明

server.xml为Tomcat的主要配置文件,通过此文件开源修改Tomcat的启动端口、网站目录、虚拟主机、开启https等重要功能

整个server.xml由以下结构构成:<Server>、<Service>、<Connector/>、<Engine>、<Host>、<Context>、</Context>、</Host>、</Engine>、</Service>和</Server>。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps"
                  unpackWARs="true" autoDeploy="true">
                <Context path="/myapp" docBase="/path/to/myapp" />
            </Host>
        </Engine>
    </Service>
</Server>
<Server>

• port="8005":指定Tomcat服务器监听的用于接收关闭命令的端口。

• shutdown="SHUTDOWN":设置关闭服务器的命令字符串。

<Connector>

• port="8080":Tomcat监听HTTP请求的端口号。

• protocol="HTTP/1.1":使用的HTTP协议版本。

• connectionTimeout="20000":连接超时时间,单位为毫秒。

• redirectPort="8443":当需要SSL加密连接时,将请求重定向到的端口。

<Engine>

• name="Catalina":引擎的名称。

• defaultHost="localhost":默认的虚拟主机名。

<Host>

• name="localhost":虚拟主机的名称。

• appBase="webapps":Web应用程序的基础目录。

• unpackWARs="true":是否自动解压WAR文件。

• autoDeploy="true":是否自动部署应用程序。

<Context>

• path="/myapp":Web应用的上下文路径。

• docBase="/path/to/myapp":Web应用的实际文件目录。

2.6Tomcat Server的组成部分说明

(1)Server

代表了整个Catalina的servlet容器

(2)Service

Service是这样一个集合:它由一个或者多个Connector,以及一个Engine(负责处理所有Connector所获得的客户请求)组成

(3)Connector

一个Connector在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户

Tomcat有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其他WebServer的请求

Coyote Http/1.1 Connector在端口8080处侦听来自客户browser的http请求

Coyote JK2 Connector在端口8009处侦听来自其他webserver的servlet/jsp代理请求

(4)Engine

Enginxe下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名,当Engine获得一个请求时,他把该请求匹配到某个Host上,然后把该请求交给该Host来处理

Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

(5)Host

代表一个Virtual Host,即虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配

每个虚拟主机下都可以部署一个或者多个Web app,每个web app对应于一个Context,有一个Context path

当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理,匹配的方法是“最长的匹配”,所以一个path==""的Context将成为Host的默认Context

(6)Context

所有无法和其他Context对应于一个Web Application,一个Web application由一个或者多个Servlet组成

2.7建立Java的Web站点

(1)在根目录下建立一个web目录,并在里面建立一个webapp1目录,用于存放网站文件

mkdir -p /web/webapp1

(2)在webapp1目录下建立一个index.jsp的测试页面

vim /wen/webapp1/index.jsp

(3)修改Tomcat的server.xml文件

定义一个虚拟主机,并将网站文件路径指向已经建立的/web/webapp1,在host段增加context段

vim /usr/local/tomcat/conf/server.xml

   <Context doBase="/web/webapp1"  path=""  reloadable="false"  >

   </Context>

</Host>

(4)关闭Tomcat,再重新启动

/usr/local/tomcat/bin/shutdown.sh

/usr/local/tomcat/bin/startup.sh

(5)确认web站点

通过浏览器访问http://192.168.10.101:8080/,出现如图所示,说明该Tomcat站点已经配置成功,并且已经能够运行JSP了

显式“静态页面的图片2”文字,并没有出现logo.jpg图片,原因是由于静态图片暂时没配,所以加载不出来

二.案例:Nginx+Tomcat负载均衡、动静分离群集

1.案例分析

1.1案例概述

通常情况下,一台Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的 请求等问题,不能单独应用于生产环境下,所以需要一套更可靠的解决方案来完善 Web 站点 架构。
Nginx 是一款非常优秀的 http 服务器软件,它能够支持高达 50000 个并发连接数的响应,拥有强大的静态资源处理能力,运行稳定,并且内存、CPU等系统资源消耗非常低。目 前很多大型网站都应用 Nginx 服务器作为后端网站程序的反向代理及负载均衡器,来提升整 个站点的负载并发能力。
Nginx 是一个非常强大的静态 web 服务,Tomcat 处理动态请求效率不高,而一般网站大 多数的内容都是静态文件(如图片、html、css、js 等),经过 Nginx 前端的反向代理加速 和过滤,后端Tomcat 处理请求的压力便可大大减少,只需负责处理动态内容就可以了。在 性能与稳定性的权衡下,使用 NginxtTomcat 搭配便可让它们在各自擅长的领域大展拳脚。

1.2案例环境

主机IP地址操作系统应用
Tomcat1服务器

192.168.10.101

openeuler24apache-tomcat
Tomcat2服务器192.168.10.102openeuler24apache-tomcat
Nginx服务器192.168.10.103openeuler24nginx

需求:

a.安装nginx、tomcat

b.nginx、tomcat配置

c、编写动静分离页面

2.案例实施

2.1Tomcat2 server配置

(1)关闭防火墙

(2)确认是否安装 JDK,JAVA 版本与 Tomcatl server 保持一致。

(3)安装配置 Tomcat,版本与 Tomcatl server 保持一致。

(4)创建/web/webapp1 目录,修改 Tomcat 配置文件 server.xml,将网站文件目录更改 到/web/webapp1/路径下。

(5)在/web/webapp1/路径下建立 index.jsp,为了区别将测试页面 index.jsp 的内容更改如下。

vim /web/webapp1/index.jsp

(6)启动 Tomcat,浏览器访问 Tomcat2 server, 测试 http://192.168.10.102:8080/

2.2Nginx服务器配置

在nginx服务器上安装nginx,反向代理到两个Tomcat站点,并实现负载均衡

(1)关闭防火墙

systemctl stop firewalld

setenforce 0

(2)安装相关软件包。

dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker

(3)解压并安装 Nginx。

useradd-M-s /sbin/nologin nginx

tar zxf nginx-l.26.3. tar. gz

 cd nginx-l.26.3

./configure  --prefix=/usr/local/nginx  --user=nginx  --group=nginx  --with-http_ssl_module --with-http_v2_module  --with-pcre

make && make install

(4)配置 nginx.conf

vim /usr/local/nginx/conf/nginx.conf

在 http {…}中加入以下代码,设定负载均衡的服务器列表,weight 参数表示权重,权重越高,被分配到的概率越大。为了使测试效果比较明显,我们把权重设置为一样

upstream tomcat server  {

        server 192.168.10.101:8080 weight=1;

        server 192.168.10.102:8080 weight=l;

}

下面是编辑 Nginx 静态页面文件。

 vim /usr/local/nginx/html/index.html

<!DOCTYPE html>
<html>
<head>

<meta http-equiv="content-type"  content="text/html;charset=utf-8”>

<title>静态页面</title>

<style>

body {

width: 35em;

margin:0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;

}

</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是个静态页面</p>
</body>
</html>

//在 http{…}- server{…}中加入 location~.*.jsp${…}动态请求条件规则以及静态图片请求规则。

.......

location ~.*.jsp$ {                          //动态页面正则

      proxy_set_header HOST $host;

      proxy set header X-Real-IP $remote addr;

      proxy set header Client-IP $remote addr;

      proxy set header X-Forwarded-For $proxy add x forwarded for;

      proxy pass http://tomcat server;

}

location ~.*\.(gif jpgljpeg|pnglbmp|swf)$   {                  //静态图片正则

      root /usr/local/nginx/html/img;

      expires 30d;

}

location /  {
      root html;
      index index.html index.htm;

}

......

把 Nginx 的默认站点通过 proxy_pass 方法代理到了设定好的 tomcat_server 负载均衡服务器组上。配置完整的 nginx.conf 文件内容如下。

http  {
…… 
#gzip on;
upstream tomcat_server {
server 192.168.10.101:8080 weight=1;
server 192.168.10.102:8080 weight=1;

}

server {

      listen 80;
      server_name localhost;
      #charset koi8-r;
      #access_log logs/host.access.log main;

      location ~ .*.jsp$ {

            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr,
            proxy_set_header Client-Ip $remote_addr;
            proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_pass http://tomcat_server;

}

location ~ .*\.(gir | jpg | jpeg |png | bmp | swf | css)$ {

      root /usr/local/nginx/html/img;

      expires 30d;

}

location / {
      root html.
      index index.html index.htm;

}

下面在Nginx上准备静态图片

mkdir /usr/local/nginx/html/img //创建静态文件目录

cp /root/logo.jpg /usr/local/nginx/html/img

测试 Nginx 配置文件是否正确。

 /usr/local/nginx/sbin/nginx  -t

启动 Nginx 服务

/usr/local/nginx/sbin/nginx  -c 

查看 Nginx 服务进程

ps aux | grep nginx

nginx 查看端口号及 PID 进程号

netstat -anpt | grep nginx 

2.3测试效果

(1)测试静态页面效果

浏览器访问http://192.168.10.103/,可以看到访问到nginx静态页面

(2)测试负载均衡效果

打开浏览器访问 http://192.168.10.103/index.jsp。不断刷新浏览器测试,可以看到由于权重相同,页面会反复在以下两个页面来回切换。第一次访问,出现 test1 的测试页面,并且能正常加载 nginx 上的静态页面图片,刷新后,第二次访问,出现 test2 的测试页面。

此时负载均衡群集搭建成功,已经可以在两个Tomcat server站点进行切换了


http://www.hkcw.cn/article/CXInCCRyVs.shtml

相关文章

【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)

说明&#xff1a;博主是大学生&#xff0c;有一门课是算法设计与分析&#xff0c;这是博主记录课程实验报告的内容&#xff0c;题目是老师给的&#xff0c;其他内容和代码均为原创&#xff0c;可以参考学习&#xff0c;转载和搬运需评论吱声并注明出处哦。 4-1算法实现题 汽车…

网络爬虫 - App爬虫及代理的使用(十一)

App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…

SQLite详细解读

一、SQLite 是什么&#xff1f; SQLite 是一个嵌入式关系型数据库管理系统&#xff08;RDBMS&#xff09;。它不是像 MySQL 或 PostgreSQL 那样的客户端-服务器数据库引擎&#xff0c;而是一个自包含的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 核心特点 嵌入式/库…

线程池详细解析(三)

本章我们来讲一讲线程池的最后一个方法shutdown&#xff0c;这个方法的主要作用就是将线程池进行关闭 shutdown&#xff1a; public void shutdown() {ReentrantLock var1 this.mainLock;var1.lock();try {this.checkShutdownAccess();this.advanceRunState(0);this.interrup…

口碑对比:杭州白塔岭画室和燕壹画室哪个好?

从口碑方面来看&#xff0c;杭州燕壹画室和白塔岭画室各有特点&#xff0c;以下是具体分析&#xff1a; 燕壹画室 教学成果突出&#xff1a; 其前身燕壹设计工作室在2019 - 2023年专注美院校考设计&#xff0c;有一定的教学积淀&#xff0c;2023年转型后第一年攻联考就斩获浙…

车载雷达:超声波雷达、毫米波雷达、激光雷达相关技术场景介绍和技术比较

随着技术发展,如今的汽车智能化程度越来越高,配备的传感器也越来越多,特别是与辅助驾驶相关的汽车雷达,它们如同汽车的 “眼睛”,帮助车辆感知周围环境。为了适配不同的使用场景和功能需求,汽车雷达也分为很多类型,并且各具特点。 一、技术特点 一)超声波雷达 超声波…

Spring AI Advisor机制

Spring AI Advisors 是 Spring AI 框架中用于拦截和增强 AI 交互的核心组件&#xff0c;其设计灵感类似于 WebFilter&#xff0c;通过链式调用实现对请求和响应的处理5。以下是关键特性与实现细节&#xff1a; 核心功能 ‌1. 请求/响应拦截‌ 通过 AroundAdvisor 接口动态修…

GPTBots在AI大语言模型应用中敏感数据匿名化探索和实践

背景 随着人工智能技术的快速发展&#xff0c;尤其是大语言模型&#xff08;LLM-large language model&#xff09;在金融、医疗、客服等领域的广泛应用&#xff0c;处理海量数据已成为常态。然而&#xff0c;这些数据中往往包含个人可识别信息&#xff08;PII-Personally Ide…

使用 C++/OpenCV 制作跳动的爱心动画

使用 C/OpenCV 制作跳动的爱心动画 本文将引导你如何使用 C 和 OpenCV 库创建一个简单但有趣的跳动爱心动画。我们将通过绘制参数方程定义的爱心形状&#xff0c;并利用正弦函数来模拟心跳的缩放效果。 目录 简介先决条件核心概念 参数方程绘制爱心动画循环模拟心跳效果 代码…

入门AJAX——XMLHttpRequest(Get)

一、什么是 AJAX AJAX Asynchronous JavaScript And XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 1、XML与异步JS XML: 是一种比较老的前后端数据传输格式&#xff08;已经几乎被 JSON 代替&#xff09;。它的格式与HTML类似&#xff0c;通过严格的闭合自定义标…

MDP的observations部分

文章目录 1.isaaclab的observations1.1 根状态相关观测base_pos_zbase_lin_vel &#xff08;use&#xff09;base_ang_vel &#xff08;use&#xff09;projected_gravity (use)root_pos_wroot_quat_wroot_lin_vel_wroot_ang_vel_w 1.2 关节状态相关观测joint_posjoint_pos_rel…

Rhino插件大全下载指南:解锁犀牛潜能,提升设计效率

Rhinoceros&#xff08;简称Rhino&#xff0c;犀牛&#xff09;以其强大的NURBS曲面建模能力、灵活的脚本环境以及与Grasshopper参数化设计工具的无缝集成&#xff0c;在全球工业设计、建筑设计、珠宝设计、船舶设计等领域备受推崇。为了进一步拓展Rhino的功能&#xff0c;满足…

百万级临床试验数据库TrialPanorama发布!AI助力新药研发与临床评价迎来新基石

2025年5月22日&#xff0c;伊利诺伊大学厄巴纳-香槟分校的研究团队在《arXiv》上发表了一篇前瞻性研究论文《TrialPanorama: Database and Benchmark for Systematic Review and Design of Clinical Trials》&#xff0c;该研究建立了一个临床试验数据库TrialPanorama&#xff…

运维 vm 虚拟机ip设置

虚拟网络设置 nat 模式 网卡 主机设置网卡地址 虚拟机绑定网卡

问题七、isaacsim中添加IMU传感器

0 前言 NVIDIA Isaac Sim 中的 IMU 传感器可跟踪车身运动并输出模拟加速度计和陀螺仪读数。与真实 IMU 传感器一样,模拟 IMU 可通过平台单元提供局部 x、y、z 轴的加速度和角速度测量值。 1 创建IMU传感器 按照下述步骤依次点击 使用python创建 基于IsaacSensorCreateImuSe…

AutoGenTestCase - 借助AI大模型生成测试用例

想象一下&#xff0c;你正在为一个复杂的支付系统编写测试用例&#xff0c;需求文档堆积如山&#xff0c;边缘场景层出不穷&#xff0c;手动编写让你焦头烂额。现在&#xff0c;有了AutoGenTestCase&#xff0c;这个AI驱动的“测试用例生成机”可以从需求文档中自动生成数百个测…

警惕假冒 CAPTCHA 攻击通过多阶段payload链部署远控和盗窃信息

在过去几个月中&#xff0c;Trend Micro 托管检测与响应&#xff08;MDR&#xff09;调查中发现假冒 CAPTCHA 的案例激增。这些 CAPTCHA 通过钓鱼邮件、URL 重定向、恶意广告或 SEO 污染投放。所有观察到的案例均表现出类似行为&#xff1a;指导用户将恶意命令复制粘贴到 Windo…

2024-2025-2-《移动机器人设计与实践》-复习资料-8……

2024-2025-2-《移动机器人设计与实践》-复习资料-1-7-CSDN博客 08 移动机器人基础编程 单选题&#xff08;6题&#xff09; 在ROS中&#xff0c;用于移动机器人速度控制的消息类型通常是&#xff1f; A. std_msgs/StringB. geometry_msgs/TwistC. sensor_msgs/ImageD. nav_ms…

楼宇自控系统赋能设备管理智能化集中化,驱动建筑节能高效运行

在建筑行业追求可持续发展与高效运营的当下&#xff0c;传统建筑设备管理模式因信息分散、调控粗放等问题&#xff0c;导致能源浪费严重、设备维护成本高企。而楼宇自控系统凭借对建筑内各类设备的智能化、集中化管理能力&#xff0c;成为解决这些难题的关键。通过实时监测、智…

三、kafka消费的全流程

五、多线程安全问题 1、多线程安全的定义 使用多线程访问一个资源&#xff0c;这个资源始终都能表现出正确的行为。 不被运行的环境影响、多线程可以交替访问、不需要任何额外的同步和协同。 2、Java实现多线程安全生产者 这里只是模拟多线程环境下使用生产者发送消息&…