从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构

文章目录

  • 从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构
    • 一、基础铺垫:什么是反向代理?
      • 1.1 反向代理的核心原理
      • 1.2 Nginx反向代理实战配置
        • 步骤1:编辑Nginx配置
        • 步骤2:生效配置并验证
    • 二、进阶:Nginx负载均衡——应对高并发的核心方案
      • 2.1 负载均衡的核心价值
      • 2.2 Nginx常用负载均衡策略(附配置)
        • 1. 轮询(Round Robin):默认策略,均匀分配
        • 2. 加权轮询(Weighted Round Robin):按性能分配流量
        • 3. 最少连接数(Least Connections):动态平衡负载
        • 4. IP哈希(IP Hash):会话保持的关键
        • 5. 最少时间(Least Time):优先响应最快的节点
      • 2.3 负载均衡的高可用配置:故障转移与健康检查
        • 1. 故障转移配置
        • 2. 健康检查
    • 三、后端支撑:Tomcat的核心原理与配置
      • 3.1 Tomcat的本质与核心流程
      • 3.2 Tomcat核心配置文件
      • 3.3 关键配置:Tomcat与数据库连接(JNDI数据源)
        • 步骤1:配置数据源(`conf/context.xml`)
        • 步骤2:应用中获取数据源
      • 3.4 Tomcat部署注意事项
    • 四、整体架构总结:Nginx + Tomcat 协同工作流程
    • 五、实际应用场景与优化建议
    • 结语

在Web服务架构中,单台服务器往往难以应对高并发、高可用的业务需求。Nginx凭借其高性能的反向代理和负载均衡能力,成为架构中的“流量入口”;而Tomcat作为成熟的Java Web容器,负责承载具体的业务应用。本文将从原理到实践,详细讲解如何通过Nginx + Tomcat搭建稳定、可扩展的Web服务架构。

一、基础铺垫:什么是反向代理?

在深入负载均衡之前,我们首先要理解反向代理——这是Nginx连接客户端与后端服务的核心能力。

1.1 反向代理的核心原理

反向代理的本质是**“中转”**:客户端的请求不会直接发送给后端应用服务器,而是先发送给Nginx,再由Nginx根据配置转发给后端(如Tomcat、Spring Boot等)。
对客户端而言,它只知道自己连接的是Nginx,完全感知不到后端真实的应用服务器地址,这就为后续的负载均衡、安全防护打下了基础。

数据流向
客户端 → Nginx(反向代理) → 后端应用服务器(Tomcat等)

1.2 Nginx反向代理实战配置

以“将客户端请求转发到本地8080端口的Tomcat服务”为例,我们只需修改Nginx的主配置文件nginx.conf

