Nginx+Tomcat 负载均衡群集
一、Tomcat 基础与案例部署
(一)Tomcat 概述与应用场景
- 起源与命名
Tomcat 最初由 Sun 公司的詹姆斯・邓肯・戴维森开发,后贡献给 Apache 软件基金会。项目早期名为 “Catalina”,因此安装目录中包含大量与 Catalina 相关的文件(如配置目录、日志文件等)。最终以 “Tomcat”(公猫)命名,其 Logo 也设计为公猫形象。 - 定位与功能 124
Tomcat 是开源的轻量级 Web 应用服务器,主要作为 Servlet 和 JSP 容器,用于处理动态请求(如 Java 后端逻辑)。尽管具备处理 HTML 的能力,但其静态资源处理效率低于 Apache 或 Nginx,因此常与这些服务器配合使用,形成 “前端静态服务器 + 后端 Tomcat” 的架构。 - 应用场景 56
适用于中小型系统和并发用户较少的场景,如 JSP 开发的电子商务网站、企业内部管理系统等。对于访问量较大的生产环境,需结合负载均衡技术扩展。
(二)案例环境与36准备
- 环境配置
- 主机:Tomcat 服务器
- IP 地址:192.168.10.101
- 操作系统:OpenEuler24
- 应用版本:apache-tomcat-9.0.8。
- 前置条件 7
- 关闭防火墙:需停止 firewalld 服务并禁用 SELinux,确保网络通信正常。
- 安装 JD89K:Tomcat 依赖 Java 运行环境,需提前安装 JDK(本案例使用 1.8.0_171 版本),通过
java -version
命令验证安装。
(三)Tomca101112t 安装与配置
- 安装步骤
- 解压文件:将 Tomcat 源码包(apache-tomcat-9.0.8.tar.gz)解压到指定目录。
- 目录移动1314:将解压后的文件夹移动至 /usr/local/,并重命名为 “tomcat9”,便于统一管理。
- 启动服务1516:通过
startup.sh
脚本启动 Tomcat,默认监听 8080 端口,使用netstat -anpt | grep 8080
命令检查端口状态。 - 访问测试171819:浏览器输入 “http:// 服务器 IP:8080/”,若出现 Tomcat 欢迎页面,则安装成功。
- 主目录结构 2021
- bin/:存放启动 / 关闭脚本(如 startup.sh、shutdown.sh)。
- conf22/:包含核心配置文件(如 server.xml、web.xml),用于定义端口、虚拟主机、安全策略等。
- weba23pps/:默认的 Web 应用部署目录,存放站点文件和应用程序。
- work24/:存储 JSP 编译生成的 Class 文件。
(四)主配置文件25server.xml 解析
- 核心组件架构
- Server:代表整个 Catalina 容器,包含一个或多个 Service。
- Serv27ice:由一组 Connector 和一个 Engine 组成,负责处理请求的接收与处理逻辑。
- Conn28ector:监听特定端口的请求,常见类型包括 HTTP 连接器(默认 8080 端口)和 AJP 连接器(默认 8009 端口,用于与其他服务器通信)。
- Engi293031ne:管理多个虚拟主机(Host),根据请求域名匹配到对应的 Host 处理。
- Host32:代表虚拟主机,通过域名绑定部署的 Web 应用(Context),支持 “最长匹配” 规则定位请求路径。
- Cont3334ext:对应一个 Web 应用,定义应用的文档根目录、访问路径等。
- 关键配置示例35
- 端口修改:在 Connector 标签中调整
port
属性,如将 HTTP 端口改为 80。 - 虚拟主机26定义:在 Host 标签中配置
name
(域名)和appBase
(应用根目录),并通过 Context 标签关联物理路径。
- 端口修改:在 Connector 标签中调整
(五)建立 Jav3640a Web 站点
- 目录与文件创建
- 在根目录下创建 “/web/webapp1” 作为站点目录,并添加 index.jsp 测试页面,包含动态内容(如
out.println
输出)和静态图片引用(如 logo.jpg)。
- 在根目录下创建 “/web/webapp1” 作为站点目录,并添加 index.jsp 测试页面,包含动态内容(如
- 配置虚拟主机3738
- 修改 server.xml,在 Host 标签内添加 Context 配置,指定
docBase="/web/webapp1"
(文档根目录)和path=""
(默认访问路径),使站点通过根路径访问。
- 修改 server.xml,在 Host 标签内添加 Context 配置,指定
- 验证站点 3940
- 重启 Tomcat 后,访问 “http:// 服务器 IP:8080/”,应显示 JSP 动态内容,但静态图片因未配置 Nginx 暂无法加载。
二、Nginx+T4142omcat 负载均衡与动静分离
(一)架构设计原理
- 负载均衡需求
单一 Tomcat 服务器存在单点故障风险,且高并发下性能不足。通过 Nginx 作为负载均衡器,将请求分发到多个 Tomcat 实例,可提升系统可用性和吞吐量。 - 动静分离优势4445
- Nginx:擅长处理静态资源(如图片、CSS、JS),支持高并发连接,资源消耗低,可快速响应并缓存静态内容。
- Tomc4546at:专注于动态请求处理(如 JSP、Servlet),释放计算资源用于业务逻辑。
- 协作流程46:Nginx 接收所有请求,静态资源直接响应,动态请求(如.jsp 后缀)转发至 Tomcat 集群处理。
(二)案例环境与47准备
- 环境配置
主机 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 - 前置条件
48 - Tomcat2 配置:与 Tomcat1 一致,需确保 JDK 版本、Tomcat 版本相同,并在 /web/webapp1 目录下创建 index.jsp,内容修改为 “动态页面 2” 以区分节点。- Ngin4950x 依赖:安装编译工具(gcc、make)和依赖库(pcre-devel、zlib-devel 等),用于源码编译安装。
(三)Nginx51安装与配置
- 安装步骤
- 用户创建:添加 “nginx” 用户(不允许登录系统),用于运行 Nginx 服务,提升安全性。
- 解压编译52:解压 Nginx 源码包,通过
./configure
命令指定安装路径、用户组和模块(如 SSL、HTTP/2),然后执行make & make install
完成安装。
- 核心配置文件52
- 负载均衡组定义:在 nginx.conf 的 http 块中,通过
upstream
指令定义 Tomcat 服务器列表,weight
参数设置权重(本案例均为 1,实现轮询负载均衡)。ngi{insert_element_34_}nx
upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1; }
- 动静分离规则:
- 动态请求:通过
location ~ \.jsp$
匹配所有.jsp 结尾的请求,使用proxy_pass
转发至 upstream 定义的 Tomcat 集群,并传递客户端 IP 等头部信息。
location ~ \.jsp$ {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_pass http://tomcat_server; }
- 静态资源:通过
location ~* \.(gif|jpg|png等)
匹配图片、CSS 等静态文件,指定root
路径为 Nginx 的 html 目录,并设置expires 30d
启用缓存。
location ~* \.(gif|jpg|png|css|js) {root /usr/local/nginx/html/img;expires 30d; }
- 动态请求:通过
- 默认站点配置:
location /
规则指定根路径请求返回 Nginx 的默认静态页面(index.html)。
- 负载均衡组定义:在 nginx.conf 的 http 块中,通过
(四)测试与验证57
- 静态页面测试
访问 Nginx 服务器 IP(http://192.168.10.103/),应显示 “静态页面” 内容,表明 Nginx 静态服务正常。 - 负载均衡测试5859
- 访问 “http://192.168.10.103/index.jsp”,刷新页面,观察到动态内容在 “动态页面 1” 和 “动态页面 2” 之间交替显示,证明请求被均匀分发到 Tomcat1 和 Tomcat2。
- 图片加载验证6061:由于静态图片存储在 Nginx 服务器的 /html/img 目录下,测试页面中的 logo.jpg 应正常显示,体现动静分离效果。
(五)常见问题与62优化
- 端口冲突
- 确保 Tomcat 和 Nginx 使用不同端口(Tomcat 默认 8080,Nginx 默认 80),避免占用同一端口导致服务启动失败。
- 缓存策略
- 对静态资源设置更长的缓存时间(如
expires 365d
),减少重复请求对服务器的压力。
- 对静态资源设置更长的缓存时间(如
- 健康检查
- 在 Nginx 的 upstream 配置中添加
health_check
模块(需编译时启用),定期检测 Tomcat 节点状态,自动剔除故障节点,提升集群稳定性。
- 在 Nginx 的 upstream 配置中添加
三、总结与扩展
(一)架构价值
Nginx 与 Tomcat 的组合充分发挥了两者的优势:Nginx 作为高性能前端网关,处理静态资源和负载均衡;Tomcat 专注于动态业务逻辑,实现 “专业分工”。这种架构显著提升了系统的并发处理能力、响应速度和可用性,是中小型 Web 应用的理想解决方案。
(二)扩展方向
43631. 高可用性
引入 Keepalived 实现 Nginx 节点的主备切换,避免单点故障。
使用 Docker 容器化部署 Tomcat 和 Nginx,结合 Kubernetes 实现动态扩缩容。
- 性能优化
- 启用 Nginx 的 Gzip 压缩功能(在 nginx.conf 中设置
gzip on
),减少数据传输量。 - 对 Tomcat 进行 JVM 调优,通过
CATALINA_OPTS
参数设置堆内存大小,如-Xms1024m -Xmx2048m
。
- 启用 Nginx 的 Gzip 压缩功能(在 nginx.conf 中设置
- 安全增强
- 在 Nginx 中配置 SSL 证书,启用 HTTPS 加密传输。
- 通过
proxy_redirect
和proxy_set_header
防止 URL 重定向攻击和伪造客户端 IP。
Tomcat 核心配置文件详解
1. server.xml
文件结构与关键标签
<Server>
:Tomcat 容器的顶层标签,包含一个或多个<Service>
,port
属性定义 Tomcat 关闭端口(默认 8005),仅允许本地访问。<Servi{insert\_element\_0\_}ce>
:封装<Connector>
和<Engine>
,一个 Service 可包含多个 Connector,但只能有一个 Engine。<Conne{insert\_element\_1\_}ctor>
:- HTTP 连接器:默认端口 8080,处理浏览器直接发起的 HTTP 请求,协议为
HTTP/1.1
。 - AJP 连接5器:默认端口 8009,用于与前端服务器(如 Apache/Nginx)通信,传输 Servlet/JSP 请求。
- HTTP 连接器:默认端口 8080,处理浏览器直接发起的 HTTP 请求,协议为
<Engin{insert\_element\_3\_}e>
:管理虚拟主机(<Host>
),负责将请求分发到对应的 Host,defaultHost
属性指定默认虚拟主机。<Host>{insert\_element\_4\_}
:代表一个虚拟主机,name
为域名(如localhost
),appBase
为 Web 应用部署目录(默认webapps
),unpackWARs
控制是否自动解压 WAR 包。<Conte{insert\_element\_5\_}xt>
:定义单个 Web 应用,docBase
指向物理路径,path
为访问路径(path=""
表示根路径),reloadable
设为true
时自动检测类文件变化并重启。
2. 动态请求9与静态资源的处理逻辑
- Tomcat 处理动态请求:
所有 JSP/Servlet 请求由 Tomcat 的 Servlet 容器解析,JSP 会先编译为 Java 类再执行,最终生成 HTML 响应。 - 静态资源处理局1限:
Tomcat 处理静态文件(如图片、CSS)效率较低,需依赖 Java 线程解析,高并发下易成为性能瓶颈。
Nginx10负载均衡策略与配置实践
1. 负载均衡 upstream 配置
- 轮询策略(默认):
不指定权重时,Nginx 按顺序将请求均匀分发到后端服务器,适用于各节点性能一致的场景。nginx
11 upstream tomcat_server { server 192.168.10.101:8080; server 192.168.10.102:8080; }
- **权重轮询(weight)**:
通过`weight`参数为不同服务器分配处理概率,适用于节点性能差异场景(如高配服务器权重更高)。
```nginx
{insert\_element\_10\_} upstream tomcat_server {server 192.168.10.101:8080 weight=2; # 处理2/3的请求server 192.168.10.102:8080 weight=1; # 处理1/3的请求
}
2. 动静分离的正则匹配规则
- 动态请求匹配:
使用正则表达式~ \.jsp$
匹配所有以.jsp
结尾的 URL,通过proxy_pass
转发至 Tomcat 集群。nginx
12 location ~ .jsp$ {
proxy_pass http://tomcat_server;
传递客户端真实 IP 等头部信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
- **静态资源匹配**:
使用`~* \.(gif|jpg|png|css|js)`匹配常见静态文件类型,`root`指定文件存储路径,`expires 30d`设置浏览器缓存30天。
```nginx
{insert\_element\_12\_} location ~* \.(gif|jpg|png|css|js) {root /usr/local/nginx/html/img;expires 30d; # 减少重复请求
}
集群故障排查与测试工具
1. 服务状态检查
- Tomcat 端口监听:
通过netstat -anpt | grep 8080
确认 Tomcat 是否正常启动并监听端口。 - Nginx 进程3与配置验证:
ps aux | grep nginx
查看主进程和工作进程是否存在。nginx {insert\_element\_14\_}-t
校验配置文件语法正确性,避免因配置错误导致服务启动失败。
2. 负载均衡15效果验证
- curl 命令模拟请求:
使用curl http://192.168.10.103/index.jsp
反复请求,观察返回内容是否在 Tomcat1 和 Tomcat2 之间切换。 - 日志分析:
- Tomcat 日志:查看
/usr/local/tomcat9/logs/localhost_access_log.txt
,确认请求来源 IP 是否为 Nginx 服务器地址(证明请求由 Nginx 转发)。 - Nginx 日志:分析
/usr/local/nginx/logs/access.log
,统计各后端服务器的请求分布比例。
- Tomcat 日志:查看
生产环境优化建议
1. Tomcat 性能调优
- JVM 内存配置:
通过修改CATALINA_OPTS
环境变量调整堆内存,例如:bash
export CATALINA_OPTS="-Xms2048m -Xmx4096m -XX:MaxPermSize=512m"
Xms
:初始堆大小,建议为物理内存的 1/4。Xmx
:最大堆大小,建议不超过物理内存的 3/4。
- 连接器参数优化:
在server.xml
中调整 HTTP 连接器参数:xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" # 连接超时时间(毫秒)maxThreads="500" # 最大工作线程数minSpareThreads="50" # 最小空闲线程数maxSpareThreads="100" # 最大空闲线程数acceptCount="1000"/> # 等待队列长度
2. Nginx 安全加固
- 禁止直接访问敏感文件:
在 Nginx 配置中添加规则,禁止访问.xml
、.properties
等配置文件:nginx
location ~* \.(xml|properties)$ {deny all; }
- 限制并发连接数:
使用limit_conn_zone
和limit_conn
指令限制单个 IP 的并发连接数,防止 DDoS 攻击:nginx
limit_conn_zone $binary_remote_addr zone=per_ip:10m; # 创建共享内存区域 server {limit_conn per_ip 10; # 每个IP最多保持10个连接 }
常见问题与解决方案
问题现象 | 可能原因 | 解决方法 |
---|---|---|
浏览器访问 Tomcat 显示 404 错误 | 1. 站点目录路径错误 2. Context 配置未生效 | 检查server.xml 中docBase 和path 是否正确,重启 Tomcat 9 |
静态图片无法加载(404 错误) | 1. Nginx 静态资源路径配置错误 2. 文件未正确存放 | 确认location 块中root 路径与实际文件路径一致,检查文件权限 |
13负载均衡未生效(始终访问同一 Tomcat) | 1. upstream 服务器 IP / 端口错误 2. Nginx 配置未重新加载 | 使用nginx -s reload 刷新配置,检查server 节点 IP 是否与 Tomcat 实际 IP 一致 |
Tomcat 启动后端16口未监听 | 1. 端口被其他进程占用 2. 防火墙未放行 | 使用fuser -k 8080/tcp 杀死占用进程,关闭防火墙或添加端口规则 |