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

Nginx+Tomcat负载均衡集群

目录

一、Tomcat 基础与单节点部署

(一)Tomcat 概述

(二)单节点部署案例

1. 案例环境

2. 实施准备

3. 安装 JDK

4. 查看 JDK 安装情况

5. 安装配置 Tomcat

6. 启动 Tomcat

7. 访问测试

8. 关闭 Tomcat

(三)Tomcat 目录与配置文件说明

(四)建立 Java Web 站点

二、Nginx+Tomcat 负载均衡与动静分离群集搭建

(一)案例分析

(二)案例环境

(三)Tomcat2 服务器配置

(四)Nginx 服务器配置

(五)测试效果

三、总结

四、Tomcat 核心组件解析

(一)Server 与 Service

(二)Connector:请求入口

(三)Eng1ine 与 Host:请求处理与虚拟主机

(四)Context:Web 应用容器

(五)组件协作流程

五、Nginx 负载均衡策略与优化

(一)负载均衡策略配置

(二)健康检查机制

(三)动静分离优化实践

六、生产环境部署注意事项

(一)安全加固

(二)性能调优

(三)监控与日志

七、常见问题与解决方案

(一)动态页面无法访问

(二)静态资11源加载失败

(三)负载均衡未生效

八、扩展与高可用架构

(一)增加 Tomcat 节点

(二)Nginx 高可用(主从 / 集群)

(三)日志集中管理

(四)自动化部署与监控

九、成本优化与性能对比

(一)硬件资源规划

(二)性能对比(压测数据参考)

十、总结与最佳实践

(一)核心价值

(二)最佳实践清单


一、Tomcat 基础与单节点部署

(一)Tomcat 概述

  1. 名称由来:由 Sun 公司詹姆斯・邓肯・戴维森开发,后贡献给 Apache 软件基金会。因希望项目以能自我照顾的动物命名,最终定名为 “Tomcat”(公猫),其 Logo 也设计为公猫形象。早期项目名为 “Catalina”,故安装后可见许多相关目录和文件。
  2. 应用场景:免费开源的轻量级 Web 应用服务器,适用于中小型系统及并发用户不多的场合,是开发调试 JSP 程序的首选。虽具备处理 HTML 页面功能,但处理静态 HTML 能力不及 Apache 或 Nginx,通常作为 Servlet 和 JSP 容器运行于后端,与前端 Web 服务器(如 Apache、Nginx)及数据库配合工作。

(二)单节点部署案例

1. 案例环境
  • 主机:服务器 Tomcat
  • IP 地址:192.168.10.101
  • 操作系统:OpenEuler24
  • 应用:apache-tomcat-9.0.8
2. 实施准备
# 关闭防火墙
systemctl stop firewalld
setenforce 0
3. 安装 JDK

JDK(Java Development Kit)是 Java 语言的软件开发工具包,包含 JVM(Java 虚拟机),用于解释 Java 字节码,实现跨平台性。JDK 版本需与 Tomcat 兼容,下载对应版本的 JDK 安装包并安装。

4. 查看 JDK 安装情况
java -version

若输出 Java 版本信息(如 “java version "1.8.0_171"”),则说明 JDK 已安装。

5. 安装配置 Tomcat
# 解压Tomcat安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动并重命名文件夹
mv apache-tomcat-9.0.8 /usr/local/tomcat9
6. 启动 Tomcat
/usr/local/tomcat9/bin/startup.sh

启动后,默认监听 8080 端口,可通过以下命令查看端口监听情况:

netstat -anpt | grep 8080
7. 访问测试

在浏览器中输入 “http://192.168.10.101:8080/”,若出现 Tomcat 欢迎界面,则表示启动成功。

8. 关闭 Tomcat
/usr/local/tomcat9/bin/shutdown.sh

(三)Tomcat 目录与配置文件说明

  1. 主要目录

  • bin/:存放启动和关闭 Tomcat 的脚本文件(如 startup.sh、shutdown.sh)。
  • conf/:存放全局配置文件,重要文件包括 server.xml(主配置文件)、web.xml(Servlet 等配置)、tomcat-users.xml(管理用户配置)。
  • lib/:存放 Tomcat 运行所需的库文件(JAR 包)。
  • logs/:存放日志文件。
  • webapps/:主要 Web 发布目录,用于部署应用程序。
  • work/:存放 JSP 编译后生成的 class 文件。

  1. 主配置文件 server.xml

  • 结构组成:由<Server>、<Service>、<Connector/>、<Engine>、<Host>、<Context>等元素构成。
  • 关键配置
    • 端口配置:<Connector port="8080" protocol="HTTP/1.1" .../> 用于配置 HTTP 访问端口;<Connector port="8009" protocol="AJP/1.3" .../> 用于配置 AJP 连接器端口,供其他 Web 服务器代理请求。
    • 虚拟主机配置:<Host name="localhost"appBase="webapps" ...> 定义虚拟主机,appBase 指定应用程序基础目录,可通过<Context>元素配置具体 Web 应用的路径。

