Nginx+Tomcat负载均衡

目录

TomCat基本概念

‌一、核心架构与组件‌

[1. ‌模块化架构‌](#1. ‌模块化架构‌)

‌二、核心配置文件‌

[1. ‌server.xml‌(主配置文件)](#1. ‌server.xml‌(主配置文件))

[2. ‌关键配置文件‌](#2. ‌关键配置文件‌)

‌三、核心处理流程‌

‌四、关键特性详解‌

[1. ‌类加载机制‌](#1. ‌类加载机制‌)

[2. ‌会话管理‌](#2. ‌会话管理‌)

[3. ‌JSP 处理流程‌](#3. ‌JSP 处理流程‌)

‌五、性能优化指南‌

[1. ‌Connector 调优‌](#1. ‌Connector 调优‌)

[2. ‌JVM 参数优化‌](#2. ‌JVM 参数优化‌)

[3. ‌资源泄漏防护‌](#3. ‌资源泄漏防护‌)

‌六、安全管理实践‌

[1. ‌安全加固措施‌](#1. ‌安全加固措施‌)

[2. ‌访问控制配置‌](#2. ‌访问控制配置‌)

‌七、部署模式对比‌

‌八、监控与诊断‌

[1. ‌内置监控接口‌](#1. ‌内置监控接口‌)

[2. ‌关键监控指标‌](#2. ‌关键监控指标‌)

‌九、版本演进路线‌

‌十、最佳实践总结‌

Nginx+Tomcat负载均衡

‌一、架构原理‌

‌二、核心配置步骤‌

[‌1. Nginx配置(nginx.conf)‌](#‌1. Nginx配置(nginx.conf)‌)

[‌2. Tomcat配置‌](#‌2. Tomcat配置‌)

‌三、会话保持(Session共享)‌

‌四、部署验证‌

‌五、性能优化建议‌


TomCat基本概念

Tomcat 是 Apache 软件基金会的核心项目,是开源的 Java Servlet 容器和 Web 服务器,支持 Java Servlet、JSP、WebSocket 等核心技术。以下是 Tomcat 的深度解析:


一、核心架构与组件

1. ‌模块化架构
复制代码
graph TD
 A[Server] --> B[Service]
 B --> C[Connector]
 B --> D[Engine]
 D --> E[Host]
 E --> F[Context]
 F --> G[Wrapper]
 F --> H[Listener/Filter] 
  • Server‌:顶级容器,代表整个 Tomcat 实例
  • Service‌:服务单元(含 Connector + Engine)
  • Connector‌:网络连接器(HTTP/AJP)
  • Engine‌:请求处理引擎(虚拟主机管理器)
  • Host‌:虚拟主机(域名映射)
  • Context‌:Web 应用上下文(对应 WAR 包)
  • Wrapper‌:Servlet 包装器(管理单个 Servlet)

二、核心配置文件

1. ‌server.xml‌(主配置文件)
复制代码
<Server port="8005" shutdown="SHUTDOWN">
 <Service name="Catalina">
     <!-- HTTP 连接器 -->
     <Connector port="8080" protocol="HTTP/1.1"
             maxThreads="200" acceptCount="100"/>

     <!-- Engine 容器 -->
     <Engine name="Catalina" defaultHost="localhost">
         <Host name="localhost" appBase="webapps"
             unpackWARs="true" autoDeploy="true">
     <!-- Context 配置 -->
     <Context path="/myapp" docBase="myapplication" reloadable="true"/>
    </Host>
   </Engine>
  </Service>
 </Server> 
2. ‌关键配置文件
文件 作用
web.xml 应用级配置(Servlet/Filter 定义)
context.xml Context 容器配置(数据源等)
catalina.properties 全局属性配置
logging.properties 日志系统配置

三、核心处理流程

  1. 请求处理链‌:

    复制代码
    sequenceDiagram
     客户端->>+Connector: HTTP请求
     Connector->>+Engine: 创建Request/Response
     Engine->>+Host: 匹配虚拟主机
     Host->>+Context: 定位Web应用
     Context->>+Wrapper: 查找Servlet
     Wrapper-->>-Context: 执行service()
     Context-->>-Host: 返回响应
     Host-->>-Engine: 传递结果
     Engine-->>-Connector: 输出响应
     Connector-->>-客户端: HTTP响应 
  2. Pipeline-Valve 机制‌:

    • 每个容器都有 Pipeline 和 Valve 链
    • Valve 类似 Filter 链式处理请求
    • BasicValve 最终调用 Servlet 的 service() 方法

四、关键特性详解

1. ‌类加载机制
复制代码
classDiagram
 ClassLoader <|-- URLClassLoader
 URLClassLoader <|-- WebappClassLoader
 WebappClassLoader : 应用隔离加载
 WebappClassLoader : 打破双亲委派(JSP/Servlet) 
  • 隔离加载‌:每个 WebApp 使用独立 ClassLoader
  • 加载优先级 ‌:
    1. JVM 核心类
    2. $CATALINA_HOME/lib 共享库
    3. WebApp 的 /WEB-INF/lib/WEB-INF/classes
2. ‌会话管理
  • 实现方式 ‌:

    复制代码
    // 创建会话 
    HttpSession session = request.getSession(true); 
    
    // 存储数据 
    session.setAttribute("user", userObject); 
  • 持久化方案 ‌:

    • StandardManager‌:默认(内存存储,重启丢失)
    • PersistentManager‌:文件/数据库存储
    • 集群复制‌:DeltaManager 等
3. ‌JSP 处理流程
复制代码
.jsp 文件 → Jasper 编译器 → .java 文件 → javac → .class 文件 → Servlet 执行 

五、性能优化指南

1. ‌Connector 调优
复制代码
<Connector
 port="8080"
 protocol="org.apache.coyote.http11.Http11Nio2Protocol"
 maxThreads="500"
 minSpareThreads="20"
 acceptCount="100"
 connectionTimeout="20000"
 maxConnections="1000"/> 
  • 协议选择 ‌:
    • BIO(阻塞式):已废弃
    • NIO(非阻塞):通用推荐
    • NIO2(AIO):Linux 最佳
    • APR(Native):极致性能
2. ‌JVM 参数优化
复制代码
# catalina.sh 配置 
export JAVA_OPTS="-server -Xms1024m -Xmx2048m 
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m 
-XX:+UseG1GC -XX:MaxGCPauseMillis=200" 
3. ‌资源泄漏防护
复制代码
<!-- context.xml 配置 --> 
<Context>
 <WatchedResource>WEB-INF/web.xml</WatchedResource>
 <Resources cachingAllowed="true" cacheMaxSize="102400"/> 
</Context> 

六、安全管理实践

1. ‌安全加固措施
  • 禁用管理界面(生产环境)
  • 修改 shutdown 端口和指令
  • 文件系统权限隔离
  • 定期升级版本(CVE 修复)
2. ‌访问控制配置
复制代码
<!-- web.xml 片段 --> 
<security-constraint>
 <web-resource-collection>
     <url-pattern>/admin/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
     <role-name>admin</role-name>
 </auth-constraint> 
</security-constraint> 

七、部署模式对比

部署方式 适用场景 特点
独立部署 开发/测试环境 简单快捷
前端代理 生产环境(Nginx+Tomcat) 动静分离+负载均衡
嵌入式部署 Spring Boot应用 无容器依赖
Tomcat集群 高并发场景 需要Session复制

八、监控与诊断

1. ‌内置监控接口
  • JMX 监控:com.sun.management.jmxremote
  • Probe‌:轻量级监控应用(替代 manager)
2. ‌关键监控指标
指标 健康阈值 工具
线程池使用率 <80% JConsole
Heap 内存使用 <70% VisualVM
GC 暂停时间 <200ms GC log analyzer
请求处理时间 P95<500ms Access Log

九、版本演进路线

版本 发布时间 核心特性
Tomcat 10 2021 Servlet 6.0 / JSP 3.1
Tomcat 9 2018 HTTP/2 / TLS 1.3
Tomcat 8 2014 WebSocket 1.1
Tomcat 7 2011 内存泄漏防护

十、最佳实践总结

  1. 配置规范‌:

    • 生产环境禁用 autoDeploy
    • 设置 reloadable="false"
    • 配置明确的 Context path
  2. 部署建议‌:

    复制代码
    # 标准目录结构 
    webapps/ 
    ├── ROOT/ # 根应用 
    ├── myapp.war # 自动解压部署 
    └── lib/ # 共享库(谨慎使用) 
  3. 故障排查口诀‌:

    • 看日志‌:catalina.out / localhost.log
    • 查线程 ‌:jstack <pid>
    • 检内存‌:MAT 分析堆转储
    • 测网络‌:TCP 连接状态监控

Nginx+Tomcat负载均衡

一、架构原理

  1. 角色分工

    • Nginx‌:作为反向代理与负载均衡器,接收客户端请求并按算法分发至后端Tomcat服务器。
    • Tomcat‌:作为应用服务器集群,处理动态请求(如JSP)。
    • 动静分离‌:Nginx直接处理静态资源(HTML/图片),动态请求转发至Tomcat,显著提升性能。
  2. 负载均衡策略

    • ‌**轮询(默认)**‌:请求按时间顺序依次分发。
    • 加权轮询 ‌:通过weight参数分配服务器负载比例(示例:server 192.168.1.2:8080 weight=2;)。
    • IP哈希‌:基于客户端IP固定分配服务器,解决Session共享问题,但局域网用户可能失效。

二、核心配置步骤

‌**1. Nginx配置(nginx.conf)**‌
复制代码
http {
 # 定义Tomcat服务器组
 upstream tomcat_cluster {
     server 192.168.1.2:8080 weight=1; # Tomcat实例1 
     server 192.168.1.3:8080 weight=1; # Tomcat实例2 
}

 server {
     listen 80;
     location / {
         proxy_pass http://tomcat_cluster; # 请求转发至集群
     }

     # 动静分离:静态资源由Nginx处理
     location ~ .*\.(html|jpg|js)$ {
         root /usr/local/nginx/html;
 }

     # 动态请求转发至Tomcat
     location ~ .*\.jsp$ {
         proxy_pass http://tomcat_cluster;
     }
   }
 } 

关键点‌:

  • upstream命名需与proxy_pass一致。
  • 静态资源路径通过root指定。
2. Tomcat配置
  • 多实例部署 ‌:单机多Tomcat需修改server.xml中的端口(如Shutdown端口、HTTP Connector端口)避免冲突。
  • 应用一致性‌:所有Tomcat节点需部署相同版本的Web应用。

‌**三、会话保持(Session共享)**‌

  1. IP哈希 ‌:Nginx通过ip_hash算法将同一用户请求固定到同一Tomcat。

    复制代码
    upstream tomcat_cluster {
     ip_hash;
     server 192.168.1.2:8080;
     server 192.168.1.3:8080; 
    } 

    局限‌:服务器宕机导致Session丢失,且不适用于公网IP相同的局域网用户。

  2. Session共享方案

    • Memcached/Redis ‌:将Session存储于分布式缓存,Tomcat通过memcached-session-manager等工具读写。
    • 配置示例 ‌:在Tomcat的context.xml中添加Memcached节点信息。

四、部署验证

  1. 测试负载均衡 ‌:
    • 多次访问Nginx的IP地址,观察不同Tomcat节点的日志或页面标识(如端口号)。
  2. 动静分离验证 ‌:
    • 访问静态资源(如http://nginx_ip/img/photo.jpg)应直接由Nginx响应;访问JSP页面则由Tomcat处理。

五、性能优化建议

  • 健康检查 ‌:通过Nginx的max_failsfail_timeout参数屏蔽故障节点(示例:server 192.168.1.2:8080 max_fails=2 fail_timeout=10s;)。
  • 连接池优化 ‌:调整Tomcat的maxThreadsacceptCount参数以提升并发能力。
  • 缓存加速 ‌:Nginx开启gzip压缩静态资源,减少传输量。

附:拓扑示例

复制代码
客户端 → Nginx(负载均衡)
         ├→ Tomcat1(动态请求) 
         └→ Tomcat2(动态请求) 静态请求由Nginx直接响应(无需转发)。 
相关推荐
草莓熊Lotso11 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
历程里程碑11 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
七夜zippoe19 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64820 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满20 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠21 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90321 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技1 天前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀1 天前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器