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 概述
- 名称由来:由 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.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 服务器配置
- 关闭防火墙(同 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
(五)测试效果
- 静态页面测试:在浏览器中输入 “http://192.168.10.103/”,应显示 Nginx 默认的静态页面。
- 负载均衡测试:在浏览器中输入 “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>
- 代表整个 Catalina Servlet 容器,是 Tomcat 的顶层容器,负责管理所有 Service 组件,监听关闭端口(默认 8005),通过
-
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
,用于动静分离场景。
- HTTP Connector(端口 8080):直接处理浏览器的 HTTP 请求,协议为
-
关键配置参6数
port
:监听端口(如 8080)。protocol
:协议类型(如HTTP/1.1
或AJP/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.jsp
、index.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 错误或超时,则认为服务器故障,自动跳过(故障恢复后重新加入)。
- 配置参数:
max_fails
:允许失败次数(默认 1 次)。fail_timeout
:故障超时时间(默认 10 秒,期间不再转发请求)。
upstream tomcat_server {server 192.168.10.101:8080 max_fails=2 fail_timeout=30s; }
-
主动检查(第三方模块)
- 使用
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 用户运行(如
nginx
、tomcat
用户),避免权限过高导致安全风险。 - 修改文件权限,确保配置文件和日志目录仅可被管理员读写:
chown -R nginx:nginx /usr/local/nginx chown -R tomcat:tomcat /usr/local/tomcat9
- Nginx 和 Tomcat 均使用非 root 用户运行(如
-
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
:请求队列最大长度(防止内存溢出)。
- 修改 server.xml 中的
-
连接超时优化
- 缩短 Nginx 和 Tomcat 的超时时间,释放无效连接:
# Nginx配置 proxy_connect_timeout 5s; proxy_read_timeout 10s; proxy_send_timeout 10s;
# Tomcat配置(server.xml) <Connector port="8080" connectionTimeout="20000" />
- 缩短 Nginx 和 Tomcat 的超时时间,释放无效连接:
(三)监控与日志
-
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 {dailyrotate 7compressmissingoknotifempty }
- 主要日志文件:
-
监控工具集成
- 使用 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 错误日志(
- 检查 Nginx 代理配置:确认
-
常见原因
- 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 错误。
- 检查 Nginx 路径配置:确认
-
解决方案
- 修正
root
或alias
路径,确保与实际文件路径一致(root
为绝对路径,alias
为自定义路径)。 - 赋予目录读权限:
chmod -R o+r /usr/local/nginx/html/img
- 修正
(三)负载均衡未生效
-
排查步骤
- 检查 upstream 配置:确认
server
IP 和端口是否正确,权重设置是否合理,是否遗漏ip_hash
等策略。 - 清除浏览12器缓存:刷新页面时按
Ctrl+F5
强制清除缓存,避免浏览器缓存导致请求未分发到后端。 - 查看请求头:通过浏览器开发者工具查看
X-Forwarded-For
头,确认是否包含后端 Tomcat 的 IP 地址。
- 检查 upstream 配置:确认
-
常见原因
- Nginx 配置未重新加载:修改
nginx.conf
后需执行nginx -s reload
使配置生效。 - 后端服务器故障:某台 Tomcat 未启动或端口被占用,Nginx 自动将其从负载均衡组中剔除。
- 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>
- 配置
- Tomcat 自带 Session 复制:在
(二)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 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
改为BACKUP
、priority
降低外,其余与主节点一致。 - 健康检查脚本:在 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 }
- 安装 Keepalived:
-
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 重新加载配置,确保新版本应用生效。
- 使用 Jenkins 或 GitLab CI 实现代码自动构建、测试和部署:
-
Prometheus+Grafana 监控
- 采集指标:
- Nginx:请求量、错误率、响应时间(通过
stub_status
模块)。 - Tomcat:线程池状态、内存使用、JSP 编译耗时(通过 JMX 接口)。
- Nginx:请求量、错误率、响应时间(通过
- 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 节点,适应业务增长。
(二)最佳实践清单
-
开发阶段
- 启用 Tomcat 的
reloadable=true
(仅开发环境),方便代码修改后自动重启。 - 使用 Nginx 的
proxy_next_upstream
配置,实现故障节点请求重试:nginx
proxy_next_upstream error timeout http_500;
- 启用 Tomcat 的
-
生产阶段
- 关闭 Tomcat 的自动部署(
autoDeploy=false
)和 WAR 包解压(unpackWARs=false
),避免未授权部署。 - 为 Nginx 和 Tomcat 配置统一的日志格式,便于集中分析(如 JSON 格式日志)。
- 关闭 Tomcat 的自动部署(
-
维护阶段
- 定期备份 Nginx 和 Tomcat 配置文件(如
nginx.conf
、server.xml
)。 - 制定应急预案,包含节点故障切换、数据恢复等流程,定期进行容灾演练。
- 定期备份 Nginx 和 Tomcat 配置文件(如
相关文章:
Nginx+Tomcat负载均衡集群
目录 一、Tomcat 基础与单节点部署 (一)Tomcat 概述 (二)单节点部署案例 1. 案例环境 2. 实施准备 3. 安装 JDK 4. 查看 JDK 安装情况 5. 安装配置 Tomcat 6. 启动 Tomcat 7. 访问测试 8. 关闭 Tomcat (三…...

QQ邮箱发送验证码(Springboot)
一、邮箱发送服务准备 在qq邮箱的设置中选择账号下开启服务。 开启时可能会有短信验证,开启后显示验证码之类的一串英文,复制保存起来,在配置文件中会使用到。 二、后端依赖及配置 依赖 在pom.yml文件中添加相关依赖,redis的…...
Python Copilot【代码辅助工具】 简介
粉丝爱买鳕鱼肠深海鳕鱼肉鱼肉香肠盼盼麦香鸡味块卡乐比(Calbee)薯条三兄弟 独立小包美丽雅 奶茶杯一次性饮料杯好时kisses多口味巧克力糖老金磨方【黑金系列】黑芝麻丸郑新初网红郑新初烤鲜牛肉干超人毛球修剪器去球器剃毛器衣服去毛器优惠券宁之春 红黑…...
如何写高效的Prompt?
概述 提示词(Prompt)的质量将直接影响模型生成结果的质量,所以精心设计一个让大模型能够理解并有效回复的提示词是至关重要的。本文内容自论文中获取:https://arxiv.org/pdf/2312.16171 介绍了5类共计26条提示词书写原则。 书写原则 类别原则备注快速…...

【EF Core】 EF Core并发控制:乐观锁与悲观锁的应用
文章目录 前言一、并发的风险二、EF Core中的并发控制方式2.1 开放式并发(乐观锁)2.1.1 应用程序管理的属性并发令牌2.1.2 数据库生成的并发令牌 2.2 悲观锁 总结 前言 实际的生产环境中,我们经常能遇到数据库由多个应用程序同时使用。每个程…...
WaytoAGI东京大会开启AI全球化新对话:技术无国界,合作促创新
全球AI专家齐聚东京,一场关于技术无国界的对话正在进行。 2025年6月7日,一场备受瞩目的AI盛会——“WaytoAGI全球AI大会东京站”在日本东京樱美林大学新宿校区正式拉开帷幕。这场为期两天的会议(6月7日至8日)由国内最大的AI开源知…...

Harmony核心:动态方法修补与.NET游戏Mod开发
一、Harmony的核心定位与设计哲学 Harmony是一个运行时动态方法修补库,专为修改已编译的.NET/Mono应用程序而设计,尤其适用于游戏Mod开发。其核心创新在于: 非破坏性修改:保留原始方法完整性,避免直接替换或覆盖。多…...
AI系统应用开发工程师
以下是对AI系统应用开发与运维岗位的梳理整合,从企业、岗位、任务、能力等维度进行分类呈现,便于清晰对比两者的工作侧重: 一、代表性企业对比 分类企业名称应用开发方向中移系统集成有限公司、科大讯飞河北科技有限公司、华为技术服务有限…...
Qt Test功能及架构
Qt Test 是 Qt 框架中的单元测试模块,在 Qt 6.0 中提供了全面的测试功能。 一、主要功能 核心功能 1. 单元测试框架 提供完整的单元测试基础设施 支持测试用例、测试套件的组织和执行 包含断言宏和测试结果收集 2. 测试类型支持 单元测试:对单个函…...
图像处理、图像分析和图像理解的定义、联系与区别
1. 定义 图像处理(Image Processing) 图像处理是低层操作,主要针对像素级的图像数据进行加工,目的是改善图像质量或为后续分析做准备。 典型任务:去噪、增强(如对比度调整)、锐化、边缘检测、图…...

【Java开发日记】说一说 SpringBoot 中 CommandLineRunner
目录 1、CommandLineRunner SpringBoot中CommandLineRunner的作用 简单例子 多个类实现CommandLineRunner接口执行顺序的保证 通过实现Ordered接口实现控制执行顺序 通过Order注解实现控制执行顺序 Order 作用 2、ApplicationRunner 3、传递参数 4、源码跟踪 run()方…...

全面理解 Linux 内核性能问题:分类、实战与调优策略
在 Linux 系统(特别是嵌入式或服务器环境)中,性能问题往往错综复杂、表象多变。只有对常见性能问题进行系统归类、理解其症状与根源,才能有效定位和解决。本文将围绕八大类核心性能问题,结合实战示例,逐类分…...

算法-多条件排序
1、数对排序的使用 pair<ll,ll> a[31];//cmp为比较规则 ll cmp(pair<ll,ll>a,pair<ll,ll>b){if(a.first!b.first)return a.first>b.first;else return a.second<b.second; }//按照比较规则进行排序 sort(a1,a31,cmp); 2、具体例题 输入样例࿱…...
DelayQueue、ScheduledThreadPoolExecutor 和 PriorityBlockingQueue :怎么利用堆实现定时任务
DelayQueue DelayQueue 的最大亮点: 并不是简单全局锁的“单调队列”实现,而是用Leader-Follower 模式极大减少了线程唤醒的开销。插入与唤醒、等待与 leader 变更,都通过巧妙的锁和条件变量组合完成。 如果只关注“线程安全的优先队列全局…...
Kafka 消息模式实战:从简单队列到流处理(二)
四、Kafka 流处理实战 4.1 Kafka Streams 简介 Kafka Streams 是 Kafka 提供的流处理库,它为开发者提供了一套简洁而强大的 API,用于构建实时流处理应用程序。Kafka Streams 基于 Kafka 的高吞吐量、分布式和容错特性,能够处理大规模的实时…...
大数据(2) 大数据处理架构Hadoop
一、Hadoop简介 1.定义 Hadoop 是一个开源的分布式计算框架,由 Apache 基金会开发,用于处理海量数据,具备高可靠性、高扩展性和高容错性。它主要由两个核心模块组成: HDFS(Hadoop Distributed File System)…...
【Kotlin】注解反射扩展
文章目录 注解用法反射类引用 扩展扩展函数的作用域成员方法优先级总高于扩展函数 被滥用的扩展函数扩展属性静态扩展 标准库中的扩展函数 使用 T.also 函数交换两个变量sNullOrEmpty | isNullOrBlankwith函数repeat函数 调度方式对扩展函数的影响静态与动态调度扩展函数始终静…...

固定ip和非固定ip的区别是什么?如何固定ip地址
在互联网中,我们常会接触到固定IP和非固定IP的概念。它们究竟有何不同?如何固定IP地址?让我们一起来探究这个问题。 一、固定IP和非固定IP的区别是什么 固定IP(静态IP)和非固定IP(动态IP)是两种…...
升级centos 7.9内核到 5.4.x
前面是指南,后面是工作日志。 wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.225-1.el7.elrepo.x86_64.rpm wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.2…...
Nginx 安全设置配置
1、增加header公共文件 文件地址:/etc/nginx/conf.d/security_headers.conf # XSS防护配置add_header X-XSS-Protection "1; modeblock" always; # 其他安全配置add_header X-Content-Type-Options "nosniff";add_header X-Frame-Options &qu…...
协程的常用阻塞函数
以下是一些常见的阻塞函数示例: 1. **Thread.sleep()** 阻塞当前线程一段时间。 kotlin Thread.sleep(1000) // 阻塞线程 1 秒 2. **InputStream.read()** 从输入流中读取数据时会阻塞,直到有数据可用或流结束。 kotlin val inputStream FileInputStre…...
探索NoSQL注入的奥秘:如何消除MongoDB查询中的前置与后置条件
随着互联网技术的飞速发展,数据库作为信息存储与管理的核心,其安全性问题日益凸显。近年来,NoSQL数据库因其灵活性和高性能逐渐成为许多企业的首选,其中MongoDB以其文档存储和JSON-like查询语言在开发社区中广受欢迎。然而&#x…...

使用矩阵乘法+线段树解决区间历史和问题的一种通用解法
文章目录 前言P8868 [NOIP2022] 比赛CF1824DP9990/2020 ICPC EcFinal G 前言 一般解决普通的区间历史和,只需要定义辅助 c h s − t ⋅ a chs-t\cdot a chs−t⋅a, h s hs hs是历史和, a a a是区间和, t t t是时间戳,…...
React Navive初识
文章目录 搭建开发环境安装 Node、homebrew、Watchman安装 Node安装 homebrew安装 watchman 安装 React Native 的命令行工具(react-native-cli)创建新项目编译并运行 React Native 应用在 ios 模拟器上运行 调试访问 App 内的开发菜单 搭建开发环境 在…...
scss(sass)中 的使用说明
在 SCSS(Sass)中,& 符号是一个父选择器引用,它代表当前嵌套规则的外层选择器。主要用途如下: 1. 连接伪类/伪元素 scss 复制 下载 .button {background: blue;&:hover { // 相当于 .button:hoverbackgrou…...

如何从浏览器中导出网站证书
以导出 GitHub 证书为例,点击 小锁 点击 导出 注意:这里需要根据你想要证书格式手动加上后缀名,我的是加 .crt 双击文件打开...

低功耗MQTT物联网架构Java实现揭秘
文章目录 一、引言二、相关技术概述2.1 物联网概述2.2 MQTT协议java三、基于MQTT的Iot物联网架构设计3.1 架构总体设计3.2 MQTT代理服务器选择3.3 物联网设备设计3.4 应用服务器设计四、基于MQTT的Iot物联网架构的Java实现4.1 开发环境搭建4.2 MQTT客户端实现4.3 应用服务器实现…...
总结HTML中的文本标签
总结HTML中的文本标签 文章目录 总结HTML中的文本标签引言一、标题标签(h1 - h6)语法示例使用建议 二、段落标签(p)语法示例使用建议 三、文本节点标签(span)语法示例使用建议 四、粗体标签(b&a…...
python版若依框架开发:前端开发规范
python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析前端开发规范文章目录 python版若依框架开发新增 view新增 api新增组件新增样式引⼊依赖新增 view 在 @/views文件下 创建对应的文件夹,一般性一个路由对应⼀个文件, 该…...
AI推理服务的高可用架构设计
AI推理服务的高可用架构设计 在传统业务系统中,高可用架构主要关注服务冗余、数据库容灾、限流熔断等通用能力。而在AI系统中,尤其是大模型推理服务场景下,高可用架构面临更加复杂的挑战,如推理延迟敏感性、GPU资源稀缺性、模型版本切换频繁等问题。本节将专门探讨如何构建…...