Tomcat 和 Nginx 的区别是什么?何时选择 Tomcat?何时选择 Nginx?
- Tomcat:Java 应用服务器,支持 Servlet/JSP,适合处理动态请求。
- Nginx:高性能 Web 服务器 / 反向代理,适合静态资源和高并发连接。
如何优化 Tomcat 性能?
- 调整 JVM 参数(堆内存、GC 策略)。
一、JVM 参数优化 堆内存配置 设置初始堆(-Xms)与最大堆(-Xmx)相同值,避免动态扩容开销(如 -Xms4g -Xmx4g) 年轻代大小设为堆的1/3(如 -Xmn2G),配置 Eden/Survivor 比例(-XX:SurvivorRatio=8) 元空间设置:Java 8+ 使用 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m 垃圾回收策略 低延迟场景启用 G1 GC:-XX:+UseG1GC -XX:MaxGCPauseMillis=200 高吞吐场景用并行 GC:-XX:+UseParallelGC -XX:ParallelGCThreads=[CPU核心数]
- 优化 Connector 线程池参数。
Connector 线程池优化(server.xml配置) <Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol" maxThreads="800" <!-- 建议值=CPU核心数×200 --> minSpareThreads="100" <!-- 核心空闲线程数 --> acceptCount="500" <!-- 等待队列长度 --> connectionTimeout="20000" disableUploadTimeout="true" <!-- 防上传阻塞 --> enableLookups="false" <!-- 禁用DNS查询 --> compression="on" <!-- GZIP压缩 --> compressionMinSize="2048" /> 关键参数说明: maxThreads:最大并发处理线程数,需根据压测调整 acceptCount:当线程耗尽时,请求队列的容纳能力 NIO/NIO2 协议比 BIO 提升50%+吞吐量
- 使用 APR 连接器替代 BIO/NIO。
优势 基于操作系统原生库(Apache Portable Runtime),网络I/O性能提升30%-50%12 直接使用本地Socket缓冲,减少JVM堆内存压力 启用步骤 <!-- server.xml 配置 --> <Connector protocol="org.apache.coyote.http11.Http11AprProtocol" SSLEnabled="true" /> 系统级准备: 安装APR库:sudo apt install libtcnative-1 添加Tomcat依赖:$CATALINA_HOME/bin/ 放置 tcnative-1.dll(Win)或.so(Linux)
优化项 预期性能提升 适用场景 JVM堆调优 减少20-50% GC停顿 内存敏感型应用 NIO2线程池优化 30-60%并发提升 高并发短连接请求 APR连接器 40-70% I/O加速 大文件传输/持续流式数据
Nginx 如何实现高可用?
- 主备模式(Keepalived + VIP)。
一、主备模式(Keepalived + VIP) 通过 Keepalived 实现故障自动切换,确保 Nginx 服务高可用: 1.架构组成 主节点(Master):绑定虚拟 IP(VIP),处理所有流量 备节点(Backup):实时监控主节点状态,主节点故障时接管 VIP 虚拟 IP(VIP):客户端统一访问的入口 IP,主备切换时 IP 漂移 2.核心配置(Keepalived) # 主节点配置(/etc/keepalived/keepalived.conf) vrrp_instance VI_1 { state MASTER # 主节点标识 interface eth0 # 网卡名称 virtual_router_id 51 # 集群路由 ID(主备需一致) priority 100 # 优先级(主>备) advert_int 1 # 心跳检测间隔(秒) authentication { # 认证机制 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 虚拟 IP 配置 192.168.1.100/24 } track_script { # 绑定 Nginx 健康检查脚本 chk_nginx } }
- 多级负载均衡(Nginx → 后端 Nginx → Tomcat)。
适用于超大规模集群,提升横向扩展能力: 1.架构分层 graph LR A[客户端] --> B[L4 负载均衡器] B --> C[一级 Nginx] C --> D[二级 Nginx] D --> E[Tomcat 集群] 第一级:Nginx 作为入口层,通过 upstream 分发到二级 Nginx # 一级 Nginx 配置 upstream backend_nginx { server 192.168.2.10:80 weight=3; # 权重分配 server 192.168.2.11:80; keepalive 32; # 长连接复用 } server { listen 80; location / { proxy_pass http://backend_nginx; } } 第二级:Nginx 作为业务层,转发至 Tomcat 应用集群 # 二级 Nginx 配置 upstream tomcat_app { server 192.168.3.20:8080 max_fails=3 fail_timeout=30s; server 192.168.3.21:8080; } server { listen 80; location /api { proxy_pass http://tomcat_app; } }
Nginx 负载均衡有哪些算法?适用场景是什么?
- 轮询(默认):均匀分配请求。
- IP 哈希:保证同一客户端请求到固定后端。
- least_conn:适用于长连接场景(如数据库)。
如何排查 Tomcat 内存泄漏问题?
- 使用
jmap
生成堆转储文件。- 通过 MAT(Memory Analyzer Tool)分析对象引用链。
- 检查静态集合、未关闭的资源(如数据库连接)。