努力
加油

Tomcat或Spring Boot项目推荐使用哪种服务器环境?

先说结论:生产环境别用 Tomcat 自带的默认配置,也别用裸奔的 Linux。

推荐的标准架构是:Nginx + (Tomcat 或 Spring Boot 内嵌容器) + JDK 17/21。

为什么这么选?咱们拆开揉碎了说,不整虚的。

1. 核心组件的选择:Spring Boot vs 传统 Tomcat

现在新项目,95% 以上直接上 Spring Boot。

  • Spring Boot(内嵌 Tomcat/Jetty/Undertow):

    • 优势:单体应用部署最简单,一个 jar 包搞定,自带监控端点(Actuator),启动快,运维成本低。对于绝大多数互联网业务,性能完全够用。
    • 场景:微服务中的普通业务节点、中小型系统、快速迭代的项目。
    • 注意:Spring Boot 默认用的是 Tomcat,但你可以通过 pom.xml 切换成 Undertow(非阻塞 IO,适合高并发 I/O 密集型)或 Jetty。除非你有极致的低延迟需求且团队有调优能力,否则默认 Tomcat 足够稳。
  • 独立安装的 Tomcat:

    • 现状:老项目维护、遗留系统迁移、或者需要利用 Tomcat 某些特定功能(如特定的安全模块、JNDI 资源绑定等)。
    • 劣势:版本管理麻烦,升级容易出坑,与 Spring MVC 耦合度不如 Boot 灵活。
    • 建议:如果是新开发,除非特殊历史原因,否则优先选 Spring Boot。

2. 为什么必须加 Nginx?

很多新手觉得:“我 Java 进程不是能直接监听 80 端口吗?” 可以,但不建议。

Nginx 在这里扮演三个关键角色:

  1. 反向XX与负载均衡:Java 应用通常水平扩展多个实例。Nginx 负责把流量分发到后端多个 JVM 进程,实现负载均衡。
  2. 静态资源分离:图片、CSS、JS 这些静态文件,让 Nginx 直接处理,比经过 JVM 处理快几个数量级,也节省宝贵的 JVM 内存和 CPU。
  3. SSL/TLS 终结:HTTPS 握手计算量大,放在 Nginx 层卸载 SSL,后端 Java 应用只处理 HTTP,降低 JVM 负担。

合规与安全提示:在国内云环境下,Nginx 还能帮你做简单的 IP 黑白名单、防 CC 攻击基础防护,配合 WAF(Web 应用防火墙)使用效果更佳。

3. 操作系统与运行环境:Linux 是底线

绝对不要用 Windows Server 做生产环境的 Java 服务器。

  • 稳定性:Linux(CentOS Stream, Ubuntu LTS, Debian, Alibaba Cloud Linux)在长期运行、内存管理、文件系统上的表现远优于 Windows。
  • 生态:Docker、Kubernetes、各类中间件对 Linux 的支持是第一梯队的。
  • 成本:Linux 免费,Windows Server 授权费贵,且占用更多资源。

推荐发行版:

  • Alibaba Cloud Linux:阿里自研,兼容 CentOS/RHEL,针对阿里云 ECS 做了内核优化,性价比极高(尤其在你用阿里云时)。
  • Ubuntu LTS:社区活跃,文档多,适合喜欢折腾新技术的团队。
  • Debian Stable:极度稳定,适合保守派。

4. JDK 版本选择:拥抱 LTS

别再问 JDK 8 还是 11 了,那是 2018 年的问题。

  • 当前推荐:JDK 17 或 JDK 21。
    • JDK 17:目前主流企业级 LTS 版本,GC 算法成熟(G1/ZGC),性能比 8 提升显著,代码简洁性改善。
    • JDK 21:最新 LTS,引入了虚拟线程(Virtual Threads),对于高并发 I/O 场景(如大量 HTTP 调用、数据库连接池)有质的飞跃,但需注意第三方库兼容性。
  • 为什么不用 JDK 8?
    • 虽然老项目还在跑 8,但新特性缺失,GC 效率较低,且 Oracle 已停止免费更新。新项目从第一天起就站在巨人肩膀上。

5. 云服务器选型建议(国内视角)

如果你是在国内公有云上部署:

  • ECS 类型:
    • 通用型 g7/g8:适合大多数 Web 应用,CPU/内存比例 1:4 或 1:8。
    • 计算增强型 c7/c8:如果业务是纯 CPU 密集型(如复杂加密、视频转码预处理),选这个。
    • 内存增强型 r7/r8:如果应用重度依赖堆内存(大对象、缓存),选这个。
  • 网络:
    • 务必开启 公网带宽 或搭配 SLB/CLB(负载均衡)。
    • 启用 安全组,只开放必要端口(80, 443, SSH 等),禁止 0.0.0.0/0 开放所有端口。
  • 存储:
    • 系统盘和数据盘分开。日志不要写系统盘,会很快占满导致宕机。使用 ESSD 云盘,IOPS 高,延迟低。

6. 实战部署最佳实践(避坑指南)

  1. 不要 root 运行:创建专用用户(如 appuser)运行 Java 进程,防止权限滥用。
  2. JVM 参数调优:
    • -Xms 和 -Xmx 设为相同值,避免 GC 时动态扩容带来的抖动。
    • 使用 ZGC 或 G1 GC。例如:-XX:+UseZGC -XX:MaxGCPauseMillis=200
    • 设置合理的 Metaspace 大小。
  3. 日志管理:
    • 不要用 System.out.println 打日志。
    • 使用 Logback/Log4j2,配置 RollingFileAppender,按天或大小滚动。
    • 日志文件定期清理或使用 ELK/Loki 收集。
  4. 健康检查:
    • Spring Boot Actuator 暴露 /actuator/health。
    • 在 Nginx 或 SLB 中配置健康检查,确保流量只打到正常运行的实例。
  5. 备份与恢复:
    • 定期快照 ECS 实例。
    • 配置文件(application.yml)、密钥(Keystore)、证书(PEM)不要硬编码在代码里,用环境变量或配置中心(Nacos/Apollo)管理。

总结

组件 推荐方案 理由
应用框架 Spring Boot (内嵌 Tomcat) 开发效率高,生态完善,开箱即用
前端网关 Nginx 静态资源处理、SSL 卸载、负载均衡
操作系统 Alibaba Cloud Linux / Ubuntu LTS 稳定、免费、云原生友好
JDK 版本 JDK 17 或 21 长支持周期,性能优越,现代特性
部署方式 Docker + Kubernetes (可选) 标准化交付,易于扩缩容

最后提醒一句:没有银弹。如果你的项目是超大型分布式系统,可能需要考虑更复杂的 Service Mesh 或 Serverless 架构;如果是小型内部工具,单机 Nginx + Spring Boot 也完全没问题。关键是匹配你的业务规模和维护能力。