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直接响应(无需转发)。 
相关推荐
国际云33 分钟前
腾讯云国际版和国内版账户通用吗?一样吗?为什么?
大数据·运维·阿里云·云计算
愚润求学1 小时前
【Linux】POSIX信号量
linux·运维
进阶的DW1 小时前
新手小白使用VMware创建虚拟机安装Linux
java·linux·运维
jz_ddk1 小时前
[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)
linux·运维·c语言·网络·嵌入式硬件
ZStack开发者社区1 小时前
全球化2.0|云轴科技ZStack助力香港服务机构VMware替代
运维·云计算·政务
小黄人软件2 小时前
jenkins脚本查看及备份
运维·servlet·jenkins
字节高级特工2 小时前
【Linux篇】0基础之学习操作系统进程
linux·运维·服务器·数据结构·windows·学习·list
文牧之2 小时前
PostgreSQL 的扩展pg_prewarm
运维·数据库·postgresql
s_little_monster3 小时前
【Linux】网络--数据链路层--以太网
linux·运维·网络·经验分享·笔记·学习·计算机网络
Adorable老犀牛4 小时前
负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port
nginx·http·https·负载均衡