Nginx + Tomcat 整合实战(五):性能优化与缓存策略

张开发
2026/4/6 19:07:36 15 分钟阅读

分享文章

Nginx + Tomcat 整合实战(五):性能优化与缓存策略
系列导读本篇将深入讲解 Nginx Tomcat 架构的性能优化策略包括静态资源优化、缓存配置、JVM 调优、连接池优化等核心技能。文章目录前言性能优化的重要性一、静态资源优化1.1 动静分离原理1.2 Nginx 静态资源配置1.3 静态资源压缩1.4 预压缩文件二、Nginx 缓存策略2.1 浏览器缓存2.2 代理缓存2.3 FastCGI 缓存PHP 应用2.4 缓存清理三、Tomcat 性能调优3.1 Connector 配置优化3.2 线程池配置3.3 APR/Native 配置3.4 连接器选择四、JVM 内存优化4.1 JVM 内存模型4.2 JVM 参数配置4.3 内存配置建议4.4 GC 日志分析五、数据库连接池优化5.1 HikariCP 配置推荐5.2 Druid 配置5.3 连接池大小计算六、综合性能测试6.1 测试工具6.2 压测脚本6.3 性能指标6.4 监控工具总结前言性能优化的重要性未经优化的 Nginx Tomcat 架构往往存在以下性能瓶颈 静态资源由 Tomcat 处理性能浪费 无缓存机制重复请求消耗资源 JVM 内存配置不当频繁 GC 连接池配置不合理连接等待 数据库查询慢响应时间长优化效果对比指标优化前优化后提升QPS500500010x响应时间500ms50ms10xCPU 利用率90%40%节省 50%内存使用4GB1.5GB节省 62%一、静态资源优化1.1 动静分离原理┌─────────────────────────────────────────────────────────────┐ │ 客户端请求 │ └─────────────────────────┬───────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Nginx (80) │ │ ┌─────────────────────┐ ┌─────────────────────────────┐ │ │ │ 静态资源处理 │ │ 动态请求转发 │ │ │ │ .css/.js/.jpg │ │ proxy_pass → Tomcat │ │ │ │ 性能提升 10x │ │ 专注业务逻辑 │ │ │ └─────────────────────┘ └─────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘1.2 Nginx 静态资源配置server { listen 80; server_name static.example.com; # 静态资源根目录 root /opt/tomcat/current/webapps/ROOT; # 图片资源 location ~* \.(jpg|jpeg|png|gif|ico|webp|svg)$ { expires 1y; # 缓存 1 年 add_header Cache-Control public, immutable; access_log off; # 不记录日志 # 开启文件缓存 open_file_cache max10000 inactive30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; } # CSS/JS location ~* \.(css|js)$ { expires 30d; # 缓存 30 天 add_header Cache-Control public; access_log off; # Gzip 压缩 gzip_static on; # 使用预压缩文件 } # 字体文件 location ~* \.(woff|woff2|ttf|otf|eot)$ { expires 1y; add_header Cache-Control public, immutable; add_header Access-Control-Allow-Origin *; access_log off; } # 媒体文件 location ~* \.(mp4|webm|mp3|ogg|wav)$ { expires 30d; add_header Cache-Control public; # 限速可选 limit_rate 1m; # 限制下载速度 1MB/s } }1.3 静态资源压缩http { # Gzip 压缩配置 gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 5; # 压缩级别 1-9 gzip_min_length 1024; # 大于 1KB 才压缩 gzip_buffers 16 8k; gzip_http_version 1.1; # 压缩类型 gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/xml application/xmlrss application/json application/x-font-ttf image/svgxml; # 禁用压缩IE6 gzip_disable msie6; }1.4 预压缩文件# 生成预压缩文件find/opt/tomcat/current/webapps/ROOT-typef\(-name*.css-o-name*.js\)-execgzip-k{}\;# Nginx 配置使用预压缩location ~*\.(css|js)${gzip_static on;# 优先使用 .gz 文件expires 30d;}二、Nginx 缓存策略2.1 浏览器缓存server { # 缓存控制策略 # 不缓存的资源 location ~* \.(html|jsp|do|action)$ { expires -1; add_header Cache-Control no-cache, no-store, must-revalidate; add_header Pragma no-cache; } # 短期缓存 location ~* \.(json|xml)$ { expires 5m; add_header Cache-Control public, max-age300; } # 长期缓存带版本号/哈希的静态资源 location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ { expires 1y; add_header Cache-Control public, immutable; } }2.2 代理缓存# 缓存路径配置 proxy_cache_path /var/cache/nginx/api levels1:2 # 目录层级 keys_zoneapi_cache:100m # 缓存区名称和大小 max_size10g # 最大缓存大小 inactive60m # 不活跃删除时间 use_temp_pathoff; # 不使用临时目录 server { listen 80; server_name api.example.com; # API 缓存 location /api/products { proxy_pass http://tomcat_backend; # 启用缓存 proxy_cache api_cache; # 缓存键 proxy_cache_key $scheme$request_method$host$request_uri; # 缓存有效期 proxy_cache_valid 200 10m; # 成功响应缓存 10 分钟 proxy_cache_valid 404 1m; # 404 缓存 1 分钟 proxy_cache_valid any 5s; # 其他响应缓存 5 秒 # 添加缓存状态头 add_header X-Cache-Status $upstream_cache_status; # 后端不可用时使用过期缓存 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 缓存锁防止缓存击穿 proxy_cache_lock on; proxy_cache_lock_timeout 5s; # 不缓存的请求 proxy_cache_bypass $http_pragma $http_authorization; } # 不缓存动态接口 location /api/user { proxy_pass http://tomcat_backend; proxy_cache off; # 禁用缓存 } }2.3 FastCGI 缓存PHP 应用fastcgi_cache_path /var/cache/nginx/fastcgi levels1:2 keys_zonefastcgi_cache:50m max_size5g inactive30m use_temp_pathoff; server { location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # FastCGI 缓存 fastcgi_cache fastcgi_cache; fastcgi_cache_key $scheme$request_method$host$request_uri; fastcgi_cache_valid 200 10m; add_header X-FastCGI-Cache $upstream_cache_status; } }2.4 缓存清理# 手动清理缓存端点 location /purge_cache { allow 127.0.0.1; deny all; # 需要 ngx_cache_purge 模块 proxy_cache_purge api_cache $scheme$request_method$host$request_uri; }# 定时清理脚本# crontab -e03* * *find/var/cache/nginx-typef-mtime7-delete三、Tomcat 性能调优3.1 Connector 配置优化!-- Tomcat conf/server.xml --Connectorport8080protocolorg.apache.coyote.http11.Http11NioProtocol!--线程配置--maxThreads500!-- 最大线程数 --minSpareThreads50!-- 最小空闲线程 --maxSpareThreads200!-- 最大空闲线程 --acceptCount200!-- 等待队列长度 --!-- 连接配置 --connectionTimeout20000!-- 连接超时 --keepAliveTimeout60000!-- 长连接超时 --maxKeepAliveRequests100!-- 长连接最大请求数 --!-- 性能优化 --enableLookupsfalse!-- 禁用 DNS 反查 --disableUploadTimeouttrue URIEncodingUTF-8!-- 压缩配置 --compressionon compressionMinSize2048 compressibleMimeTypetext/html,text/xml,text/css,application/json,application/javascript!-- NIO 配置 --pollerThreadCount2!-- 轮询线程数 --selectorTimeout1000!-- 选择器超时 --/3.2 线程池配置!-- 自定义线程池 --ExecutornametomcatThreadPoolnamePrefixtomcat-http-maxThreads500minSpareThreads50maxIdleTime60000maxQueueSize100/!-- Connector 使用线程池 --ConnectorexecutortomcatThreadPoolport8080protocolHTTP/1.1.../3.3 APR/Native 配置# 安装 APRsudoyuminstall-yapr apr-devel apr-util apr-util-devel# 或sudoaptinstall-ylibapr1 libapr1-dev# 安装 Tomcat Nativecd/opt/tomcat/current/bintar-xzftomcat-native.tar.gzcdtomcat-native-*/native ./configure --with-apr/usr/bin/apr-1-configmakemakeinstall# 配置环境变量exportLD_LIBRARY_PATH$LD_LIBRARY_PATH:/usr/local/apr/lib!-- 使用 APR Connector --Connectorport8080protocolorg.apache.coyote.http11.Http11AprProtocol.../3.4 连接器选择连接器说明适用场景BIO阻塞 I/O已废弃不推荐NIO非阻塞 I/O通用场景推荐APR本地库性能最佳高性能场景NIO2异步 I/O高并发场景四、JVM 内存优化4.1 JVM 内存模型┌─────────────────────────────────────────────────────────────┐ │ JVM 内存 │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 堆内存 (Heap) │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ 新生代 │ │ 老年代 │ │ 元空间 │ │ │ │ │ │ (Young) │ │ (Old) │ │ (Metaspace)│ │ │ │ │ │ EdenS0S1 │ │ │ │ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 非堆内存 (Non-Heap) │ │ │ │ 线程栈、直接内存、代码缓存等 │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘4.2 JVM 参数配置# Tomcat bin/setenv.sh#!/bin/bash# 内存配置 # 堆内存根据服务器内存调整建议不超过物理内存的 50%JAVA_OPTS-Xms2g -Xmx2g# 新生代大小堆内存的 1/3 到 1/4JAVA_OPTS$JAVA_OPTS-Xmn512m# 元空间大小JDK 8JAVA_OPTS$JAVA_OPTS-XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m# GC 配置 # 使用 G1 垃圾收集器JDK 9 默认JDK 8 推荐JAVA_OPTS$JAVA_OPTS-XX:UseG1GC# G1 配置JAVA_OPTS$JAVA_OPTS-XX:MaxGCPauseMillis200# 最大 GC 停顿时间JAVA_OPTS$JAVA_OPTS-XX:G1HeapRegionSize16m# Region 大小JAVA_OPTS$JAVA_OPTS-XX:InitiatingHeapOccupancyPercent45# 触发并发 GC 的堆占用率# 或使用 Parallel GC吞吐量优先# JAVA_OPTS$JAVA_OPTS -XX:UseParallelGC -XX:ParallelGCThreads4# GC 日志 JAVA_OPTS$JAVA_OPTS-Xlog:gc*:file/opt/tomcat/logs/gc.log:time,uptime:filecount5,filesize10m# 性能优化 # 字符串去重JAVA_OPTS$JAVA_OPTS-XX:UseStringDeduplication# 压缩指针JAVA_OPTS$JAVA_OPTS-XX:UseCompressedOops# 大页内存可选# JAVA_OPTS$JAVA_OPTS -XX:UseLargePages# 故障诊断 # OOM 时生成堆转储JAVA_OPTS$JAVA_OPTS-XX:HeapDumpOnOutOfMemoryErrorJAVA_OPTS$JAVA_OPTS-XX:HeapDumpPath/opt/tomcat/logs/heapdump.hprof# 发生 OOM 时执行脚本JAVA_OPTS$JAVA_OPTS-XX:OnOutOfMemoryError/opt/tomcat/bin/restart.sh# 远程调试开发环境# JAVA_OPTS$JAVA_OPTS -agentlib:jdwptransportdt_socket,servery,suspendn,address5005# JMX 监控 JAVA_OPTS$JAVA_OPTS-Dcom.sun.management.jmxremoteJAVA_OPTS$JAVA_OPTS-Dcom.sun.management.jmxremote.port9010JAVA_OPTS$JAVA_OPTS-Dcom.sun.management.jmxremote.authenticatefalseJAVA_OPTS$JAVA_OPTS-Dcom.sun.management.jmxremote.sslfalseexportJAVA_OPTS4.3 内存配置建议服务器内存堆内存新生代元空间4GB2GB512MB128MB8GB4GB1GB256MB16GB8GB2GB256MB32GB16GB4GB512MB4.4 GC 日志分析# 查看 GC 日志tail-f/opt/tomcat/logs/gc.log# 使用 GCViewer 分析# https://github.com/chewiebug/GCViewer# 使用 GCEasy 在线分析# https://gceasy.io/五、数据库连接池优化5.1 HikariCP 配置推荐# application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://192.168.1.100:3306/mydb?useSSLfalseserverTimezoneAsia/Shanghaiusername:rootpassword:yourpasswordhikari:# 连接池大小maximum-pool-size:20# 最大连接数minimum-idle:5# 最小空闲连接# 超时配置connection-timeout:30000# 连接超时毫秒idle-timeout:600000# 空闲超时毫秒max-lifetime:1800000# 连接最大生命周期毫秒# 连接测试validation-timeout:5000# 验证超时leak-detection-threshold:60000# 连接泄露检测# 性能优化pool-name:TomcatHikariPool5.2 Druid 配置# application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://192.168.1.100:3306/mydbusername:rootpassword:yourpasswordtype:com.alibaba.druid.pool.DruidDataSourcedruid:# 连接池配置initial-size:5min-idle:5max-active:20max-wait:60000# 连接检测validation-query:SELECT 1test-while-idle:truetest-on-borrow:falsetest-on-return:false# 监控配置stat-view-servlet:enabled:trueurl-pattern:/druid/*login-username:adminlogin-password:admin# 慢查询监控filter:stat:enabled:trueslow-sql-millis:3000log-slow-sql:true5.3 连接池大小计算连接数 (核心数 * 2) 有效磁盘数 示例 4 核 CPU 1 块磁盘 (4 * 2) 1 9 个连接 建议范围10-20 个连接六、综合性能测试6.1 测试工具# 安装 Apache Benchsudoyuminstall-yhttpd-tools# CentOSsudoaptinstall-yapache2-utils# Ubuntu# 安装 wrkgitclone https://github.com/wg/wrk.gitcdwrkmakesudocpwrk /usr/local/bin/6.2 压测脚本#!/bin/bash# performance_test.shURLhttp://app.example.com/api/productsCONCURRENT(50100200500)REQUESTS10000echo 性能测试开始 echo目标 URL:$URLecho总请求数:$REQUESTSechoforcin${CONCURRENT[]};doecho---------- 并发数:$c----------ab-n$REQUESTS-c$c$URLechosleep5doneecho 性能测试结束 6.3 性能指标指标说明优化目标QPS每秒请求数越高越好响应时间请求处理时间 100ms并发数同时处理请求数越高越好错误率失败请求比例 0.1%CPU 使用率CPU 占用 70%内存使用率内存占用 80%6.4 监控工具# 系统监控top-p$(pgrepjava)# 监控 Java 进程vmstat1# 内存统计iostat1# I/O 统计netstat-anp|grep8080# 网络连接# JVM 监控jstat-gcutilpid1000# GC 统计jmap-heappid# 堆内存信息jstackpid# 线程栈# 可视化工具# JConsole、VisualVM、Arthas总结本文深入讲解了 Nginx Tomcat 架构的性能优化策略✅静态资源优化动静分离、压缩、缓存✅Nginx 缓存浏览器缓存、代理缓存、缓存清理✅Tomcat 调优Connector 配置、线程池、APR✅JVM 优化内存配置、GC 调优、监控✅连接池优化HikariCP、Druid 配置✅性能测试压测工具、监控指标优化检查清单□ 静态资源由 Nginx 处理 □ Gzip 压缩已启用 □ 浏览器缓存已配置 □ 代理缓存已配置适用场景 □ Tomcat Connector 已优化 □ JVM 内存已合理配置 □ GC 策略已选择 □ 数据库连接池已优化 □ 性能测试已完成 □ 监控已部署下一篇预告(Nginx Tomcat 整合实战六安全加固与生产部署)将深入讲解 HTTPS 配置、安全防护、日志监控、自动化部署等核心技能。作者刘~浪地球系列Nginx Tomcat 整合实战五更新时间2026-04-01

更多文章