(四)建立 Java Web 站点

  1. 创建站点目录
mkdir -pv /web/webapp1

  1. 创建测试页面 index.jsp
vim /web/webapp1/index.jsp

内容如下:

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

  1. 修改 server.xml 配置
    在<Host>元素中添加<Context>配置,将站点路径指向 /web/webapp1:
<Context docBase="/web/webapp1" path="" reloadable="true"/>

  1. 重启 Tomcat
/usr/local/tomcat9/bin/shutdown.sh
/usr/local/tomcat9/bin/startup.sh

  1. 访问测试
    在浏览器中输入 “http://192.168.10.101:8080/”,应显示自定义的 JSP 页面内容。

二、Nginx+Tomcat 负载均衡与动静分离群集搭建

(一)案例分析

  1. 需求背景:单台 Tomcat 存在单点故障风险,且处理静态资源效率低。Nginx 具有高性能、低资源消耗的特点,可作为反向代理和负载均衡器,与 Tomcat 结合实现动静分离,提升站点性能和可靠性。
  2. 拓扑架构:Nginx 作为前端负载均衡器,负责处理静态资源请求和分发动态请求到后端 Tomcat 服务器(Tomcat1 和 Tomcat2)。

(二)案例环境

主机IP 地址操作系统应用
Tomcat1 服务器192.168.10.101OpenEuler24apache-tomcat-9.0.8
Tomcat2 服务器192.168.10.102OpenEuler24apache-tomcat-9.0.8
Nginx 服务器192.168.10.103OpenEuler24nginx-1.26.3

(三)Tomcat2 服务器配置

  1. 关闭防火墙(同 Tomcat1)
systemctl stop firewalld
setenforce 0

  1. 安装 JDK 和 Tomcat(版本与 Tomcat1 一致)
# 安装JDK(若未安装)
# 解压Tomcat安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动并重命名
mv apache-tomcat-9.0.8 /usr/local/tomcat9

  1. 创建站点目录并配置
mkdir -pv /web/webapp1

修改 server.xml 中的<Context>配置,指向 /web/webapp1:

<Context docBase="/web/webapp1" path="" reloadable="true"/>

  1. 创建测试页面 index.jsp
vim /web/webapp1/index.jsp

内容如下:

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

  1. 启动 Tomcat2 并测试
/usr/local/tomcat9/bin/startup.sh

在浏览器中输入 “http://192.168.10.102:8080/”,查看页面是否正确显示。

(四)Nginx 服务器配置

  1. 关闭防火墙
systemctl stop firewalld
setenforce 0

  1. 安装依赖软件包
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker

  1. 创建 Nginx 用户
useradd -M -s /sbin/nologin nginx

  1. 解压并安装 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

  1. 配置 nginx.conf
vim /usr/local/nginx/conf/nginx.conf

在 http {} 块中添加负载均衡服务器列表:

upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1;
}

在 server {} 块中配置动静分离规则:

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|jpeg|png|bmp|swf|css|js)$ {root /usr/local/nginx/html/img;expires 30d;
}location / {root html;index index.html index.htm;
}

  1. 准备静态图片
mkdir /usr/local/nginx/html/img
cp /root/logo.jpg /usr/local/nginx/html/img

  1. 测试配置文件
/usr/local/nginx/sbin/nginx -t

  1. 启动 Nginx 服务
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  1. 查看服务进程和端口
ps aux | grep nginx
netstat -anpt | grep nginx

(五)测试效果

  1. 静态页面测试:在浏览器中输入 “http://192.168.10.103/”,应显示 Nginx 默认的静态页面。
  2. 负载均衡测试:在浏览器中输入 “http://192.168.10.103/index.jsp”,不断刷新页面,应交替显示 Tomcat1 和 Tomcat2 的测试页面,表明负载均衡生效。

