在阿里云、腾讯云或者自建机房部署 Java 后台服务,核心组件其实就那几样,但细节决定成败。别整那些虚的,直接上干货,按“必装”、“推荐”和“可选”三个层级来拆解。
一、 绝对刚需(没有这些跑不起来)
-
JDK (Java Development Kit)
- 版本选择:现在主流是 JDK 8 和 JDK 17/21(LTS 长期支持版)。如果是老项目,大概率还是 JDK 8;新项目建议直接上 JDK 17+,性能更好,垃圾回收机制更先进。
- 注意:生产环境通常只装 JRE 即可,但为了方便排查问题(看线程 dump、heap dump),很多运维习惯装全量 JDK。
- 厂商建议:如果你用阿里云 ECS 或腾讯云的 Linux 镜像,可以直接用
yum install java-1.8.0-openjdk这种包管理器安装,省心。如果想用特定版本(比如 Oracle JDK 或 Amazon Corretto),需要手动下载 tar.gz 解压并配置JAVA_HOME环境变量。
-
进程守护工具 (Supervisor / Systemd)
- Java 应用是个黑盒,挂了没人知道。必须有个东西盯着它,自动重启。
- Systemd:CentOS 7+ 和 Ubuntu 16.04+ 的标准做法。写一个
.service文件,设置Restart=always。这是最稳定的方式,不用额外装软件。 - Supervisor:如果你需要管理多个小应用,或者喜欢 Web 界面监控状态,Supervisor 很好用。配置简单,日志切割也方便。
- PM2:虽然 PM2 主要是 Node.js 用的,但它也能跑 Java(通过
pm2 start app.jar),对于微服务架构里快速启停很有用,但不如 Systemd 原生稳定。
-
Web 服务器 / 反向XX (Nginx / Apache)
- Java 应用(Spring Boot/Tomcat)直接暴露端口给公网是不安全的,而且处理静态资源能力弱。
- Nginx:行业标准。负责 SSL 终止(HTTPS)、负载均衡、静态资源缓存、限流。Java 应用只监听本地回环地址(127.0.0.1),Nginx 做反向XX转发请求。
- 不要直接用 Tomcat 对外:除非是内部测试环境,否则生产环境务必加一层 Nginx。
二、 强烈建议安装(提升稳定性和可维护性)
-
日志收集与监控 Agent
- Prometheus + Node Exporter:监控服务器 CPU、内存、磁盘 IO。Java 应用本身可以暴露 Actuator 指标。
- Filebeat / Fluent Bit:把 Java 应用的日志(logback/log4j 输出的文件)实时采集到 Elasticsearch 或 Logstash,方便搜索和告警。
- 云厂商方案:如果用阿里云,直接装“云监控插件”和“SLS 日志服务 Agent”,一键配置,比自建便宜又省事。
-
安全组 & 防火墙 (iptables/firewalld)
- 不是让你去手写规则,而是确保只开放必要端口。
- 默认只开 22(SSH)、80/443(HTTP/HTTPS)。Java 应用端口(如 8080)绝对不要对 0.0.0.0 开放,只在 Nginx 和本地通信。
-
字体库 (fonts-common)
- 很多人踩坑:Java 应用在生成 PDF、图片验证码、图表时,因为 Linux 系统缺少中文字体而报错或显示方块。
- 操作:
yum install fontconfig然后拷贝 Windows 的中文字体(如 SimSun.ttf, MicrosoftYaHei.ttf)到/usr/share/fonts/目录,刷新缓存fc-cache -fv。这一步经常被忽略,导致线上诡异 Bug。
三、 根据业务场景可选
-
数据库客户端工具
- 如果应用需要直连数据库,服务器上最好装个轻量级的 JDBC 驱动或命令行客户端(如
mysql-client),方便运维人员紧急排查连接问题。
- 如果应用需要直连数据库,服务器上最好装个轻量级的 JDBC 驱动或命令行客户端(如
-
定时任务调度 (Quartz / XXL-JOB Admin)
- 如果你的 Java 应用里有大量定时任务,建议把调度中心独立出来(比如部署 XXL-JOB Admin),避免应用重启导致任务丢失。如果只是简单 cron,Linux 自带的 crontab 就够了。
-
容器化运行时 (Docker / Kubernetes)
- 现在主流趋势是 Docker。即使你不搞 K8s,至少也用 Docker 打包部署。好处是环境隔离,避免“在我机器上是好的”这种扯皮事。
- 安装 Docker CE,配置好国内镜像源(阿里/网易提速),然后用 docker-compose 管理依赖(MySQL、Redis、App 一起启动)。
四、 避坑指南(血泪经验)
- 时区问题:Linux 服务器默认可能是 UTC 时间,而你的业务逻辑依赖北京时间。务必执行
timedatectl set-timezone Asia/Shanghai,并在 JVM 启动参数中加上-Duser.timezone=GMT+8,双重保险。 - 文件描述符限制:高并发下,Linux 默认的 1024 个文件句柄不够用。修改
/etc/security/limits.conf,设置nofile为 65535 或更高,否则会出现 “Too many open files” 错误。 - Swap 分区:对于 Java 应用,建议关闭 Swap 或将其优先级调低。因为 Swap 会导致 GC 停顿时间变长,影响响应延迟。可以在
/etc/fstab中注释掉 swap 行,然后swapoff -a。
总结清单(最小可用集)
| 组件 | 作用 | 备注 |
|---|---|---|
| JDK 8/17 | 运行环境 | LTS 版本优先 |
| Nginx | 反向XX + HTTPS | 保护后端,处理静态资源 |
| Systemd/Supervisor | 进程守护 | 保证应用挂掉后自动重启 |
| Fontconfig + 中文字体 | 图形渲染 | 防乱码,PDF/图片生成必备 |
| 云监控/SLS Agent | 日志与监控 | 便于故障排查 |
按照这个清单配,你的 Java 服务就能稳稳当当跑起来了。具体细节可以根据你用的云平台(阿里云 ACK、腾讯云 TKE 等)进一步简化,因为很多基础组件他们帮你封装好了。
云技术博客