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

Nginx+Tomcat负载均衡与动静分离架构

目录

简介

一、Tomcat基础部署与配置

1.1 Tomcat应用场景与特性

1.2 环境准备与安装

1.3 Tomcat主配置文件详解

1.4 部署Java Web站点

二、Nginx+Tomcat负载均衡群集搭建

2.1 架构设计与原理

2.2 环境准备

2.3 Tomcat2配置(与Tomcat1对称)

2.4 Nginx安装与配置

三、测试与验证

四、架构总结

4.1 架构优势

4.2 生产环境优化建议


简介

在现代Web应用架构中,如何高效处理日益增长的访问量和复杂的请求类型成为关键挑战。本文将详细介绍如何通过Nginx与Tomcat的组合,构建高性能的负载均衡群集并实现动静资源分离,为Java Web应用提供稳定可靠的生产环境解决方案。

一、Tomcat基础部署与配置

1.1 Tomcat应用场景与特性

Tomcat作为Apache基金会的开源Web应用服务器,是中小型Java Web项目的首选容器。它轻量级、开源且支持JSP/Servlet规范,但处理静态资源效率较低。典型应用场景中,Tomcat常作为后端动态请求处理器,与前端Nginx/Apache等静态服务器配合使用。

1.2 环境准备与安装

关闭防火墙与SELinux

systemctl stop firewalld  # 停止防火墙服务
setenforce 0              # 临时关闭SELinux强制模式

解释:防火墙和SELinux可能阻止服务端口访问,生产环境可通过配置规则替代关闭,但测试环境建议临时关闭以简化流程。

安装JDK(Tomcat运行依赖)

# 检查JDK是否安装
java -version
# 若未安装,使用包管理器安装(以OpenEuler为例)
dnf install -y java-1.8.0-openjdk-devel

解释:JDK包含Java虚拟机(JVM),是运行Tomcat的基础,需确保版本与Tomcat兼容(本文使用1.8版本)。

部署Tomcat

# 解压安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动到指定目录并重命名
mv apache-tomcat-9.0.8 /usr/local/tomcat9
# 启动Tomcat
/usr/local/tomcat9/bin/startup.sh

解释:Tomcat采用绿色部署模式,解压即可使用。startup.sh脚本会启动Java进程并监听默认8080端口。

验证启动状态

# 查看8080端口监听
netstat -anpt | grep 8080
# 浏览器访问测试
http://192.168.10.101:8080/

预期结果:出现Tomcat默认欢迎页面,证明服务启动成功。

1.3 Tomcat主配置文件详解

Tomcat核心配置位于​​/usr/local/tomcat9/conf/server.xml​​,其结构由多层组件构成:

<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps"><Context docBase="/web/webapp1" path="" reloadable="true" /></Host></Engine></Service>
</Server>

关键组件解释

  • ​Server​​:整个Catalina容器的顶层组件,管理服务生命周期
  • ​Connector​​:监听端口的连接器,HTTP连接器默认8080端口,AJP连接器默认8009端口
  • ​Engine​​:处理所有连接器请求的引擎,可配置多个虚拟主机
  • ​Host​​:虚拟主机配置,appBase指定Web应用部署目录
  • ​Context​​:Web应用上下文配置,docBase指定实际文件路径,path为空时为默认应用
1.4 部署Java Web站点
# 创建网站目录
mkdir -pv /web/webapp1
# 创建测试JSP页面
vim /web/webapp1/index.jsp

index.jsp内容

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<body>
<%out.println("动态页面1,http://www.test1.com");%>
<div>静态页面的图片1</div><br><img src="logo.jpg">
</body>
</html>

修改server.xml配置

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"><!-- 新增Context配置 --><Context docBase="/web/webapp1" path="" reloadable="true" />
</Host>

解释:​​reloadable="true"​​表示当类文件变化时自动重新加载,生产环境建议设为false以提升性能。

二、Nginx+Tomcat负载均衡群集搭建

2.1 架构设计与原理

Nginx+Tomcat组合的核心优势在于:

  • Nginx处理静态资源(图片/CSS/JS)效率极高,可缓存30天
  • Tomcat专注处理动态请求(JSP/Servlet),减轻资源消耗
  • 通过Nginx的upstream模块实现多Tomcat实例的负载均衡
2.2 环境准备

主机

IP地址

操作系统

应用

Tomcat1

192.168.10.101

OpenEuler24

Tomcat 9.0.8

Tomcat2

192.168.10.102

OpenEuler24

Tomcat 9.0.8

Nginx

192.168.10.103

OpenEuler24

Nginx 1.26.3

