一、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 配置
在<host>元素中添加<context>配置,将站点路径指向 /web/webapp1:
<context docbase="/web/webapp1" path="" reloadable="true"/>
重启 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
,用于动静分离场景。
关键配置参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 错误或超时,则认为服务器故障,自动跳过(故障恢复后重新加入)。
- 配置参数:
upstream tomcat_server { server 192.168.10.101:8080 max_fails=2 fail_timeout=30s; }
max_fails
:允许失败次数(默认 1 次)。fail_timeout
:故障超时时间(默认 10 秒,期间不再转发请求)。
主动检查(第三方模块)
- 使用
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 与 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 错误。
解决方案
修正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 地址。
常见原因
- nginx 配置未重新加载:修改
nginx.conf
后需执行nginx -s reload
使配置生效。 - 后端服务器故障:某台 tomcat 未启动或端口被占用,nginx 自动将其从负载均衡组中剔除。
八、扩展与高可用架构
(一)增加 tomcat 节点
步骤说明
新增 tomcat 服务器(如 192.168.10.104),重复 “tomcat2 服务器配置” 步骤,确保 jdk 和 tomcat 版本一致,站点目录和测试页面配置正确。
修改 nginx 的upstream
配置,添加新节点:
upstream 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 重新加载配置,确保新版本应用生效。
prometheus+grafana 监控
采集指标:
- nginx:请求量、错误率、响应时间(通过
stub_status
模块)。 - tomcat:线程池状态、内存使用、jsp 编译耗时(通过 jmx 接口)。
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 格式日志)。
维护阶段
- 定期备份 nginx 和 tomcat 配置文件(如
nginx.conf
、server.xml
)。 - 制定应急预案,包含节点故障切换、数据恢复等流程,定期进行容灾演练。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论