步骤1:编辑Nginx配置
http {server {listen 80;          # Nginx监听80端口(默认HTTP端口)server_name localhost;  # 访问域名/IP# 核心反向代理配置location / {proxy_pass http://127.0.0.1:8080;  # 转发到本地Tomcat的8080端口proxy_set_header Host $host;        # 保留客户端请求的Host头(重要,避免后端服务识别异常)proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP给后端proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录代理链路}# 错误页面配置error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
步骤2:生效配置并验证
  1. 重启Nginx使配置生效:
    systemctl restart nginx(CentOS)或 nginx -s reload(热重载)
  2. 验证:浏览器访问http://服务器IP(无需加8080端口),Nginx会自动转发到Tomcat,显示Tomcat默认页面即配置成功。

二、进阶:Nginx负载均衡——应对高并发的核心方案

当单台Tomcat无法承载流量时,我们需要部署多台Tomcat组成集群,而Nginx的负载均衡功能可以将客户端请求合理分配到多台后端服务器,实现“分流减压”。

2.1 负载均衡的核心价值

  • 提高性能:将请求分散到多台服务器,避免单台服务器过载;
  • 高可用性:某台Tomcat宕机后,Nginx会自动将请求转发到其他正常节点,避免服务中断;
  • 可扩展性:业务增长时,只需新增Tomcat节点并修改Nginx配置,无需改动客户端;
  • 简化运维:客户端只需对接Nginx,后端服务器的扩容、替换对客户端透明。

2.2 Nginx常用负载均衡策略(附配置)

Nginx支持多种负载均衡策略,可根据业务场景灵活选择。核心是通过upstream模块定义后端服务器集群,再通过proxy_pass指向该集群。

1. 轮询(Round Robin):默认策略,均匀分配

原理:按请求顺序依次分配给后端服务器,循环往复。适用于后端服务器性能一致的场景。
配置示例

http {# 定义后端Tomcat集群(命名为backend)upstream backend {server 192.168.0.101:8080;  # Tomcat节点1server 192.168.0.102:8080;  #  Tomcat节点2server 192.168.0.103:8080;  #  Tomcat节点3}server {listen 80;server_name localhost;location / {proxy_pass http://backend;  # 转发到集群proxy_set_header Host $host;}}
}

特点:无需额外配置,请求分配均匀,但不考虑服务器负载差异。

2. 加权轮询(Weighted Round Robin):按性能分配流量

原理:为后端服务器设置权重(weight),权重越高,接收的请求越多。适用于后端服务器性能不一致的场景(如高配服务器承担更多流量)。
配置示例

upstream backend {server 192.168.0.101:8080 weight=3;  # 权重3,承担3/6的流量server 192.168.0.102:8080 weight=2;  # 权重2,承担2/6的流量server 192.168.0.103:8080 weight=1;  # 权重1,承担1/6的流量
}

特点:通过权重适配服务器性能,兼顾资源利用率与负载均衡。

3. 最少连接数(Least Connections):动态平衡负载

原理:将请求分配给当前活跃连接数最少的服务器,适用于请求处理时间差异较大的场景(如有的请求耗时1秒,有的耗时10秒)。
配置示例

upstream backend {least_conn;  # 启用最少连接数策略server 192.168.0.101:8080;server 192.168.0.102:8080;server 192.168.0.103:8080;
}

特点:动态感知服务器负载,避免某台服务器因长连接过多而过载。

4. IP哈希(IP Hash):会话保持的关键

原理:通过计算客户端IP的哈希值,将同一客户端的请求固定分配给同一台服务器。适用于需要“会话保持”的场景(如未使用分布式Session时,用户登录状态保存在单台Tomcat)。
配置示例

upstream backend {ip_hash;  # 启用IP哈希策略server 192.168.0.101:8080;server 192.168.0.102:8080;server 192.168.0.103:8080;
}

特点:保证同一客户端的请求落到同一节点,但需注意:若该节点宕机,客户端会话会丢失。

5. 最少时间(Least Time):优先响应最快的节点

原理:Nginx 1.15.3+新增策略,将请求分配给响应时间最短的服务器(结合连接数和响应时间计算),适用于对响应速度要求极高的场景(如电商秒杀)。
配置示例

upstream backend {least_time header;  # 基于响应头时间判断;也可使用"last_byte"(基于完整响应时间)server 192.168.0.101:8080;server 192.168.0.102:8080;
}

特点:比“最少连接数”更精准,优先保障用户体验。

2.3 负载均衡的高可用配置:故障转移与健康检查

负载均衡的核心是“高可用”,我们需要配置故障转移(避免请求发送到宕机节点)和健康检查(自动恢复正常节点)。

1. 故障转移配置

通过max_failsfail_timeout定义节点故障判定规则:

upstream backend {server 192.168.0.101:8080 weight=3 max_fails=3 fail_timeout=30s;server 192.168.0.102:8080 weight=2 max_fails=3 fail_timeout=30s;server 192.168.0.103:8080 backup;  # backup:仅当主节点全部宕机时启用
}
  • max_fails=3:3次请求失败后,标记该节点为“不可用”;
  • fail_timeout=30s:30秒内不再向该节点转发请求,30秒后重试;
  • backup:备用节点,主节点正常时不参与负载。
2. 健康检查

Nginx开源版默认是被动健康检查(仅当请求失败时标记节点不可用);若需主动健康检查(定时探测节点状态),有两种方案:

  • 商业方案:使用Nginx Plus,内置主动健康检查功能;
  • 开源方案:安装第三方模块nginx_upstream_check_module,配置定时探测(如每隔2秒发送GET请求检查节点是否存活)。

三、后端支撑:Tomcat的核心原理与配置

Nginx负责“流量分配”,而Tomcat负责“业务执行”。作为Java Web容器,Tomcat的核心是接收Nginx转发的请求,执行Servlet/JSP业务逻辑,并返回响应。

3.1 Tomcat的本质与核心流程

Tomcat是“Web服务器 + Servlet容器”的结合体,核心流程可概括为:

  1. 启动初始化:加载server.xml配置,启动Connector(监听8080端口)、初始化Servlet容器;
  2. 接收请求:Connector监听Nginx转发的HTTP请求,封装为HttpServletRequest对象;
  3. 请求分发:通过Mapper根据URL找到对应的Web应用(Context)和Servlet(Wrapper);
  4. 执行业务:调用Servlet的service()方法(或Spring MVC的DispatcherServlet),执行业务逻辑;
  5. 返回响应:将HttpServletResponse转换为HTTP报文,通过Nginx返回给客户端。

3.2 Tomcat核心配置文件

Tomcat的配置集中在conf目录下,关键文件如下:

配置文件核心作用
conf/server.xml主配置:定义端口(Connector)、Host、Context等
conf/web.xml全局Web应用配置:默认Servlet、MIME类型等
conf/context.xml应用级配置:数据源(JNDI)、Session配置等
conf/tomcat-users.xml用户权限配置:Manager App登录账号密码
WEB-INF/web.xml单应用配置:当前应用的Servlet、Filter配置

3.3 关键配置:Tomcat与数据库连接(JNDI数据源)

Tomcat提供JNDI数据源功能,可统一管理数据库连接池,避免应用重复创建连接(提升性能)。

步骤1:配置数据源(conf/context.xml
<Context><!-- 定义MySQL数据源,命名为jdbc/MyDB --><Resource name="jdbc/MyDB" auth="Container"type="javax.sql.DataSource"maxActive="20"  # 最大活跃连接数maxIdle="10"    # 最大空闲连接数maxWait="10000" # 连接超时时间(10秒)username="root"password="123456"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/test?useSSL=false"/>
</Context>
步骤2:应用中获取数据源
// 通过JNDI获取连接池
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/MyDB");
Connection conn = ds.getConnection();  // 从连接池获取连接
// 执行SQL操作...
conn.close();  // 归还连接到连接池

3.4 Tomcat部署注意事项

  1. 环境依赖:Tomcat需要JDK环境,建议使用JDK 8+,配置JAVA_HOME环境变量;
  2. 端口冲突:若多台Tomcat部署在同一服务器,需修改server.xml中的Connector端口(如8080、8081、8082);
  3. 应用部署:将WAR包放入webapps目录,Tomcat会自动解压部署;或通过Manager App手动部署。

四、整体架构总结:Nginx + Tomcat 协同工作流程

当我们将Nginx与Tomcat结合时,完整的Web服务流程如下:

  1. 客户端发送HTTP请求到http://服务器IP(Nginx监听80端口);
  2. Nginx根据负载均衡策略(如加权轮询),将请求转发到后端Tomcat集群中的某台节点(如192.168.0.101:8080);
  3. Tomcat接收请求,通过Connector解析HTTP报文,分发到对应的Servlet;
  4. Servlet执行业务逻辑(如查询数据库),生成响应;
  5. Tomcat将响应返回给Nginx,Nginx再转发给客户端。

架构图
客户端 → Nginx(80端口,反向代理+负载均衡) → Tomcat集群(8080端口,业务执行) → 数据库

五、实际应用场景与优化建议

  1. 静态资源分离:Nginx直接处理静态资源(CSS、JS、图片),仅将动态请求(如API接口)转发给Tomcat,减少Tomcat压力;
  2. Session共享:若使用IP哈希策略,建议通过Redis实现分布式Session,避免单节点宕机导致会话丢失;
  3. Nginx性能优化:调整worker_processes(与CPU核心数一致)、worker_connections(单个worker最大连接数);
  4. Tomcat性能优化:调整线程池(server.xml中的maxThreads)、启用NIO协议(提升并发处理能力)。

结语

Nginx的反向代理与负载均衡解决了“流量分配”和“高可用”问题,Tomcat的Servlet容器解决了“业务执行”问题。二者结合构建的架构,既能应对高并发流量,又能保障服务稳定,是中小规模Java Web应用的经典方案。掌握这套架构的原理与配置,能让你更从容地应对实际业务中的性能与可用性挑战。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Simulink中使用Test sequence单元测试

一、Tips 在对simulink模型进行Test sequence单元测试时&#xff0c;如果采取书写测试用例的话&#xff0c;有以下操作。 1、使用”fprintf(‘time%f\n’, t);“来打印当前step的时间&#xff1b; 二、数据类型转换 1、double类型 -> boolean类型 clc; clear all;% 1、doubl…

【mysql】SQL自连接:什么时候需要,什么时候不需要?

SQL自连接:什么时候需要,什么时候不需要? 通过具体示例和对比解析,彻底搞懂SQL自连接的使用场景 在处理SQL查询时,尤其是当表中存在自引用关系(如referee_id引用同一张表的id)时,很多开发者会疑惑:这个查询到底需不需要自连接?本文将通过多个具体示例,带你彻底弄清何…

「美」创新在于人,而不是产品 - AxureMost 落葵网

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 第一章&#xff1a;创新的心理学 创新与心理安全 蜡烛问题&#xff1a;卡尔邓克尔的蜡烛问题实验揭示了创造性思维的重要性。通过颠覆对盒子用途的先入为主观念&#xff0c;参与者能够找到创新性的解决方案…

新规则,新游戏:AI时代下的战略重构与商业实践

当你的客服AI能够真正像员工一样理解客户的行业术语&#xff0c;当AI能主动从大量的客户咨询中筛选出高价值潜在客户 —— 这已经不再是理想中才能存在的场景&#xff0c;而是当下 “人工智能 ” 行动深入推进中&#xff0c;企业智能化转型的真实写照。 "人工智能 " …

ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes 数据集构建

paper link: paperlink Abstract: 这个数据集是个RGB-D视频数据集&#xff0c;在707个不同空间中获取了1513个扫描的场景&#xff0c;250w个视图&#xff0c;并且标注了相机位姿&#xff0c;表面重建&#xff0c;语义分割。本数据集共有20人扫描500名工作者进行标注。 数据集…

c语言期末复习

一、选择题(10道) 1、以下哪个不是C语言的关键字? A) int B) float C) string D) while (答案:C) 2、表达式 5 / 2 的结果是: A) 2.5 B) 2 C) 3 D) 2.0 (答案:B) 3、指针变量存储的是: A) 变量的值 B) 变量的地址 C) 变量的类型 D) 变量的名称 (答案:B) 4、以…