2.3 Tomcat2配置(与Tomcat1对称)
# 修改测试页面内容以区分节点
vim /web/webapp1/index.jsp

Tomcat2的index.jsp

<%out.println("动态页面2,http://www.test2.com");%>
<div>动态页面的图片2</div><br><img src="logo.jpg">

解释:通过修改输出内容,便于后续测试负载均衡效果时区分不同Tomcat节点。

2.4 Nginx安装与配置

编译安装Nginx(含必要模块)

# 安装编译依赖
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker
# 创建非特权运行用户
useradd -M -s /sbin/nologin nginx
# 解压安装包
tar zxf nginx-1.26.3.tar.gz
cd nginx-1.26.3
# 配置编译参数
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre
# 编译安装
make && make install

参数解释

  • ​--prefix​​:指定安装目录
  • ​--user/--group​​:设置运行用户,提升安全性
  • ​--with-http_ssl_module​​:启用HTTPS支持
  • ​--with-pcre​​:支持正则表达式处理

核心配置nginx.conf

http {# 负载均衡服务器组定义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;# 动态请求处理(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|jpg|png|bmp|swf|css|js) {root /usr/local/nginx/html/img;expires 30d;}# 首页默认处理location / {root html;index index.html index.htm;}}
}

配置解析

  • ​upstream tomcat_server​​:定义名为tomcat_server的服务器组,weight=1表示权重相同,请求均匀分配
  • ​location ~ \.jsp$​​:正则匹配所有JSP请求,通过proxy_pass转发到Tomcat服务器组
  • ​proxy_set_header​​:设置代理请求头,传递客户端真实IP等信息
  • ​location ~* \.(gif|jpg|png|...)​​:匹配静态资源后缀,root指定文件根目录,expires 30d设置缓存30天
  • ​location /​​:处理根路径请求,返回Nginx默认首页

准备静态资源并启动Nginx

# 创建静态资源目录
mkdir /usr/local/nginx/html/img
# 复制测试图片
cp /root/logo.jpg /usr/local/nginx/html/img
# 测试配置文件语法
/usr/local/nginx/sbin/nginx -t
# 启动Nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 查看服务状态
ps aux | grep nginx
netstat -anpt | grep nginx

三、测试与验证

3.1 静态页面测试

访问​​http://192.168.10.103/​​,应看到Nginx默认静态页面:

<h1>静态页面</h1>
<p>这是个静态页面</p>

原理:Nginx直接响应根路径请求,无需经过Tomcat,提升静态资源访问效率。

3.2 负载均衡效果测试

访问​​http://192.168.10.103/index.jsp​​并刷新,页面应在以下内容间交替显示:

  • "动态页面1,http://www.test1.com"(来自Tomcat1)
  • "动态页面2,http://www.test2.com"(来自Tomcat2)

关键现象

  1. 首次访问随机分配到某一Tomcat节点
  2. 刷新后请求均匀分发到不同节点
  3. 静态图片(logo.jpg)由Nginx直接提供,加载速度快

3.3 动静分离验证

在JSP页面中,静态图片元素​​<img src="logo.jpg">​​​由Nginx的​​/usr/local/nginx/html/img​​目录直接提供,而JSP动态内容由Tomcat处理,实现了资源处理的分工优化。

四、架构总结

4.1 架构优势
  1. 性能提升:Nginx处理静态资源效率比Tomcat高3-5倍,减少后端压力
  2. 高可用性:多Tomcat节点避免单点故障,Nginx支持平滑重启
  3. 资源优化:Tomcat专注动态逻辑处理,内存/CPU占用更合理
  4. 可扩展性:轻松添加新Tomcat节点,Nginx自动负载均衡
4.2 生产环境优化建议
  1. 安全加固
  • 配置Nginx访问控制,限制非法IP
  • Tomcat关闭默认管理端口(8005)
  • 启用HTTPS(配置ssl_certificate和ssl_certificate_key)
  1. 性能调优
  • Nginx增加worker_processes和worker_connections
  • Tomcat调整JVM参数(-Xms/-Xmx)和连接器参数(maxThreads)
  • 开启Nginx gzip压缩(gzip on; gzip_types text/css text/js)
  1. 监控与告警
  • 部署Prometheus+Grafana监控Nginx和Tomcat状态
  • 配置Zabbix告警规则(如CPU超过80%、Tomcat节点宕机)
  1. 会话一致性
  • 若需要会话保持,可在Nginx配置​​ip_hash​​策略
  • 或使用Redis实现分布式会话共享

