目录
简介
在现代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,http://www.test1.com"(来自Tomcat1)
- "动态页面2,http://www.test2.com"(来自Tomcat2)
关键现象:
- 首次访问随机分配到某一Tomcat节点
- 刷新后请求均匀分发到不同节点
- 静态图片(logo.jpg)由Nginx直接提供,加载速度快
3.3 动静分离验证
在JSP页面中,静态图片元素<img src="logo.jpg">
由Nginx的/usr/local/nginx/html/img
目录直接提供,而JSP动态内容由Tomcat处理,实现了资源处理的分工优化。
四、架构总结
4.1 架构优势
- 性能提升:Nginx处理静态资源效率比Tomcat高3-5倍,减少后端压力
- 高可用性:多Tomcat节点避免单点故障,Nginx支持平滑重启
- 资源优化:Tomcat专注动态逻辑处理,内存/CPU占用更合理
- 可扩展性:轻松添加新Tomcat节点,Nginx自动负载均衡
4.2 生产环境优化建议
- 安全加固:
- 配置Nginx访问控制,限制非法IP
- Tomcat关闭默认管理端口(8005)
- 启用HTTPS(配置ssl_certificate和ssl_certificate_key)
- 性能调优:
- Nginx增加worker_processes和worker_connections
- Tomcat调整JVM参数(-Xms/-Xmx)和连接器参数(maxThreads)
- 开启Nginx gzip压缩(gzip on; gzip_types text/css text/js)
- 监控与告警:
- 部署Prometheus+Grafana监控Nginx和Tomcat状态
- 配置Zabbix告警规则(如CPU超过80%、Tomcat节点宕机)
- 会话一致性:
- 若需要会话保持,可在Nginx配置
ip_hash
策略 - 或使用Redis实现分布式会话共享
Nginx+Tomcat负载均衡与动静分离的这种架构在电商、资讯类网站中广泛应用,能够有效应对日均百万级访问量的挑战。在实际部署时,建议根据业务规模调整服务器配置与优化参数,确保系统始终保持高性能运行状态。