三、总结

通过 Nginx 与 Tomcat 的结合,实现了动静分离和负载均衡,提升了 Web 站点的性能、可扩展性和稳定性。Nginx 高效处理静态资源,减轻了 Tomcat 的压力,使其专注于动态请求处理。这种架构是现代 Web 应用优化的重要实践,适用于中小型网站及高并发场景的初步搭建。在实际生产环境中,还可进一步结合缓存机制、安全策略等,进一步提升系统的可靠性和用户体验。

四、Tomcat 核心组件解析

(一)Server 与 Service

  1. Server

    • 代表整个 Catalina Servlet 容器,是 Tomcat 的顶层容器,负责管理所有 Service 组件,监听关闭端口(默认 8005),通过SHUTDOWN命令终止服务。
    • 配置示例(s2erver.xml):
      <Server port="8005" shutdown="SHUTDOWN"><!-- 包含多个Service -->
      </Server>
      
  2. Service

    • 是一个或多个 Connector 与一个 Engine 的组合,负责接收请求并将其交给 Engine 处理。
    • 每个 Serv3ice 可定义多个 Connector(如 HTTP 和 AJP 连接器),但只能有一个 Engine:
      <Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" /><Engine name="Catalina" defaultHost="localhost"><!-- 虚拟主机配置 --></Engine>
      </Service>
      

(二)Connector:请求入口

  1. 功能与类型

    • 监听指定端口,接收客户端请求并转发给 Engine,同时将响应返回给客户端。
    • 典型 Co4nnector
      • HTTP Connector(端口 8080):直接处理浏览器的 HTTP 请求,协议为HTTP/1.1,用于动态页面访问。
      • AJ5P Connector(端口 8009):接收其他 Web 服务器(如 Nginx)的代理请求,协议为AJP/1.3,用于动静分离场景。
  2. 关键配置参6数

    • port:监听端口(如 8080)。
    • protocol:协议类型(如HTTP/1.1AJP/1.3)。
    • connectionTimeout:连接超时时间(单位毫秒,默认 20000ms)。
    • redirectPort:HTTPS 请求重定向端口(默认 8443)。

(三)Eng1ine 与 Host:请求处理与虚拟主机

  1. Engine

    • 作为 Service 的核心组件,管理多个虚拟主机(Host),负责将请求匹配到对应的 Host 处理。
    • 包含一个默认7虚拟主机,当请求无法匹配任何 Host 时,由默认 Host 处理:
      <Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps"><!-- 具体Host配置 --></Host>
      </Engine>
      
  2. Host(虚拟主机)

    • 对应一个域名(如localhost),通过appBase指定 Web 应用的基础目录(默认webapps),可部署多个 Web 应用(Context)。
    • 匹配规则8:根据请求的域名或 IP 匹配 Host,若无法匹配则使用 Engine 的默认 Host。
    • 示例配置
      <Host name="www.test.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true"><Context path="/app1" docBase="/data/webapps/app1" />
      </Host>
      
       
      • unpackWARs:是否自动解压 WAR 包(默认true)。
      • autoDeploy:是否自动部署更新的应用(默认true)。

