Nginx+Tomcat负载均衡与动静分离架构

目录

简介

一、Tomcat基础部署与配置

[1.1 Tomcat应用场景与特性](#1.1 Tomcat应用场景与特性)

[1.2 环境准备与安装](#1.2 环境准备与安装)

[1.3 Tomcat主配置文件详解](#1.3 Tomcat主配置文件详解)

[1.4 部署Java Web站点](#1.4 部署Java Web站点)

二、Nginx+Tomcat负载均衡群集搭建

[2.1 架构设计与原理](#2.1 架构设计与原理)

[2.2 环境准备](#2.2 环境准备)

[2.3 Tomcat2配置(与Tomcat1对称)](#2.3 Tomcat2配置(与Tomcat1对称))

[2.4 Nginx安装与配置](#2.4 Nginx安装与配置)

三、测试与验证

四、架构总结

[4.1 架构优势](#4.1 架构优势)

[4.2 生产环境优化建议](#4.2 生产环境优化建议)


简介

在现代Web应用架构中,如何高效处理日益增长的访问量和复杂的请求类型成为关键挑战。本文将详细介绍如何通过Nginx与Tomcat的组合,构建高性能的负载均衡群集并实现动静资源分离,为Java Web应用提供稳定可靠的生产环境解决方案。

一、Tomcat基础部署与配置

1.1 Tomcat应用场景与特性

Tomcat作为Apache基金会的开源Web应用服务器,是中小型Java Web项目的首选容器。它轻量级、开源且支持JSP/Servlet规范,但处理静态资源效率较低。典型应用场景中,Tomcat常作为后端动态请求处理器,与前端Nginx/Apache等静态服务器配合使用。

1.2 环境准备与安装

关闭防火墙与SELinux

复制代码
systemctl stop firewalld  # 停止防火墙服务
setenforce 0              # 临时关闭SELinux强制模式

解释:防火墙和SELinux可能阻止服务端口访问,生产环境可通过配置规则替代关闭,但测试环境建议临时关闭以简化流程。

安装JDK(Tomcat运行依赖)

复制代码
# 检查JDK是否安装
java -version
# 若未安装,使用包管理器安装(以OpenEuler为例)
dnf install -y java-1.8.0-openjdk-devel

解释:JDK包含Java虚拟机(JVM),是运行Tomcat的基础,需确保版本与Tomcat兼容(本文使用1.8版本)。

部署Tomcat

复制代码
# 解压安装包
tar xf apache-tomcat-9.0.8.tar.gz
# 移动到指定目录并重命名
mv apache-tomcat-9.0.8 /usr/local/tomcat9
# 启动Tomcat
/usr/local/tomcat9/bin/startup.sh

解释:Tomcat采用绿色部署模式,解压即可使用。startup.sh脚本会启动Java进程并监听默认8080端口。

验证启动状态

复制代码
# 查看8080端口监听
netstat -anpt | grep 8080
# 浏览器访问测试
http://192.168.10.101:8080/

预期结果:出现Tomcat默认欢迎页面,证明服务启动成功。

1.3 Tomcat主配置文件详解

Tomcat核心配置位于​​/usr/local/tomcat9/conf/server.xml​​,其结构由多层组件构成:

复制代码
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps">
        <Context docBase="/web/webapp1" path="" reloadable="true" />
      </Host>
    </Engine>
  </Service>
</Server>

关键组件解释

  • ​Server​:整个Catalina容器的顶层组件,管理服务生命周期
  • ​Connector​:监听端口的连接器,HTTP连接器默认8080端口,AJP连接器默认8009端口
  • ​Engine​:处理所有连接器请求的引擎,可配置多个虚拟主机
  • ​Host​:虚拟主机配置,appBase指定Web应用部署目录
  • ​Context​:Web应用上下文配置,docBase指定实际文件路径,path为空时为默认应用
1.4 部署Java Web站点
复制代码
# 创建网站目录
mkdir -pv /web/webapp1
# 创建测试JSP页面
vim /web/webapp1/index.jsp

index.jsp内容

复制代码
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<body>
<%out.println("动态页面1,http://www.test1.com");%>
<div>静态页面的图片1</div><br><img src="logo.jpg">
</body>
</html>

修改server.xml配置

复制代码
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <!-- 新增Context配置 -->
  <Context docBase="/web/webapp1" path="" reloadable="true" />
</Host>

解释 :​​reloadable="true"​​表示当类文件变化时自动重新加载,生产环境建议设为false以提升性能。

二、Nginx+Tomcat负载均衡群集搭建

2.1 架构设计与原理

Nginx+Tomcat组合的核心优势在于:

  • Nginx处理静态资源(图片/CSS/JS)效率极高,可缓存30天
  • Tomcat专注处理动态请求(JSP/Servlet),减轻资源消耗
  • 通过Nginx的upstream模块实现多Tomcat实例的负载均衡
2.2 环境准备

|---------|----------------|-------------|--------------|
| 主机 | IP地址 | 操作系统 | 应用 |
| Tomcat1 | 192.168.10.101 | OpenEuler24 | Tomcat 9.0.8 |
| Tomcat2 | 192.168.10.102 | OpenEuler24 | Tomcat 9.0.8 |
| Nginx | 192.168.10.103 | OpenEuler24 | Nginx 1.26.3 |

2.3 Tomcat2配置(与Tomcat1对称)
复制代码
# 修改测试页面内容以区分节点
vim /web/webapp1/index.jsp

Tomcat2的index.jsp

复制代码
<%out.println("动态页面2,http://www.test2.com");%>
<div>动态页面的图片2</div><br><img src="logo.jpg">

解释:通过修改输出内容,便于后续测试负载均衡效果时区分不同Tomcat节点。

2.4 Nginx安装与配置

编译安装Nginx(含必要模块)

复制代码
# 安装编译依赖
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker
# 创建非特权运行用户
useradd -M -s /sbin/nologin 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

参数解释

  • ​--prefix​:指定安装目录
  • ​--user/--group​:设置运行用户,提升安全性
  • ​--with-http_ssl_module​:启用HTTPS支持
  • ​--with-pcre​:支持正则表达式处理

核心配置nginx.conf

复制代码
http {
    # 负载均衡服务器组定义
    upstream tomcat_server {
        server 192.168.10.101:8080 weight=1;
        server 192.168.10.102:8080 weight=1;
    }

    server {
        listen 80;
        server_name localhost;

        # 动态请求处理(JSP)
        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|png|bmp|swf|css|js) {
            root /usr/local/nginx/html/img;
            expires 30d;
        }

        # 首页默认处理
        location / {
            root html;
            index index.html index.htm;
        }
    }
}

配置解析

  • ​upstream tomcat_server​:定义名为tomcat_server的服务器组,weight=1表示权重相同,请求均匀分配
  • ​location ~ \.jsp$​:正则匹配所有JSP请求,通过proxy_pass转发到Tomcat服务器组
  • ​proxy_set_header​:设置代理请求头,传递客户端真实IP等信息
  • ​location ~* \.(gif|jpg|png|...)​:匹配静态资源后缀,root指定文件根目录,expires 30d设置缓存30天
  • ​location /​:处理根路径请求,返回Nginx默认首页

准备静态资源并启动Nginx

复制代码
# 创建静态资源目录
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

三、测试与验证

3.1 静态页面测试

访问​​http://192.168.10.103/​​,应看到Nginx默认静态页面:

复制代码
<h1>静态页面</h1>
<p>这是个静态页面</p>

原理:Nginx直接响应根路径请求,无需经过Tomcat,提升静态资源访问效率。

3.2 负载均衡效果测试

访问​​http://192.168.10.103/index.jsp​​并刷新,页面应在以下内容间交替显示:

关键现象

  1. 首次访问随机分配到某一Tomcat节点
  2. 刷新后请求均匀分发到不同节点
  3. 静态图片(logo.jpg)由Nginx直接提供,加载速度快

3.3 动静分离验证

在JSP页面中,静态图片元素​​<img src="logo.jpg">​​​由Nginx的​​/usr/local/nginx/html/img​​目录直接提供,而JSP动态内容由Tomcat处理,实现了资源处理的分工优化。

四、架构总结

4.1 架构优势
  1. 性能提升:Nginx处理静态资源效率比Tomcat高3-5倍,减少后端压力
  2. 高可用性:多Tomcat节点避免单点故障,Nginx支持平滑重启
  3. 资源优化:Tomcat专注动态逻辑处理,内存/CPU占用更合理
  4. 可扩展性:轻松添加新Tomcat节点,Nginx自动负载均衡
4.2 生产环境优化建议
  1. 安全加固
  • 配置Nginx访问控制,限制非法IP
  • Tomcat关闭默认管理端口(8005)
  • 启用HTTPS(配置ssl_certificate和ssl_certificate_key)
  1. 性能调优
  • Nginx增加worker_processes和worker_connections
  • Tomcat调整JVM参数(-Xms/-Xmx)和连接器参数(maxThreads)
  • 开启Nginx gzip压缩(gzip on; gzip_types text/css text/js)
  1. 监控与告警
  • 部署Prometheus+Grafana监控Nginx和Tomcat状态
  • 配置Zabbix告警规则(如CPU超过80%、Tomcat节点宕机)
  1. 会话一致性
  • 若需要会话保持,可在Nginx配置​ip_hash​策略
  • 或使用Redis实现分布式会话共享

Nginx+Tomcat负载均衡与动静分离的这种架构在电商、资讯类网站中广泛应用,能够有效应对日均百万级访问量的挑战。在实际部署时,建议根据业务规模调整服务器配置与优化参数,确保系统始终保持高性能运行状态。

相关推荐
绝不偷吃2 小时前
FastDFS分布式储存
linux·nginx
没有名字的小羊3 小时前
8.Docker镜像讲解
运维·docker·容器·tomcat
java1234_小锋4 小时前
解释一下NGINX的反向代理和正向代理的区别?
运维·nginx
PanZonghui12 小时前
Centos项目部署之Nginx 的安装与卸载
linux·nginx
你不知道我是谁?14 小时前
负载均衡--常见负载均衡算法
运维·负载均衡
星融元asterfusion14 小时前
基于路径质量的AI负载均衡异常路径检测与恢复策略
人工智能·负载均衡·异常路径
小马爱打代码20 小时前
微服务外联Feign调用:第三方API调用的负载均衡与容灾实战
微服务·架构·负载均衡
charlee441 天前
nginx部署发布Vite项目
nginx·性能优化·https·部署·vite
ye901 天前
银河麒麟V10服务器版 + openGuass + JDK +Tomcat
java·开发语言·tomcat
CRMEB定制开发1 天前
【实战】CRMEB Pro 企业版安装教程(附 Nginx 反向代理配置 + 常见问题解决)
nginx·商城系统·微信商城·crmeb