在 Linux 服务器上部署 Java 程序,需根据应用类型(如 Spring Boot、传统 WAR、微服务等)和部署方式(JAR、Docker、Systemd、Tomcat 等)略有差异,但以下是最核心、通用的基础环境与依赖清单,按推荐顺序组织:
✅ 一、必备基础环境(必须安装)
| 组件 | 说明 | 推荐版本/注意事项 |
|---|---|---|
| JDK(Java Development Kit) | 运行 Java 应用的核心运行时环境(注意:JRE 已不推荐单独使用,生产环境建议用 JDK,便于调试、JFR、JMX、线程 dump 等) | • Spring Boot 3.x+:JDK 17 或 JDK 21(LTS) • Spring Boot 2.7.x 及更早:JDK 8/11(JDK 8 已 EOL,不建议新项目使用) • ✅ 推荐 OpenJDK(如 Eclipse Temurin 或 Amazon Corretto),免费、稳定、长期支持 |
| Linux 基础工具 | 保障运维与诊断能力 | • curl / wget(下载依赖/健康检查)• unzip / tar(解压包)• ps, top, htop, netstat / ss(进程/端口监控)• lsof(查看文件/端口占用)• journalctl(日志查看,配合 systemd) |
✅ 二、常见可选但强烈推荐的依赖(提升稳定性、可观测性与运维效率)
| 类别 | 组件 | 说明 | 推荐场景 |
|---|---|---|---|
| 系统服务管理 | systemd(默认已存在) |
用于将 Java 应用作为系统服务托管(自动启动、崩溃重启、日志集成) | ✅ 所有生产部署(替代 nohup & screen) |
| 反向X_X & 负载均衡 | nginx 或 Apache HTTPD |
• 提供 HTTPS 终止、静态资源服务、负载均衡、访问控制、防 DDOS • 避免直接暴露 Java 应用端口(如 8080) |
Web 应用(尤其对外服务)、多实例部署 |
| 安全加固 | ufw(Ubuntu)或 firewalld(RHEL/CentOS) |
配置防火墙规则,仅开放必要端口(如 443/80/22,禁止开放 8080/8009 等内部端口) | ✅ 所有公网服务器(安全基线要求) |
| 日志管理 | rsyslog / logrotate |
• logrotate:自动轮转 Java 应用日志(避免磁盘爆满)• 可对接 ELK / Loki / Grafana 进行集中日志分析 |
生产环境必备(尤其高流量应用) |
| 监控与诊断 | jstat, jstack, jmap, jcmd(JDK 自带)+ 可选: Prometheus + JMX Exporter 或 Micrometer |
JVM 性能监控(GC、内存、线程)、堆转储分析、远程 JMX(需安全配置) | 中大型应用、需性能调优或 SLA 保障的系统 |
✅ 三、按部署方式补充的关键依赖
| 部署方式 | 额外依赖 | 说明 |
|---|---|---|
| WAR 包 + Tomcat/Jetty | tomcat9(或 tomcat10,注意 Jakarta EE 兼容性) |
• Spring Boot 3+ 默认使用 Jakarta EE 9+,需 Tomcat 10+ • Tomcat 9 仅支持 Java EE 8(对应 Spring Boot 2.7) • ✅ 建议优先使用 Spring Boot 内嵌容器(jar 直接运行),简化部署 |
| Docker 容器化 | docker-ce + containerd |
• 使用官方 OpenJDK 基础镜像(如 eclipse-temurin:17-jre-jammy)• 配合 Docker Compose / Kubernetes 编排 • ✅ 推荐现代云原生部署方式 |
| 数据库连接 | 对应 JDBC 驱动(通常打包在应用中) | • 如 MySQL → mysql-connector-j(8.0+)• PostgreSQL → postgresql driver• ⚠️ 无需在系统级安装数据库客户端(除非需要手动调试),驱动由应用自带即可 |
| 消息中间件(如 Kafka/RabbitMQ) | 客户端库(应用内含)+ 服务端(独立部署) | • 客户端代码依赖已内置,无需系统安装 • 服务端需单独部署(如 Kafka 集群、RabbitMQ Server) |
⚠️ 四、重要注意事项(避坑指南)
-
不要安装 Oracle JDK(商业版)
→ 免费使用受限(自 JDK 17 起需付费商用),推荐 Eclipse Temurin / Corretto / Zulu(全免费、LTS、企业级支持)。 -
环境变量规范设置
# /etc/profile.d/java.sh (全局生效) export JAVA_HOME=/opt/java/jdk-17.0.1+12 export PATH=$JAVA_HOME/bin:$PATH✅ 验证:
java -version&&echo $JAVA_HOME -
用户隔离与权限最小化
→ 创建专用非 root 用户(如appuser)运行 Java 进程,禁止以 root 启动应用(安全合规要求)。 -
时区与编码统一
sudo timedatectl set-timezone Asia/Shanghai echo 'export LANG=en_US.UTF-8' | sudo tee -a /etc/environment -
JVM 启动参数建议(生产示例)
java -Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -jar myapp.jar --spring.profiles.active=prod
✅ 五、一键检查清单(部署前执行)
# 1. JDK 版本与路径
java -version && echo $JAVA_HOME
# 2. 端口是否被占用(如 8080)
ss -tuln | grep ':8080'
# 3. 防火墙状态
sudo ufw status verbose # Ubuntu
# 或
sudo firewall-cmd --state # RHEL
# 4. 检查可用内存与磁盘
free -h && df -h
# 5. 验证 systemd 服务模板(如 /etc/systemd/system/myapp.service)
📌 总结一句话:
生产环境最低要求 = OpenJDK 17/21 + systemd + logrotate + ufw/firewalld;推荐增强 = nginx(HTTPS)+ Prometheus/JMX(监控)+ Docker(标准化)+ 专用非 root 用户。
如需,我可为你提供:
- ✅ 完整的
systemd服务配置模板(含 JVM 参数、日志重定向、重启策略) - ✅ Nginx 反向X_X + HTTPS(Let’s Encrypt)配置示例
- ✅ Spring Boot 应用 Dockerfile 最佳实践
- ✅ JVM 参数调优速查表(按内存大小/场景)
欢迎告知你的具体技术栈(如 Spring Boot 版本、是否用数据库/Redis/Kafka、是否容器化),我可以给出定制化部署方案 👇
ECLOUD博客