(四)Context:Web 应用容器

  1. 功能

    • 代表一个 Web 应用,对应一个目录或 WAR 包,包含 Servlet、JSP、配置文件等资源。
    • 通过doc{insert\_element\_8\_}Base指定物理路径,path指定访问路径(如path="/app"表示通过http://host:port/app访问)。
  2. 关键配置

    • reloadable:是否监听类文件变化并自动重启(开发环境可用,生产环境建议关闭)。
    • sessi{insert\_element\_9\_}onTimeout:会话超时时间(分钟,默认 30 分钟)。
    • welcome-file-list:欢迎页面列表(如index.jspindex.html)。

(五)组件协作流程

  1. 请求链路
    客户端请求 → Connector(接收) → Engine(路由) → Host(匹配虚拟主机) → Context(处理Web应用) → 返回响应
    
  2. 示例场景
    • 用户访问http://www.test.com/app1/index.jsp
      1. Connector(8080 端口)接收 HTTP 请求。
      2. Engine 根据域名www.test.com匹配到对应的 Host。
      3. Host 根据path="/app1"找到对应的 Context,调用 JSP 引擎编译并执行index.jsp,返回动态内容。

五、Nginx 负载均衡策略与优化

(一)负载均衡策略配置

  1. 轮询(默认)

    • 按顺序依次将请求分发到后端服务器,权重相同则均匀分配,适用于服务器性能一致的场景。
    • 配置示例(nginx.conf):
      upstream tomcat_server {server 192.168.10.101:8080;server 192.168.10.102:8080;
      }
      
  2. 权重轮询(weight)

    • 通过weight参数指定服务器处理请求的优先级,权重越高分配概率越大,适用于服务器性能不均的场景。
    • 配置示例: 
      upstream tomcat_server {server 192.168.10.101:8080 weight=2;  # 处理2倍请求server 192.168.10.102:8080 weight=1;
      }
      
  3. IP 哈希(ip_hash)

    • 根据客户端 IP 地址生成哈希值,将同一 IP 的请求固定分发到同一服务器,用于保持会话一致性(如未使用 Session 共享时)。
    • 配置示例:
      upstream tomcat_server {ip_hash;server 192.168.10.101:8080;server 192.168.10.102:8080;
      }
      

(二)健康检查机制

  1. 被动检查(默认)

    • Nginx 默认通过请求响应状态判断服务器是否存活,若返回 5xx 错误或超时,则认为服务器故障,自动跳过(故障恢复后重新加入)。
    • 配置参数:
      • max_fails:允许失败次数(默认 1 次)。
      • fail_timeout:故障超时时间(默认 10 秒,期间不再转发请求)。
      upstream tomcat_server {server 192.168.10.101:8080 max_fails=2 fail_timeout=30s;
      }
      
  2. 主动检查(第三方模块)

    • 使用ngx_http_upstream_check_module等模块,定期向服务器发送健康检查请求(如/health接口),主动检测状态。
    • 示例配置:
      upstream tomcat_server {server 192.168.10.101:8080;check interval=5000 rise=2 fall=3 timeout=3000 type=http;check_http_send "GET /health HTTP/1.0\r\n\r\n";check_http_expect_1xx any;
      }
      

(三)动静分离优化实践

  1. 静态资源缓存配置

    • 通过expires指令设置静态资源(如图片、CSS、JS)的浏览器缓存时间,减少重复请求。
    • 配置示例: 

      location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {root /usr/local/nginx/html/img;expires 30d;  # 缓存30天add_header Cache-Control "public";
      }
      
  2. 压缩优化

    • 启用 Gzip 压缩,减少动态页面传输流量(需 Tomcat 配合设置响应头)。
    • Nginx 配置:
      http {gzip on;gzip_types text/plain text/css application/json application/javascript text/html;gzip_comp_level 6;  # 压缩级别(1-9,默认6)
      }
      
  3. 防盗链配置

    • 通过valid_referers阻止非法域名引用静态资源,保护图片、文件等资源。
    • 配置示例:
      location ~* \.(gif|jpg|jpeg|png)$ {valid_referers none blocked www.test.com test.com;if ($invalid_referer) {return 403;}
      }
      

六、生产环境部署注意事项

(一)安全加固

  1. 端口与防火墙

    • 仅开放必要端口(如 Nginx 的 80/443、Tomcat 的 8080/8009),关闭其他端口。
    • 使用防火墙(如 Firewalld、UFW)限制 IP 访问,仅允许可信 IP 连接后端 Tomcat。
  2. 用户权限

    • Nginx 和 Tomcat 均使用非 root 用户运行(如nginxtomcat用户),避免权限过高导致安全风险。
    • 修改文件权限,确保配置文件和日志目录仅可被管理员读写:
      chown -R nginx:nginx /usr/local/nginx
      chown -R tomcat:tomcat /usr/local/tomcat9
      
  3. HTTPS 配置

    • 为 Nginx 添加 SSL 证书,启用 HTTPS 加密传输,提升数据安全性。
    • 配置示例:
      server {listen 443 ssl;server_name www.test.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384;
      }
      

(二)性能调优

  1. Nginx worker 进程优化

    • worker_processes:设置为服务器 CPU 核心数,充分利用多核性能。
    • worker_connections:单个进程最大连接数(需配合ulimit -n调整系统文件描述符限制)。
      worker_processes 4;  # 假设4核CPU
      events {worker_connections 10240;
      }
      
  2. Tomcat 线程池调整

    • 修改 server.xml 中的<Connector>配置,调整线程池参数:
      <Connector port="8080" protocol="HTTP/1.1"><Executor name="tomcatExecutor" namePrefix="catalina-exec-"maxThreads="200" minSpareThreads="20" maxSpareThreads="50"maxQueueSize="100" />
      </Connector>
      
       
      • maxThreads:最大工作线程数(默认 200,根据并发量调整)。
      • maxQueueSize:请求队列最大长度(防止内存溢出)。
  3. 连接超时优化

    • 缩短 Nginx 和 Tomcat 的超时时间,释放无效连接:
      # Nginx配置
      proxy_connect_timeout 5s;
      proxy_read_timeout 10s;
      proxy_send_timeout 10s;
      
       
      # Tomcat配置(server.xml)
      <Connector port="8080" connectionTimeout="20000" />
      

(三)监控与日志

  1. Nginx 日志配置

    • 开启访问日志和错误日志,记录详细请求信息以便排查问题:
      http {access_log logs/access.log main;error_log logs/error.log error;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
      }
      
  2. Tomcat 日志分析

    • 主要日志文件:
      • catalina.out:控制台输出日志,包含启动信息和错误堆栈。
      • localhost_access_log.txt:访问日志,记录请求路径、响应状态等。
    • 配置日志切割9,避免单文件过大:
      # 使用logrotate工具
      cat /etc/logrotate.d/tomcat
      /usr/local/tomcat9/logs/*.log {dailyrotate 7compressmissingoknotifempty
      }
      
  3. 监控工具集成

    • 使用 Prometheus+Grafana 监控 Nginx 和 Tomcat 的性能指标(如请求量、响应时间、服务器负载)。
    • Nginx 可通过ngx_http_stub_status_module暴露状态数据:
      location /nginx_status {stub_status on;access_log off;allow 127.0.0.1;deny all;
      }
      

七、常见问题与解决方案

(一)动态页面无法访问

  1. 排查步骤

    • 检查 Nginx 代理配置:确认location ~ \.jsp$规则是否正确,proxy_pass是否指向负载均衡组(如http://tomcat_server)。
    • 检查 To13mcat 服务状态:确保 Tomcat 已启动,端口(8080)监听正常,通过curl http://localhost:8080测试本地访问。
    • 查看日志
      • Nginx 错误日志(/usr/local/nginx/logs/error.log)是否有代理连接失败信息。
      • Tomcat 控制台日志(catalina.out)是否有 JSP 编译错误或 Servlet 异常。
  2. 常见原因

    • Nginx 与 Tomcat 之间网络不通(如防火墙拦截、IP / 端口错误)。
    • Tomcat 的server.xml中未正确配置 Context 路径,导致请求无法映射到实际文件。

(二)静态资11源加载失败

  1. 排查步骤

    • 检查 Nginx 路径配置:确认location ~* \.(gif|jpg|png)$中的root路径是否正确(如/usr/local/nginx/html/img),文件是否存在。
    • 检查文件14权限:确保 Nginx 用户(如nginx)对静态资源目录有读取权限。
    • 测试直接访问:通过http://192.168.10.103/img/logo.jpg直接访问图片,查看是否返回 404 或 403 错误。
  2. 解决方案

    • 修正rootalias路径,确保与实际文件路径一致(root为绝对路径,alias为自定义路径)。
    • 赋予目录读权限:
      chmod -R o+r /usr/local/nginx/html/img
      

(三)负载均衡未生效

  1. 排查步骤

    • 检查 upstream 配置:确认server IP 和端口是否正确,权重设置是否合理,是否遗漏ip_hash等策略。
    • 清除浏览12器缓存:刷新页面时按Ctrl+F5强制清除缓存,避免浏览器缓存导致请求未分发到后端。
    • 查看请求头:通过浏览器开发者工具查看X-Forwarded-For头,确认是否包含后端 Tomcat 的 IP 地址。
  2. 常见原因

    • Nginx 配置未重新加载:修改nginx.conf后需执行nginx -s reload使配置生效。
    • 后端服务器故障:某台 Tomcat 未启动或端口被占用,Nginx 自动将其从负载均衡组中剔除。

八、扩展与高可用架构

(一)增加 Tomcat 节点

  1. 步骤说明
    • 新增 Tomcat 服务器(如 192.168.10.104),重复 “Tomcat2 服务器配置” 步骤,确保 JDK 和 Tomcat 版本一致,站点目录和测试页面配置正确。
    • 修改 Nginx 的upstream配置,添加新节点:
      upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1;server 192.168.10.104:8080 weight=1;  # 新增节点
      }
      

 

  • 执行nginx -s reload重新加载配置,新节点即可参与负载均衡。

  1. Session 共享方案

    • 问题背景:负载均衡场景下,若客户端请求被分发到不同 Tomcat 节点,未共享的 Session 会导致用户状态丢失。
    • 解决方案
      • Tomcat 自带 Session 复制:在server.xml<Engine><Host>中配置Cluster元素,实现 Session 在节点间同步(适用于小规模集群,但存在性能开销)。
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
        
      • 分布式缓存(如 Redis):使用tomcat-redis-session-manager等插件,将 Session 存储到 Redis 中,所有 Tomcat 节点共享缓存数据。
        # 添加Maven依赖(Tomcat 9为例)
        <dependency><groupId>com.orangefunction</groupId><artifactId>tomcat-redis-session-manager</artifactId><version>2.0.3</version>
        </dependency>
        
         
        • 配置context.xml
          <Context><Manager className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/><SessionHandler className="com.orangefunction.tomcat.redissessions.RedisSessionHandler"host="192.168.10.105" port="6379" database="0" />
          </Context>
          

(二)Nginx 高可用(主从 / 集群)

  1. 主从模式(Keepalived)

    • 架构说明:通过 Keepalived 实现 Nginx 主节点(Master)和备用节点(Backup),共享虚拟 IP(VIP)。当主节点故障时,备用节点自动接管 VIP,保证服务不中断。
    • 配置步骤
      • 安装 Keepalived
        dnf install -y keepalived
        
      • 主节点配置(/etc/keepalived/keepalived.conf)
        global_defs {router_id NGINX_MASTER
        }
        vrrp_instance VI_1 {state MASTERinterface eth0  # 绑定网卡virtual_router_id 51  # 虚拟路由ID(主从一致)priority 100       # 主节点优先级(备用节点设为90)advert_int 1       # 心跳间隔(秒)authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.10.200  # 虚拟IP}
        }
        
      • 备用节点配置:除state改为BACKUPpriority降低外,其余与主节点一致。
      • 健康检查脚本:在 Keepalived 中配置脚本检测 Nginx 进程,若主节点 Nginx 停止,自动切换至备用节点:

        bash

        script_check_nginx.sh:
        #!/bin/bash
        if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
        fi
        
         
        vrrp_script check_nginx {script "/etc/keepalived/script_check_nginx.sh"interval 2
        }
        
  2. Nginx 集群(多节点负载均衡)

    • 架构说明:部署多个 Nginx 节点,前端通过 DNS 轮询或硬件负载均衡器(如 F5)分发请求,避免单节点故障。
    • 适用场景:高并发场景下,通过横向扩展 Nginx 节点提升整体处理能力。

(三)日志集中管理

  1. ELK Stack 方案
    • 组件说明
      • Elasticsearch:存储和检索日志数据。
      • Logstash:收集、过滤 Nginx 和 Tomcat 日志,并发送至 Elasticsearch。
      • Kibana:可视化展示日志统计信息。
    • Nginx 日志输出到 Logstash
      log_format json_log '{"time":"$time_iso8601",''"remote_addr":"$remote_addr",''"request":"$request",''"status":"$status",''"body_bytes_sent":"$body_bytes_sent",''"http_referer":"$http_referer",''"http_user_agent":"$http_user_agent"}';access_log /usr/local/nginx/logs/access.json json_log;
      
    • Logstash 配置
      input {file {path => "/usr/local/nginx/logs/access.json"type => "nginx"codec => json_lines}
      }
      output {elasticsearch {hosts => ["192.168.10.106:9200"]index => "nginx-%{+YYYY.MM.dd}"}
      }
      

(四)自动化部署与监控

  1. CI/CD 流程

    • 使用 Jenkins 或 GitLab CI 实现代码自动构建、测试和部署:
      1. 代码提交至 Git 仓库后,Jenkins 拉取代码并编译 Java 项目。
      2. 打包 WAR 包并分发到所有 Tomcat 节点的webapps目录。
      3. 触发 Nginx 重新加载配置,确保新版本应用生效。
  2. Prometheus+Grafana 监控

    • 采集指标
      • Nginx:请求量、错误率、响应时间(通过stub_status模块)。
      • Tomcat:线程池状态、内存使用、JSP 编译耗时(通过 JMX 接口)。
    • Prometheus 配置
      scrape_configs:- job_name: "nginx"static_configs:- targets: ["192.168.10.103:80"]- job_name: "tomcat"static_configs:- targets: ["192.168.10.101:8009", "192.168.10.102:8009"]  # Tomcat JMX端口
      
    • Grafana 仪表盘:展示实时请求趋势、服务器负载、错误分布等图表,设置告警规则(如请求错误率超过 5% 时发送通知)。

九、成本优化与性能对比

(一)硬件资源规划

组件最低配置(开发环境)推荐配置(生产环境)
Nginx 服务器2 核 CPU,4GB 内存,50GB 磁盘4 核 CPU,8GB 内存,100GB SSD
Tomcat 服务器2 核 CPU,4GB 内存,100GB 磁盘4-8 核 CPU,16GB 内存,200GB SSD
数据库服务器4 核 CPU,8GB 内存,200GB 磁盘8 核 CPU,32GB 内存,500GB SSD

(二)性能对比(压测数据参考)

场景单 Tomcat 节点Nginx+Tomcat 集群(2 节点)
静态资源请求(RPS)5000+10000+
动态 JSP 请求(RPS)800-10001500-2000
内存占用800MB-1.2GB每 Tomcat 节点 800MB-1.2GB,Nginx 200MB

说明

  • 静态资源处理性能提升约 100%,得益于 Nginx 的高效缓存和 IO 模型。
  • 动态请求性能提升约 50%-100%,通过负载均衡分摊压力并减少 Tomcat 的静态资源处理开销。

十、总结与最佳实践

(一)核心价值

  • 动静分离:Nginx 专注静态资源处理,Tomcat 专注动态逻辑,提升整体效率。
  • 负载均衡:通过多节点 Tomcat 分摊流量,避免单点故障,提升可用性。
  • 高可扩展性:可灵活增加 Nginx 或 Tomcat 节点,适应业务增长。

(二)最佳实践清单

  1. 开发阶段

    • 启用 Tomcat 的reloadable=true(仅开发环境),方便代码修改后自动重启。
    • 使用 Nginx 的proxy_next_upstream配置,实现故障节点请求重试:

      nginx

      proxy_next_upstream error timeout http_500;
      
  2. 生产阶段

    • 关闭 Tomcat 的自动部署(autoDeploy=false)和 WAR 包解压(unpackWARs=false),避免未授权部署。
    • 为 Nginx 和 Tomcat 配置统一的日志格式,便于集中分析(如 JSON 格式日志)。
  3. 维护阶段

    • 定期备份 Nginx 和 Tomcat 配置文件(如nginx.confserver.xml)。
    • 制定应急预案,包含节点故障切换、数据恢复等流程,定期进行容灾演练。

相关文章:

  • Nginx+Tomcat 负载均衡群集
  • Nginx + Tomcat 负载均衡、动静分离群集
  • nginx+tomcat动静分离、负载均衡
  • 接口自动化测试之pytest接口关联框架封装
  • 业态即战场:零售平台的生意模型与系统设计解构
  • 数据解析:一文掌握Python库 lxml 的详细使用(处理XML和HTML的高性能库)
  • 基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破
  • B站缓存视频数据m4s转mp4
  • 网络安全-等级保护(等保) 3-3 GB/T 36627-2018 《信息安全技术 网络安全等级保护测试评估技术指南》-2018-09-17发布【现行】
  • 解锁Java多级缓存:性能飞升的秘密武器
  • 从基础原理到Nginx实战应用
  • Vert.x学习笔记-EventLoop与Handler的关系
  • AI数据集构建:从爬虫到标注的全流程指南
  • 人工智能挑战杯推荐项目
  • 【知识点】openai请求参数如何转为大模型的字符串?
  • 《仿盒马》app开发技术分享-- 个人中心关于逻辑完善(端云一体)
  • 嵌入式开发学习日志(linux系统编程--系统编程之 进程间通信IPC)Day32
  • [内核开发手册] ARM汇编指令速查表
  • 52. N 皇后 II【 力扣(LeetCode) 】
  • 涂装协作机器人:重新定义涂装工艺的智能化未来
  • 帝国cms手机网站/广告优化师工作内容
  • 山东法院网站哪个公司做的/西安网站建设哪家好
  • 网站建设与单位干部作风的关系/seo人员的相关薪资
  • 网站建设做微营销/产品推广活动策划方案
  • 鹤壁网站推广公司/总裁培训班
  • 博望哪里做网站/舆情网站直接打开的软件