我们将以最常见的 Linux (CentOS/Ubuntu) + Java Web 应用 (以 Spring Boot 为例) 为场景进行讲解。

目录
- 第一步:准备工作
- 1 获取服务器
- 2 连接服务器
- 3 更新系统
- 第二步:安装 Java 环境
- 1 检查系统自带的 Java
- 2 安装 OpenJDK (推荐)
- 3 验证 Java 安装
- 第三步:部署 Java 应用
- 1 准备应用包
- 2 上传应用包到服务器
- 3 创建应用目录
- 4 解压并配置应用
- 第四步:配置运行方式
- 1 直接运行 (适合临时测试)
- 2 使用
systemd(推荐,生产环境标准) - 3 使用
nohup(简单后台运行)
- 第五步:配置反向代理
- 1 安装 Nginx
- 2 配置 Nginx
- 3 启动并测试 Nginx
- 第六步:防火墙与安全组
- 1 配置 Linux 防火墙 (
firewalld/ufw) - 2 配置云服务器安全组
- 1 配置 Linux 防火墙 (
- 第七步:日志管理与监控
- 1 查看和管理日志
- 2 使用
top/htop监控进程 - 3 设置日志轮转
- 第八步:进阶主题
- 1 使用 Docker 部署 (现代推荐方式)
- 2 使用 Jenkins 实现自动化部署
第一步:准备工作
1 获取服务器
你可以选择:
- 云服务器: 阿里云、腾讯云、华为云、AWS、Google Cloud 等,它们提供预装的 Linux 系统(如 CentOS 7/8, Ubuntu 20.04/22.04),开箱即用。
- 本地物理机/虚拟机: 如果你有一台闲置的电脑,可以安装 VMware, VirtualBox 等虚拟化软件,然后在里面安装 Linux 系统。
2 连接服务器
使用 SSH (Secure Shell) 客户端连接你的服务器,在 Windows 上,推荐使用 PuTTY 或 Windows Terminal (配合 OpenSSH),在 macOS 或 Linux 上,可以直接使用自带的终端。
# 语法 ssh username@your_server_ip # 示例 (用户名为 root,IP 为 123.45.67.89) ssh root@123.45.67.89
首次连接会提示你确认服务器的指纹,输入 yes 即可,然后输入你的服务器密码。
3 更新系统
为了确保系统软件包是最新且安全的,首先更新系统。

对于 CentOS/RHEL/Fedora:
sudo yum update -y
对于 Ubuntu/Debian:
sudo apt update && sudo apt upgrade -y
第二步:安装 Java 环境
Java 应用需要一个 Java 运行时环境,我们推荐使用开源的 OpenJDK。
1 检查系统自带的 Java
有些系统可能预装了旧版本的 Java,可以先检查一下。
java -version
如果版本过低或不存在,就继续下一步。
2 安装 OpenJDK
对于 CentOS/RHEL/Fedora:
# 安装 OpenJDK 17 (当前 LTS 版本) sudo yum install java-17-openjdk-devel -y # 如果需要其他版本,可以替换 java-17 为 java-11 或 java-21
对于 Ubuntu/Debian:
# 更新包列表 sudo apt update # 安装 OpenJDK 17 sudo apt install openjdk-17-jdk -y # 同样,可以替换为 openjdk-11-jdk 或 openjdk-21-jdk
3 验证 Java 安装
安装完成后,再次检查版本号,确保安装成功。
java -version javac -version # 检查编译器是否也安装了
你应该能看到类似下面的输出:
openjdk version "17.0.8" 2025-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-0ubuntu122.04, mixed mode, sharing)
第三步:部署 Java 应用
假设我们有一个已经打包好的 Spring Boot 应用,它是一个可执行的 JAR 文件 my-app.jar。
1 准备应用包
在本地开发机器上,确保你的项目已经打包成 JAR 或 WAR 文件,对于 Spring Boot,通常是 java -jar your-app.jar 可以直接运行的 JAR。
2 上传应用包到服务器
有多种方式可以将文件从本地上传到服务器:
-
scp(Secure Copy): 简单直接,适合一次性上传。# 语法 scp /local/path/to/my-app.jar username@your_server_ip:/remote/path/ # 示例 scp /Users/yourname/Desktop/my-app.jar root@123.45.67.89:/opt/
-
SFTP/FTP客户端: 如 FileZilla, WinSCP 等,提供图形化界面,方便管理多个文件。 -
rsync: 适合增量同步,当文件较大时更高效。
3 创建应用目录
为了保持服务器整洁,我们为应用创建一个专用的目录。
# 在 /opt 目录下创建一个名为 myapp 的目录 sudo mkdir -p /opt/myapp # 将上传的文件移动到这个目录 sudo mv /opt/my-app.jar /opt/myapp/ # 切换到应用目录 cd /opt/myapp
4 解压并配置应用
如果你的应用是 WAR 包或者需要额外的配置文件(如 application-prod.properties):
# 假设你上传了一个包含配置和JAR的zip包 unzip my-app.zip # 确保应用有执行权限 sudo chmod +x my-app.jar
第四步:配置运行方式
直接在终端运行 java -jar 的话,一旦关闭 SSH 连接,应用就会停止,我们需要让它在后台持续运行。
1 直接运行 (适合临时测试)
这种方式不推荐用于生产环境,仅用于快速验证。
java -jar my-app.jar
你会看到应用的日志输出,按 Ctrl + C 可以停止应用。
2 使用 systemd (推荐,生产环境标准)
systemd 是现代 Linux 系统的初始化系统和服务管理器,我们可以用它来管理我们的 Java 应用,实现开机自启、自动重启、状态检查等功能。
-
创建服务文件:
sudo nano /etc/systemd/system/myapp.service
-
粘贴以下内容 (请根据你的实际情况修改
User,Group,ExecStart等路径):[Unit] Description=My Java Application Service After=network.target [Service] # 运行服务的用户和组,建议创建一个专门的用户,如 'javauser' # User=javauser # Group=javauser # 如果不指定,默认是 root User=root Group=root # Java 命令,注意路径要正确 ExecStart=/usr/bin/java -jar /opt/myapp/my-app.jar # 工作目录 WorkingDirectory=/opt/myapp # 自动重启应用 Restart=on-failure RestartSec=10 # 标准输出和错误输出重定向到日志文件 StandardOutput=file:/var/log/myapp/stdout.log StandardError=file:/var/log/myapp/error.log [Install] WantedBy=multi-user.target
-
重载
systemd并启动服务:# 重新加载 systemd 配置,使其识别新服务 sudo systemctl daemon-reload # 启动服务 sudo systemctl start myapp # 检查服务状态 sudo systemctl status myapp
你应该看到绿色的
active (running)字样。 -
设置开机自启:
sudo systemctl enable myapp
-
常用管理命令:
# 停止服务 sudo systemctl stop myapp # 重启服务 sudo systemctl restart myapp # 查看实时日志 sudo journalctl -u myapp -f
3 使用 nohup (简单后台运行)
如果你不想用 systemd,nohup 是一个简单的替代方案,它能让进程在用户退出后继续运行。
# nohup 表示忽略挂断信号 # & 表示在后台运行 # > myapp.log 表示将标准输出重定向到 myapp.log 文件 # 2>&1 表示将标准错误也重定向到标准输出 nohup java -jar my-app.jar > myapp.log 2>&1 &
这种方式简单,但不如 systemd 功能强大(如无法自动重启、难以管理状态)。
第五步:配置反向代理
Java Web 应用通常运行在内置的 Web 服务器上(如 Tomcat, Netty),端口不直接暴露给外网。反向代理(如 Nginx)负责接收外部的 HTTP/HTTPS 请求,然后转发给后端的 Java 应用。
1 安装 Nginx
对于 CentOS/RHEL:
sudo yum install nginx -y
对于 Ubuntu/Debian:
sudo apt install nginx -y
2 配置 Nginx
-
创建站点配置文件:
sudo nano /etc/nginx/conf.d/myapp.conf
-
粘贴以下内容 (假设你的 Spring Boot 应用运行在 8080 端口):
server { listen 80; # 监听 80 端口,HTTP server_name your_domain.com; # 替换成你的域名或服务器IP location / { # 将请求转发到后端 Java 应用 proxy_pass http://127.0.0.1:8080; # 设置一些常用的代理头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
3 启动并测试 Nginx
-
检查 Nginx 配置语法:
sudo nginx -t
如果显示
syntax is ok和test is successful,则配置正确。 -
启动 Nginx:
sudo systemctl start nginx sudo systemctl enable nginx # 设置开机自启
-
访问测试: 在浏览器中输入
http://your_server_ip或http://your_domain.com,如果能看到你的 Java 应用页面,说明反向代理配置成功。
第六步:防火墙与安全组
为了保护服务器,需要开放必要的端口,并关闭其他不必要的端口。
1 配置 Linux 防火墙 (firewalld/ufw)
对于 CentOS/RHEL (使用 firewalld):
# 开放 80 (HTTP) 和 443 (HTTPS) 端口 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 重新加载防火墙使配置生效 sudo firewall-cmd --reload
对于 Ubuntu/Debian (使用 ufw):
# 默认拒绝所有传入连接 sudo ufw default deny incoming # 开放 22 (SSH), 80 (HTTP), 443 (HTTPS) 端口 sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 启用防火墙 sudo ufw enable # 输入 'y' 确认
2 配置云服务器安全组
如果你使用的是云服务器,还需要在云服务商的控制台(如阿里云ECS、腾讯云CVM)的安全组设置中,添加入站规则,开放 22 (SSH), 80 (HTTP), 443 (HTTPS) 端口,这层防火墙是虚拟的,但同样重要。
第七步:日志管理与监控
1 查看和管理日志
-
应用日志: 如果你用了
systemd,日志可以通过journalctl查看:sudo journalctl -u myapp -f # 实时查看 sudo journalctl -u myapp --since "10 minutes ago" # 查看最近10分钟的日志
如果你用了
nohup,日志就在你指定的myapp.log文件里,可以用tail -f myapp.log查看。 -
Nginx 日志:
# 访问日志 sudo tail -f /var/log/nginx/access.log # 错误日志 sudo tail -f /var/log/nginx/error.log
2 使用 top/htop 监控进程
top: Linux 自带的任务管理器。top
按
q退出,查看java进程的 CPU 和内存占用。htop:top的增强版,更直观,如果系统没有,可以安装 (sudo yum install htop或sudo apt install htop)。
3 设置日志轮转
日志文件会越来越大,需要定期清理和归档。logrotate 是 Linux 下标准的日志轮转工具。
-
创建配置文件:
sudo nano /etc/logrotate.d/myapp
-
:
/var/log/myapp/*.log { daily # 每天轮转 missingok # 如果日志文件不存在,不报错 rotate 7 # 保留7天的日志 compress # 轮转后进行压缩 delaycompress # 延迟一天压缩,方便排查问题 notifempty # 如果日志为空,不轮转 copytruncate # 复制日志文件后清空原文件,而不是移动,避免应用写入失败 }logrotate通常由cron每天自动执行。
第八步:进阶主题
1 使用 Docker 部署 (现代推荐方式)
使用 Docker 可以将 Java 应用及其所有依赖(包括特定版本的 Java)打包到一个轻量级、可移植的容器中,这解决了“在我机器上能跑”的问题。
基本步骤:
-
在项目根目录创建
Dockerfile:# 使用官方的 OpenJDK 17 镜像作为基础镜像 FROM openjdk:17-jre-slim # 设置工作目录 WORKDIR /app # 将本地的 JAR 文件复制到容器的工作目录 COPY target/my-app.jar app.jar # 暴露应用运行的端口 (8080) EXPOSE 8080 # 定义容器启动时执行的命令 ENTRYPOINT ["java", "-jar", "app.jar"]
-
构建 Docker 镜像:
docker build -t my-app-image .
-
运行 Docker 容器:
# -d: 后台运行 # -p: 将主机的 80 端口映射到容器的 8080 端口 # --name: 给容器起个名字 docker run -d -p 80:8080 --name my-app-container my-app-image
Docker 部署更专业、更易于管理,是当前的主流趋势。
2 使用 Jenkins 实现自动化部署
对于持续集成/持续部署,可以使用 Jenkins 这样的自动化工具,流程如下:
- 开发者将代码推送到 Git 仓库(如 GitHub, GitLab)。
- Jenkins 监听到代码变更。
- Jenkins 自动拉取最新代码,执行
mvn clean package(或gradle build) 进行编译打包。 - 打包成功后,Jenkins 通过 SSH 或其他方式,将生成的 JAR 文件上传到服务器,并执行部署脚本(如
systemctl restart myapp)。 - 发送部署结果通知。
这大大减少了手动部署的繁琐和出错概率。
部署一个 Java 服务器应用是一个多步骤的过程,但遵循以上指南,你可以从零开始,搭建一个稳定、安全、可维护的生产环境。
核心流程回顾:
- 准备: 获取服务器,连接并更新系统。
- 环境: 安装正确版本的 Java。
- 部署: 上传应用包到指定目录。
- 运行: 使用
systemd管理应用,实现后台、自启、自恢复。 - 代理: 使用 Nginx 作为反向代理,处理外部请求并转发。
- 安全: 配置防火墙和安全组,只开放必要端口。
- 维护: 通过日志和系统工具监控应用运行状态。
希望这份详细的指南对你有帮助!
