目录
[一、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)
[(三)Eng1ine 与 Host:请求处理与虚拟主机](#(三)Eng1ine 与 Host:请求处理与虚拟主机)
[(四)Context:Web 应用容器](#(四)Context:Web 应用容器)
[五、Nginx 负载均衡策略与优化](#五、Nginx 负载均衡策略与优化)
[(一)增加 Tomcat 节点](#(一)增加 Tomcat 节点)
[(二)Nginx 高可用(主从 / 集群)](#(二)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 配置
<Context docBase="/web/webapp1" path="" reloadable="true"/>
在<Host>元素中添加<Context>配置,将站点路径指向 /web/webapp1: -
重启 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>
-
-
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
-
-
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 错误日志(
- 检查 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
配置,添加新节点:bashupstream 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
改为BACKUP
、priority
降低外,其余与主节点一致。 -
健康检查脚本 :在 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 重新加载配置,确保新版本应用生效。
- 使用 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 的自动部署(
autoDeploy=false
)和 WAR 包解压(unpackWARs=false
),避免未授权部署。 - 为 Nginx 和 Tomcat 配置统一的日志格式,便于集中分析(如 JSON 格式日志)。
- 关闭 Tomcat 的自动部署(
-
维护阶段
- 定期备份 Nginx 和 Tomcat 配置文件(如
nginx.conf
、server.xml
)。 - 制定应急预案,包含节点故障切换、数据恢复等流程,定期进行容灾演练。
- 定期备份 Nginx 和 Tomcat 配置文件(如