先说结论:生产环境别用 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 在这里扮演三个关键角色:
- 反向XX与负载均衡:Java 应用通常水平扩展多个实例。Nginx 负责把流量分发到后端多个 JVM 进程,实现负载均衡。
- 静态资源分离:图片、CSS、JS 这些静态文件,让 Nginx 直接处理,比经过 JVM 处理快几个数量级,也节省宝贵的 JVM 内存和 CPU。
- 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. 实战部署最佳实践(避坑指南)
- 不要 root 运行:创建专用用户(如
appuser)运行 Java 进程,防止权限滥用。 - JVM 参数调优:
-Xms和-Xmx设为相同值,避免 GC 时动态扩容带来的抖动。- 使用 ZGC 或 G1 GC。例如:
-XX:+UseZGC -XX:MaxGCPauseMillis=200 - 设置合理的 Metaspace 大小。
- 日志管理:
- 不要用
System.out.println打日志。 - 使用 Logback/Log4j2,配置 RollingFileAppender,按天或大小滚动。
- 日志文件定期清理或使用 ELK/Loki 收集。
- 不要用
- 健康检查:
- Spring Boot Actuator 暴露
/actuator/health。 - 在 Nginx 或 SLB 中配置健康检查,确保流量只打到正常运行的实例。
- Spring Boot Actuator 暴露
- 备份与恢复:
- 定期快照 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 也完全没问题。关键是匹配你的业务规模和维护能力。
云技术博客