当前位置: 代码网 > 服务器>服务器>Linux > Nginx+Tomcat负载均衡集群详解

Nginx+Tomcat负载均衡集群详解

2025年06月04日 Linux 我要评论
一、tomcat 基础与单节点部署(一)tomcat 概述名称由来:由 sun 公司詹姆斯・邓肯・戴维森开发,后贡献给 apache 软件基金会。因希望项目以能自我照顾的动物命名,最终定名为 &ldq

一、tomcat 基础与单节点部署

(一)tomcat 概述

名称由来:由 sun 公司詹姆斯・邓肯・戴维森开发,后贡献给 apache 软件基金会。因希望项目以能自我照顾的动物命名,最终定名为 “tomcat”(公猫),其 logo 也设计为公猫形象。早期项目名为 “catalina”,故安装后可见许多相关目录和文件。

应用场景:免费开源的轻量级 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 目录与配置文件说明

主要目录

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

主配置文件 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 站点

创建站点目录

mkdir -pv /web/webapp1

创建测试页面 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>

修改 server.xml 配置

在<host>元素中添加<context>配置,将站点路径指向 /web/webapp1:

<context docbase="/web/webapp1" path="" reloadable="true"/>

重启 tomcat

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

访问测试

在浏览器中输入 “http://192.168.10.101:8080/”,应显示自定义的 jsp 页面内容。

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

(一)案例分析

需求背景:单台 tomcat 存在单点故障风险,且处理静态资源效率低。nginx 具有高性能、低资源消耗的特点,可作为反向代理和负载均衡器,与 tomcat 结合实现动静分离,提升站点性能和可靠性。

拓扑架构: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 服务器配置

关闭防火墙(同 tomcat1)

systemctl stop firewalld
setenforce 0

安装 jdk 和 tomcat(版本与 tomcat1 一致)

# 安装jdk(若未安装)
# 解压tomcat安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动并重命名
mv apache-tomcat-9.0.8 /usr/local/tomcat9

创建站点目录并配置

mkdir -pv /web/webapp1

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

<context docbase="/web/webapp1" path="" reloadable="true"/>

创建测试页面 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>

启动 tomcat2 并测试

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

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

(四)nginx 服务器配置

关闭防火墙

systemctl stop firewalld
setenforce 0

安装依赖软件包

dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-extutils-makemaker

创建 nginx 用户

useradd -m -s /sbin/nologin nginx

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

配置 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;
}

准备静态图片

mkdir /usr/local/nginx/html/img
cp /root/logo.jpg /usr/local/nginx/html/img

测试配置文件

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

启动 nginx 服务

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

查看服务进程和端口

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

server

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

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:请求入口

功能与类型

  • 监听指定端口,接收客户端请求并转发给 engine,同时将响应返回给客户端。

典型 co4nnector

  • http connector(端口 8080):直接处理浏览器的 http 请求,协议为http/1.1,用于动态页面访问。
  • aj5p connector(端口 8009):接收其他 web 服务器(如 nginx)的代理请求,协议为ajp/1.3,用于动静分离场景。

关键配置参6数

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

(三)eng1ine 与 host:请求处理与虚拟主机

engine

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

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 应用容器

功能

  • 代表一个 web 应用,对应一个目录或 war 包,包含 servlet、jsp、配置文件等资源。
  • 通过doc{insert\_element\_8\_}base指定物理路径,path指定访问路径(如path="/app"表示通过http://host:port/app访问)。

关键配置

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

(五)组件协作流程

请求链路

客户端请求 → connector(接收) → engine(路由) → host(匹配虚拟主机) → context(处理web应用) → 返回响应

示例场景

用户访问http://www.test.com/app1/index.jsp

  • connector(8080 端口)接收 http 请求。
  • engine 根据域名www.test.com匹配到对应的 host。
  • host 根据path="/app1"找到对应的 context,调用 jsp 引擎编译并执行index.jsp,返回动态内容。

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

(一)负载均衡策略配置

轮询(默认)

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

权重轮询(weight)

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

ip 哈希(ip_hash)

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

(二)健康检查机制

被动检查(默认)

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

主动检查(第三方模块)

  • 使用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;
}

(三)动静分离优化实践

静态资源缓存配置

  • 通过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";
}

压缩优化

  • 启用 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)
}

防盗链配置

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

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

(一)安全加固

端口与防火墙

  • 仅开放必要端口(如 nginx 的 80/443、tomcat 的 8080/8009),关闭其他端口。
  • 使用防火墙(如 firewalld、ufw)限制 ip 访问,仅允许可信 ip 连接后端 tomcat。

用户权限

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

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;
}

(二)性能调优

nginx worker 进程优化

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

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:请求队列最大长度(防止内存溢出)。

连接超时优化

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

(三)监控与日志

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"';
}

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
}

监控工具集成

使用 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;
}

七、常见问题与解决方案

(一)动态页面无法访问

排查步骤

  • 检查 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 异常。

常见原因

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

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

排查步骤

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

解决方案

修正rootalias路径,确保与实际文件路径一致(root为绝对路径,alias为自定义路径)。

赋予目录读权限:

chmod -r o+r /usr/local/nginx/html/img

(三)负载均衡未生效

排查步骤

  • 检查 upstream 配置:确认server ip 和端口是否正确,权重设置是否合理,是否遗漏ip_hash等策略。
  • 清除浏览12器缓存:刷新页面时按ctrl+f5强制清除缓存,避免浏览器缓存导致请求未分发到后端。
  • 查看请求头:通过浏览器开发者工具查看x-forwarded-for头,确认是否包含后端 tomcat 的 ip 地址。

常见原因

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

八、扩展与高可用架构

(一)增加 tomcat 节点

步骤说明

新增 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重新加载配置,新节点即可参与负载均衡。

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 高可用(主从 / 集群)

主从模式(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
}

nginx 集群(多节点负载均衡)

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

(三)日志集中管理

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}"
  }
}

(四)自动化部署与监控

ci/cd 流程

使用 jenkins 或 gitlab ci 实现代码自动构建、测试和部署:

  • 代码提交至 git 仓库后,jenkins 拉取代码并编译 java 项目。
  • 打包 war 包并分发到所有 tomcat 节点的webapps目录。
  • 触发 nginx 重新加载配置,确保新版本应用生效。

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 节点,适应业务增长。

(二)最佳实践清单

开发阶段

启用 tomcat 的reloadable=true(仅开发环境),方便代码修改后自动重启。

使用 nginx 的proxy_next_upstream配置,实现故障节点请求重试:

  • nginx
proxy_next_upstream error timeout http_500;

生产阶段

  • 关闭 tomcat 的自动部署(autodeploy=false)和 war 包解压(unpackwars=false),避免未授权部署。
  • 为 nginx 和 tomcat 配置统一的日志格式,便于集中分析(如 json 格式日志)。

维护阶段

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com