Nginx+Tomcat负载均衡集群

目录

[一、Tomcat 基础与单节点部署](#一、Tomcat 基础与单节点部署)

[(一)Tomcat 概述](#(一)Tomcat 概述)

(二)单节点部署案例

[1. 案例环境](#1. 案例环境)

[2. 实施准备](#2. 实施准备)

[3. 安装 JDK](#3. 安装 JDK)

[4. 查看 JDK 安装情况](#4. 查看 JDK 安装情况)

[5. 安装配置 Tomcat](#5. 安装配置 Tomcat)

[6. 启动 Tomcat](#6. 启动 Tomcat)

[7. 访问测试](#7. 访问测试)

[8. 关闭 Tomcat](#8. 关闭 Tomcat)

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

[(四)建立 Java Web 站点](#(四)建立 Java Web 站点)

[二、Nginx+Tomcat 负载均衡与动静分离群集搭建](#二、Nginx+Tomcat 负载均衡与动静分离群集搭建)

(一)案例分析

(二)案例环境

[(三)Tomcat2 服务器配置](#(三)Tomcat2 服务器配置)

[(四)Nginx 服务器配置](#(四)Nginx 服务器配置)

(五)测试效果

三、总结

[四、Tomcat 核心组件解析](#四、Tomcat 核心组件解析)

[(一)Server 与 Service](#(一)Server 与 Service)

(二)Connector:请求入口

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

[(四)Context:Web 应用容器](#(四)Context:Web 应用容器)

(五)组件协作流程

[五、Nginx 负载均衡策略与优化](#五、Nginx 负载均衡策略与优化)

(一)负载均衡策略配置

(二)健康检查机制

(三)动静分离优化实践

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

(一)安全加固

(二)性能调优

(三)监控与日志

七、常见问题与解决方案

(一)动态页面无法访问

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

(三)负载均衡未生效

八、扩展与高可用架构

[(一)增加 Tomcat 节点](#(一)增加 Tomcat 节点)

[(二)Nginx 高可用(主从 / 集群)](#(二)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.shshutdown.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

  2. 创建测试页面 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"/>
  2. 重启 Tomcat

    /usr/local/tomcat9/bin/shutdown.sh
    /usr/local/tomcat9/bin/startup.sh

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

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

(一)案例分析

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

(二)案例环境

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

(三)Tomcat2 服务器配置

  1. 关闭防火墙(同 Tomcat1)

    systemctl stop firewalld
    setenforce 0

  2. 安装 JDK 和 Tomcat(版本与 Tomcat1 一致)

    安装JDK(若未安装)

    解压Tomcat安装包

    tar xf apache-tomcat-9.0.8.tar.gz

    移动并重命名

    mv apache-tomcat-9.0.8 /usr/local/tomcat9

  3. 创建站点目录并配置

    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

  2. 安装依赖软件包

    dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker

  3. 创建 Nginx 用户

    useradd -M -s /sbin/nologin nginx

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

  5. 配置 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

  2. 测试配置文件

    /usr/local/nginx/sbin/nginx -t

  3. 启动 Nginx 服务

    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  4. 查看服务进程和端口

    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 {
        daily
        rotate 7
        compress
        missingok
        notifempty
      }
  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配置,添加新节点:

      bash 复制代码
      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 MASTER
          interface eth0  # 绑定网卡
          virtual_router_id 51  # 虚拟路由ID(主从一致)
          priority 100       # 主节点优先级(备用节点设为90)
          advert_int 1       # 心跳间隔(秒)
          authentication {
            auth_type PASS
            auth_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 ]; then
          systemctl 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-1000 1500-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)。
    • 制定应急预案,包含节点故障切换、数据恢复等流程,定期进行容灾演练。
相关推荐
哈哈哈哈哈哈哈哈哈...........1 小时前
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
tcp/ip·nginx·lua
Adorable老犀牛5 小时前
负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port
nginx·http·https·负载均衡
�FENG19 小时前
Nginx+Tomcat负载均衡与动静分离架构
nginx·tomcat·负载均衡·动静分离
别骂我h19 小时前
Nginx+Tomcat负载均衡群集
nginx·tomcat·负载均衡
結城21 小时前
使用nginx配置反向代理,负载均衡
运维·服务器·nginx
恋上钢琴的虫21 小时前
搭建nginx的负载均衡
运维·nginx·负载均衡
一刀到底2111 天前
springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
spring boot·微服务·tomcat
FungLeo1 天前
安装和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服务器详细实录6
服务器·mysql·nginx
.生产的驴2 天前
SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
java·分布式·后端·spring·spring cloud·信息可视化·tomcat
潘yi.2 天前
Nginx+Tomcat负载均衡群集
nginx·tomcat·负载均衡