Nginx+Tomcat负载均衡与动静分离的这种架构在电商、资讯类网站中广泛应用,能够有效应对日均百万级访问量的挑战。在实际部署时,建议根据业务规模调整服务器配置与优化参数,确保系统始终保持高性能运行状态。

相关文章:

Nginx+Tomcat负载均衡与动静分离架构

目录 简介 一、Tomcat基础部署与配置 1.1 Tomcat应用场景与特性 1.2 环境准备与安装 1.3 Tomcat主配置文件详解 1.4 部署Java Web站点 二、NginxTomcat负载均衡群集搭建 2.1 架构设计与原理 2.2 环境准备 2.3 Tomcat2配置&#xff08;与Tomcat1对称&#xff09; 2.4…...

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…...

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…...

css | class中 ‘.‘ 和 ‘:‘ 的使用 | 如,何时用 .is-selected{ ... } 何时用 :hover{...}?

省流总结&#xff1a;交互时的短暂视觉反馈 → 用 :hover&#xff0c;状态需要记录或切换 → 用类名如 .is-selected。 &#x1f9e0; 本质区别&#xff1a; 写法触发方式用途&.is-selected依赖 class 切换需要 JavaScript 控制状态&#xff0c;如选中、激活&:hover鼠…...

【第九篇】 SpringBoot测试补充篇

简介 本文介绍了SpringBoot测试中的五项关键技术&#xff1a;测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置&#xff09;。这些技术可以有效隔离测试环境&#xff0c;确保测试数据不影响生产环境&#xff0c;同时提供了…...

springcloud SpringAmqp消息队列 简单使用

这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。 前提 如果没有安装RabbitMQ是无法连接成功的&#xff01;所以前提是你要安装好RabbitMQ。 docker 安装命令 # 拉取docker镜像 docker pull rabbitmq:management# 创建容器 docker run -id --namera…...

Framework开发之IMS逻辑浅析1--关键线程及作用

关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰&#xff0c;写字笔&#xff0c;键盘等)&#xff0c;每种类型都对应一种驱动设备&#xff0c;而每个硬件驱动设备又对应Linux的一个目录文件…...

The Quantization Model of Neural Scaling

文章目录 摘要1引言2 理论3 概念验证&#xff1a;一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因&#xff08;monogenic&#xff09;与多基因&#xff08;polygenic&#xff09;的规模曲…...

数据源指的是哪里的数据,磁盘中还是内存中

在 MyDB 项目中&#xff0c;特别是这段缓存框架代码&#xff1a; T obj getForCache(key);以及它的上下文&#xff1a; AbstractCache 是一个抽象类&#xff0c;内部有两个抽象方法&#xff0c;留给实现类去实现具体的操作&#xff1a; protected abstract T getForCache(lon…...

系统思考:跳出症状看全局

明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程&#xff01;通过经典的啤酒游戏经营决策沙盘&#xff0c;一起沉浸式体验如何从全局视角看待问题&#xff0c;发现单点最优并不等于全局最优。 这不仅是一次简单的课程&#xff0c;更是一次洞察系统背后…...

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进

最近&#xff0c;AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2&#xff08;具体型号R1-0528&#xff09;。这款基于MIT许可的开源模型&#xff0c;在原版R1的基础上进行了多项令人瞩目的改进&#xff0c;正以其强大的潜…...

surfer15安装

安装文件 安装包和破解文件 安装 破解及汉化 打开软件...

MySQL从入门到DBA深度学习指南

目录 引言 MySQL基础入门 数据库基础概念 MySQL安装与配置 SQL语言进阶 数据库设计与规范化 数据库设计原则 表结构设计 MySQL核心管理 用户权限管理 备份与恢复 性能优化基础 高级管理与高可用 高可用与集群 故障诊断与监控 安全与审计 DBA实战与运维 性能调…...

Python训练营---DAY48

DAY 48 随机函数与广播机制 知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机…...

debian12拒绝海外ip连接

确保 nftables 已安装&#xff1a; Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装&#xff1a; sudo apt update sudo apt install nftables启用并启动 nftables 服务 sudo systemctl enable nftables sudo systemctl start nftables下载maxmind数据库 将文件解…...

70年使用权的IntelliJ IDEA Ultimate安装教程

安装Java环境 下载Java Development Kit (JDK) 从Oracle官网或OpenJDK。推荐选择JDK 11或更高版本。 运行下载的安装程序&#xff0c;按照提示完成安装。注意记录JDK的安装路径&#xff08;如C:\Program Files\Java\jdk-11.0.15&#xff09;。 配置环境变量&#xff1a; 右键…...

MySQL的日志