JLINK 调试器单步调试单片机

0 JLINK 调试器单步调试单片机 1 物理层1.1 调整电压和开发板一致2 环境搭建 2.1 安装 JLink_Windows_V862_x86_642.2 vscode 配置 {"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "…

大模型(LLM)安全保障机制(技术、标准、管理)

大模型&#xff08;LLM&#xff09;的安全保障涉及技术、标准、管理等多个层面。下面我将结合其核心风险&#xff0c;为你梳理主要的安全机制、相关标准框架以及一些实践建议。为了让您快速了解大模型面临的主要风险及相应的应对机制&#xff0c;我准备了一个表格&#xff1a;安…

虚拟机之CentOS、网络设置的有趣问题

前言 年初射出的子弹&#xff0c;今天中了。 年初埋下的坑&#xff0c;今年踩了。 回首过往&#xff0c;why&#xff1f; because&#xff1a;当时下载VMware的时候。没有设置网络。 重点——使用VMware安装CentOS 9 使用VMware安装CentOS Stream 9_哔哩哔哩_bilibili 总…

Biomni:来自斯坦福的通用型生物医学 AI 智能体,科研“虚拟助手“来了!

在当今生物医学研究中&#xff0c;实验手段和数据量正以前所未有的速度膨胀。从基因组学、单细胞组学到多模态数据&#xff0c;再到可穿戴设备的健康监测&#xff0c;科研人员每天都在与庞大的数据和复杂的分析流程打交道。 然而&#xff0c;实验设计琐碎、工具分散、跨学科整合…

移植后 eto 阳性 干扰素 α1b、白介素 - 2 dli

在异基因造血干细胞移植&#xff08;allo-HSCT&#xff09;后仍存在 AML1-ETO&#xff08;ETO&#xff09;融合基因阳性的患者中&#xff0c;干扰素 α1b 联合白介素 - 2&#xff08;IL-2&#xff09; 是临床中探索用于清除微小残留病&#xff08;MRD&#xff09;、降低复发风险…

防止接口被薅羊毛(防刷)(DAY 002)

背景&#xff1a;短信验证码接口被不法分子用来做灰产&#xff08;短信邮箱轰炸机&#xff09; 如何避免⾃⼰的⽹站成为”⾁鸡“或者被刷&#xff1f; 增加图形验证码&#xff08;开发⼈员&#xff09;单IP请求次数限制&#xff08;开发⼈员&#xff09; 防刷之图形验证码&…

【RabbitMQ】----RabbitMQ 的7种工作模式

1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息. 特点:⼀个⽣产者P&#xff0c;⼀个消费者C,消息只能被消费⼀次.也称为点对点(Point-to-P…

今日分享:C++ -- list 容器

&#x1f60e;【博客主页&#xff1a;你最爱的小傻瓜】&#x1f60e; &#x1f914;【本文内容&#xff1a;C list容器 &#x1f60d;】&#x1f914; --------------------------------------------------------------------------------------------------------------------…

【Python】数据可视化之分布图

分布图主要用来展示某些现象或数据在地理空间、时间或其他维度上的分布情况。它可以清晰地反映出数据的空间位置、数量、密度等特征&#xff0c;帮助人们更好地理解数据的内在规律和相互关系。 目录 单变量分布 变量关系组图 双变量关系 核密度估计 山脊分布图 单变量分布…

DDD+WebAPI实战

DDD+WebAPI实战 DDD(领域驱动设计,Domain-Driven Design)是一种面向对象的设计方法,它强调将业务逻辑封装在模型中,并通过这些模型来驱动整个应用的设计。在.NET环境中,特别是在使用ASP.NET Core和Web API构建应用时,DDD可以帮助我们更好地组织代码,使得业务逻辑更加清…

人力资源管理的思维方法学习笔记1

北京师范大学政府管理学院1.课程介绍&#xff1a; 讲述视角上&#xff0c;本课程侧重人力资源管理的思维方式&#xff0c;即人力资源管理理论和时间的不同视角和主导范式的分析。这既是对人力资源管理理论发展的凝练&#xff0c;也是对人力资源管理实践演进过程的总结。对于把握…

适应新环境:Trae编辑器下的IDEA快捷键定制

介绍&#xff1a;学习如何在Trae编辑器中配置IntelliJ IDEA风格的快捷键&#xff0c;减少开发环境间的切换成本&#xff0c;提升编码效率。通过安装插件或手动调整&#xff0c;让你更快适应新工具大家好&#xff0c;我是凯哥Java本文标签&#xff1a;代码编辑效率、Trae快捷键、…

基于YOLO8的汽车碰撞事故检测系统【数据集+源码+文章】

基于YOLOv8和Streamlit的汽车碰撞事故检测系统 文末附下载地址 开发目的 随着城市化进程的加快和机动车保有量的持续攀升&#xff0c;道路交通安全问题日益突出&#xff0c;汽车碰撞事故频发不仅严重威胁驾乘人员的生命安全&#xff0c;也对公共秩序、应急响应效率及交通管理…

Unity FARO 测量臂:从零构建实时数字孪生系统

前言:当精准测量遇见实时渲染 在高端制造、质量检测和逆向工程领域,法奥 (FARO) 测量臂是精准的代名词。它能以亚毫米级的精度捕捉现实世界中的三维坐标。现在,想象一下,如果我们将这种精度与 Unity 的强大实时渲染能力结合起来,会发生什么? 我们将得到一个数字孪生 (D…