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

相关推荐
闲云一鹤21 小时前
nginx 快速入门教程 - 写给前端的你
前端·nginx·前端工程化
何中应4 天前
Nginx转发请求错误
前端·后端·nginx
大大水瓶5 天前
Tomcat
java·tomcat
芝士雪豹只抽瑞克五5 天前
Nginx 高性能Web服务器笔记
服务器·nginx
失重外太空啦5 天前
Tomcat
java·服务器·tomcat
屎到临头想搅便5 天前
TOMCAT
java·tomcat
失重外太空啦5 天前
nginx
运维·nginx
大大水瓶5 天前
HAProxy 从入门到实战:负载均衡与流量管理全解析
运维·负载均衡
微风起皱5 天前
企业级WEB应用服务器TOMCAT
java·前端·tomcat