就相当于人的日记本&#xff0c;记录每天发生的事&#xff0c;可以对数据进行追踪 一、错误日志 也就是存放错误信息的 二、二进制日志-binlog 在低版本的MySQL中&#xff0c;二进制日志是不会默认开启的 存放除了查询语句的其他语句 三、查询日志 查询日志会记录客户端的所…...

低功耗高安全:蓝牙模块在安防系统中的应用方案

随着物联网(IoT)和智能家居的快速发展&#xff0c;安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术&#xff0c;凭借其低成本、易部署和智能化管理等优势&#xff0c;在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...

数据库(sqlite)基本操作

数据库&#xff08;sqlite&#xff09; 一&#xff1a;简介&#xff1a; 为什么需要单独的数据库来进行管理数据&#xff1f; 数据的各种查询功能数据的备份和恢复花大量时间在文件数据的结构设计和维护上要考虑多线程对数据的操作会涉及到同步问题&#xff0c;会增加很多额…...

【HarmonyOS 5】游戏开发教程

一、开发环境搭建 ‌工具配置‌ 安装DevEco Studio 5.1&#xff0c;启用CodeGenie AI助手&#xff08;Settings → Tools → AI Assistant&#xff09;配置游戏模板&#xff1a;选择"Game"类型项目&#xff0c;勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…...

神经元激活函数在神经网络里起着关键作用

神经元激活函数在神经网络里起着关键作用&#xff0c;它能为网络赋予非线性能力&#xff0c;让网络可以学习复杂的函数映射关系。下面从多个方面详细剖析激活函数的作用和意义&#xff1a; 1. 核心作用&#xff1a;引入非线性因素 线性模型的局限性&#xff1a; 假设一个简单…...

[蓝桥杯 2024 国 B] 蚂蚁开会

问题描述 二维平面上有 n 只蚂蚁&#xff0c;每只蚂蚁有一条线段作为活动范围&#xff0c;第 i 只蚂蚁的活动范围的两个端点为 (uix,uiy),(vix,viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费&#xff0c;它们决定只在所有交点为整点的地方设置会议…...

GIT(AI回答)

在Git中&#xff0c;git push 命令主要用于将本地分支的提交推送到‌远程仓库‌&#xff08;如GitHub、GitLab等&#xff09;。如果你希望将本地分支的改动同步到另一个‌本地分支‌&#xff0c;这不是 git push 的设计目的。以下是正确的替代方法&#xff1a; 方法1&#xff1…...

JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”

问题: java语言编辑&#xff0c;实现TF-IDF算法 &#xff1a;用于文本特征提取。 解答思路: TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常用的文本特征提取方法&#xff0c;用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的…...

C++定长内存块的实现

内存池 内存池是指程序预先从操作系统 申请一块足够大内存 &#xff0c;此后&#xff0c;当程序中需要申请内存的时候&#xff0c;不是直接向操作系统申请&#xff0c;而是 直接从内存池中获取 &#xff1b; 同理&#xff0c;当 **程序释放内存 **的时候&#xff0c;并不真正将…...

【判断自整除数】2022-4-6

缘由是判断自整除数的&#xff0c;这个我的结果是正确的&#xff0c;但是提交就有运行错误是怎么回事啊-编程语言-CSDN问答 void 自整除数字() {//所谓的自整除数字就是该数字可以整除其每一个位上的数字。 //对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自…...

使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二

今天带大家实战一下如何通过ansible在windows 服务器上给iis web site安装证书。 前提条件: 准备一张pfx证书,可以通过openssl工具来生成,具体的步骤请参考帮助文档。一台安装了iis 的windows 服务器 准备inventory文件 [windows] solarwinds ansible_host=20.47.126.72 a…...

Unity使用代码分析Roslyn Analyzers

一、创建项目&#xff08;注意这里不要选netstandard2.1会有报错&#xff09; 二、NuGet上安装Microsoft.CodeAnalysis.CSharp 三、实现[Partial]特性标注的类&#xff0c;结构体&#xff0c;record必须要partial关键字修饰 需要继承DiagnosticAnalyzer 注意一定要加特性Diagn…...

大数据CSV导入MySQL

CSV Import MySQL 源码主要特性技术栈快速开始1. 环境要求2. 构建项目3. 使用方式交互式模式命令行模式编程方式使用 核心组件1. CsvService2. DatabaseService3. CsvImportService 数据类型映射性能优化1. 连接池优化2. 批量操作优化3. MySQL配置优化 配置说明application.yml…...

GitHub 趋势日报 (2025年06月04日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1757 onlook 870 nautilus_trader 702 ChinaTextbook 582 system-design-primer 4…...