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

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

http://www.xdnf.cn/news/864865.html

相关文章:

  • 保险丝选型
  • Java基础原理与面试高频考点
  • 沉金PCB电路板制造有哪些操作要点需要注意?
  • 论文导读 | 区间数据管理
  • C#由于获取WPF窗口名称造成的异常报错问题
  • SQL 中 NOT IN 的陷阱?
  • 如何确定微服务的粒度与边界
  • 09.MySQL内外连接
  • 4. 数据类型
  • linux 安装 canal 的详细步骤
  • Linux I2C 子系统全解:结构、机制与工程实战
  • Hive开窗函数的进阶SQL案例
  • stm32使用hal库模拟spi模式3
  • git cherry-pick (28)
  • Redis初识
  • 华为ICT和AI智能应用
  • 深入理解系统:UML类图
  • YOLO12 改进|融入 Mamba 架构:插入视觉状态空间模块 VSS Block 的硬核升级
  • OpenCV C++ 学习笔记(六):绘制文本、几何绘图、查找/绘制轮廓
  • [蓝桥杯]取球博弈
  • 【发布实录】云原生+AI,助力企业全球化业务创新
  • Odoo17 技巧 | 如何获取Selection字段的显示值五种方法
  • Cisco IOS XE WLC 任意文件上传漏洞复现(CVE-2025-20188)
  • powershell 安装 .netframework3.5
  • CentOS7 + JDK8 虚拟机安装与 Hadoop + Spark 集群搭建实践
  • .Net Framework 4/C# 集合和索引器
  • C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
  • .NET 9中的异常处理性能提升分析:为什么过去慢,未来快
  • .net jwt实现
  • 12.RSA