后续:部署笔记之云服务器再部署一个新项目

一、前言

方案:轻量云服务器(Linux版)

这是最主流、最灵活的选择。你可以把它理解为一台你可以远程控制的、放在云端的数据中心的电脑。http://远程服务器IP:端口号

云服务器(ECS):功能全面的 “专业级服务器”,面向企业、中大型项目或有复杂配置需求的开发者。
轻量云服务器:简化配置的 “入门级服务器”,面向个人开发者、学生、小型项目,主打 “易上手、低成本”。

(1)适用人群

新手开发者,想学习完整的部署流程。
项目有一定规模,需要稳定的运行环境和一定的自定义配置。
前后端都需要自己掌控,希望数据和服务都在自己的 “服务器” 上。

(2)推荐平台

国内:阿里云 ECS、腾讯云 CVM、华为云 ECS。新手推荐 轻量应用服务器,预装了常见环境,部署更简单。
国外:DigitalOcean Droplet, Vultr, Linode。

(3)部署架构方案

Spring Boot 前后端分离项目的部署步骤:「前端静态资源托管 + 后端服务启动 + Nginx 反向代理转发

使用的架构

  • 「本地服务」:Nginx、Node.js(NVM 管理)、Java、Redis 都装在 Linux 服务器宿主机(不是 Docker容器),端口直接占用宿主机的端口(Nginx 默认 80,Redis默认 6379)。
  • 「Docker 服务」:MySQL 装在 Docker 容器里,默认处于 Docker自己的隔离网络中(和宿主机是两个独立的「网络环境」)。

为什么MySQL单独使用Docker安装?
因为MySQL 8.0 社区版依赖 GLIBC 2.34,但Alibaba Cloud Linux 系统默认搭载的是 GLIBC 2.32(这是阿里云操作系统的基础配置,用于保障稳定性)。版本不兼容导致服务器本地安装MySQL 8.0 失败除非将版本降到MySQL5.7(兼容当前系统,它对 GLIBC 版本要求更低,兼容 GLIBC 2.32)本地才能安装,所以为了安装MySQL8.0单独使用了Docker安装(隔离依赖)。

其他架构方案:
这篇环境安装部分使用Docker(MySQL)安装,其他环境安装参考我之前写过的文章。

(4)优点 / 缺点

完全控制:你对服务器有 root 权限,可以安装任何软件,进行任何配置。
灵活扩展:随着项目增长,可以随时升级服务器的 CPU、内存和带宽。
学习价值高:能让你完整地了解 Web 服务的部署和运维流程。

需要一定运维知识:你需要自己管理服务器,包括安全更新、环境配置、问题排查等。
成本相对较高:即使是最低配的服务器,也需要每月或每年支付一定费用。

(5) 部署步骤

阿里云 ECS 部署步骤如下(以 Vue + Nginx + Node.js + MySQL + Java + Redis + Windows 操作系统 + 阿里云Linux远程轻量应用服务器 技术栈为例,使用前后端分离项目),新手可按以下流程一步步操作。

二、购买与初始化 Linux 系统云服务器

1、购买 ECS 实例

登录阿里云控制台 → 进入「云服务器 ECS」→ 「创建实例」。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、轻量级实例配置

在这里插入图片描述

(1)选择实例的规格

①物理核心

通常情况下,2 vCPU 相当于 1 个物理核心。
这是因为云服务器厂商(如阿里云、腾讯云)在配置轻量应用服务器时,普遍采用了 CPU 超线程技术:1 个物理核心会被虚拟成 2 个逻辑核心(即 2 vCPU)。

②1 核 2G

以上面的阿里云轻量应用服务器为例,“1 核 2G” 套餐的实际物理配置是 1 个物理核心 + 超线程技术,因此在系统中会被识别为 2 vCPU。这种配置能在一定程度上提升多任务处理效率,是性价比很高的入门选择。

③内存

内存直接决定服务器能同时运行多少程序、处理多少请求。
在这里插入图片描述
如果前后端分离项目包含 Nginx与Redis等,1GiB内存会严重不足:

仅 Nginx(约 50-100MB)+ Redis(默认配置约 100-200MB)+ 操作系统基础进程(约 200-300MB),就会占用 400-600MB 内存。

再加上后端服务(如 Node.js/Java,约 100-300MB)+ 数据库(如 MySQL,约 200-400MB),总内存占用会轻松突破 1GiB(1024MB),会导致:

  • 服务器频繁 “杀进程”(系统优先关闭内存占用高的服务,比如 Redis 或后端),服务随机崩溃;
  • 访问量稍增(比如同时 10 + 用户访问),就会出现卡顿、接口超时,甚至无法打开页面;
  • 无法启动额外进程(如 PM2 管理后端、日志收集工具),运维和调试会很痛苦。
④网络配置

第一个一年99,第二个一年459,区别就在于网络配置选择:
在这里插入图片描述
在这里插入图片描述

第一个配置:专有网络(默认专有网络 + 默认交换机)
第二个配置:包含 BGP 公网带宽 + 1 个 IPv4 公网地址(还明确了带宽峰值 200Mbps、不限流量)

  • 如果是用于内网业务(比如内部服务器、仅集群内通信):第一个专有网络的配置更合适,专有网络安全性更高,也能避免公网带宽的额外成本。
  • 如果是用于搭建对外服务(比如网站、API 接口):第二个配置更好,因为它自带 BGP 公网带宽和 IPv4公网地址,能直接被外网访问,200Mbps 带宽也能支撑一定的访问量。

简单说:需要外网访问选第二个,仅内网用选第一个。

仅用内网(专有网络)的话,其他人没法通过域名访问你的网站。
因为域名需要解析到公网 IP,而内网服务器没有公网 IP,只能在你自己的内部网络(比如公司局域网、同专有网络下的其他服务器)里访问,外网用户(比如普通网民)是连不上的。
如果想让所有人通过域名访问网站,必须给服务器配公网 IP + 公网带宽(像第二个配置里的 BGP 公网带宽 + IPv4 公网地址),这样域名解析到公网 IP 后,外网才能访问到。

(2)选择实例的镜像

针对不同场景的推荐:

①Linux 镜像(推荐,适合绝大多数后端 / 前端项目)
  • Alibaba Cloud Linux(默认推荐)

优势:阿里云自研的操作系统,对阿里云服务器兼容性最佳,性能优化到位,安全性高,官方维护更新及时。

适用场景:所有基于 Linux 的项目(如 Nginx + Node.js/Java/Python 后端、Docker 部署等),尤其是长期使用阿里云生态的用户。

  • CentOS

优势:社区生态成熟,文档和教程丰富,稳定性强,是服务器领域的 “老牌选手”。

适用场景:传统 LAMP/LNMP 架构项目(如 WordPress、PHP 网站),需要兼容老旧软件或依赖的场景。

  • Ubuntu

优势:对新技术(如 Docker、K8s)支持更前沿,包管理工具 apt 操作便捷,适合技术探索和开发环境。

适用场景:容器化部署(Docker)、DevOps 工具链(如 Jenkins、GitLab)、需要频繁更新软件版本的项目。

②Windows 镜像(仅适合特定场景)

优势:适合 .NET 技术栈项目(如 ASP.NET 网站),或需要图形化界面操作的用户。

适用场景:开发 .NET 应用、部署 Windows 专属软件(如 SQL Server)。

注意:Windows 服务器内存占用更高,相同配置下性能不如 Linux,且授权成本较高,非必要不建议选。

③选择建议

新手 / 通用项目:优先选 Alibaba Cloud Linux,阿里云生态适配最好,出问题容易排查。

需要丰富教程支持:选 CentOS,网上资料多,遇到问题能快速找到解决方案。

玩新技术 / 容器化:选 Ubuntu,对 Docker、K8s 等工具支持更友好。

.NET 技术栈:选 Windows,否则一律选 Linux 镜像(性能和成本更优)。

如果是部署前后端分离项目(如 Java+ Nginx),直接选 Alibaba Cloud Linux 即可,它是阿里云的 “亲儿子” 系统,后续安装环境、配置服务都会更顺畅。

(3)选择实例的地域

①优先靠近目标用户:

若你的网站 / 应用主要面向国内用户,选华东(杭州)、华东(上海)、华北(北京)、华南(深圳)等核心地域,这些区域网络覆盖广、延迟低;若面向海外用户,可选中国香港、新加坡、东京等地域。

②同云服务商生态协同:

若你已使用阿里云的其他产品(如 OSS 对象存储、CDN),建议选同一地域,可减少跨地域数据传输成本和延迟。

(4)实例购买后配置服务器

登录方式:设置管理员密码(用于远程桌面登录)。
购买后,记录实例的「公网 IP」(如 47.xxx.xxx.xxx)。
在这里插入图片描述

3、远程连接Linux服务器(SSH 连接为例)

在这里插入图片描述
最简单就是:Workbench 一键连接 远程服务器。

(1)用本地Windows连接Linux(Alibaba Cloud Linux)服务器

如果使用Linux 系统的 SSH 连接方式。
在这里插入图片描述

  1. 打开 本地电脑的Windows 终端 / 命令提示符 / PowerShell按下Win+R,输入cmd(命令提示符)或powershell(PowerShell),回车打开终端。
  2. 执行 SSH 命令连接在终端中输入以下命令:
ssh root@公网IP

在这里插入图片描述

这是 SSH 连接时的首次身份验证提示,原因是你的本地电脑是第一次连接这个服务器,还没有记录该服务器的身份密钥。
你只需输入 yes 并回车,之后会提示你输入服务器的登录密码(输入时不会显示字符,输完回车即可)。这是 SSH 的安全机制,用于防止你连接到伪造的服务器。

注意密码的大小写。
在这里插入图片描述

简单来说,已成功连接到阿里云服务器,并且服务器提示有安全更新需要处理,同时显示了一些登录尝试的历史记录。

(2)假设本地是Windows连接Windows远程服务器

使用Windows 远程桌面(RDP)连接选项。

本地电脑(Windows):按下 Win + R,输入 mstsc 打开「远程桌面连接」。
输入 ECS 公网 IP → 点击「连接」→ 输入用户名(默认 root)和设置的密码,登录服务器。

如果需要,首次登录后,关闭服务器自带防火墙(或放行 80、443、3306、3000 端口):
控制面板 → 系统和安全 → Windows Defender 防火墙 → 关闭防火墙(生产环境可按需配置入站规则)。

三、安装基础环境(Nginx + Node.js + NVM + Java + MySQL + Redis)

在当前的操作环境中,是以 root 用户登录的(命令行提示符是 [root@…])。root 用户是系统的超级管理员,拥有最高权限,因此执行命令时不需要以 sudo 开头,可以直接运行需要管理员权限的命令。
如果是普通用户登录,执行需要管理员权限的操作时需要在命令前加 sudo

1、安装 Nginx(Web 服务器,托管前端静态文件 + 反向代理)

(1)执行命令安装Nginx

dnf install nginx -y

在这里插入图片描述

(2)为什么安装命令使用dnf不使用yum

# 安装Nginx
yum install -y nginx

yum install -y nginx 和 dnf install nginx -y 都是用于安装 Nginx 的命令,核心功能一致(自动确认安装 Nginx 及其依赖),但两者的区别主要在于使用的包管理工具不同:

  • 包管理工具的差异

yum(Yellowdog Updater Modified)是传统的 RPM 包管理工具,最早用于 RedHat、CentOS 等系统,在 CentOS 7 及更早版本中是默认工具。
dnf(Dandified YUM)是 yum 的继任者,设计上解决了 yum 的一些缺陷(如性能、依赖解析效率等),在 CentOS 8+、RHEL 8+、Fedora 22+ 等系统中成为默认包管理工具。

  • 兼容性与使用场景

yum 在较旧的系统(如 CentOS 7)中是主要工具,部分新系统(如 CentOS 8)中 yum 通常是 dnf 的别名(兼容旧命令)。
dnf 是新一代工具,推荐在支持它的系统(如 CentOS 8/9、RHEL 8+、Fedora)中使用,效率更高。

  • 命令参数的顺序两者的参数 -y(自动确认)位置不同

yum 中习惯将 -y 放在包名前(yum install -y 包名)。
dnf 中参数顺序更灵活,-y 可放在包名后(dnf install 包名 -y),也可放在前面,不影响功能。

  • 总结

两者本质是同一类工具的新旧版本,功能一致,选择哪个取决于系统默认的包管理工具(旧系统用 yum,新系统推荐 dnf)。

确定阿里云 Linux 服务器的默认包管理工具,可通过以下步骤判断:

①方法一

从成功登录阿里云远程服务器的截图中看到,系统提示使用 dnf upgrade-minimal --security 来应用更新,这说明该服务器默认的包管理工具是 dnf。
在这里插入图片描述

②方法二

也可以通过执行命令 dnf --version 来进一步确认 dnf 的版本信息,以此验证系统对 dnf 的支持情况。
在这里插入图片描述

(3)启动Nginx并设置开机自启

# 启动 Nginx 服务,使 Nginx 开始对外提供网页服务
systemctl start nginx
# 设置开机自动启动
systemctl enable nginx

在这里插入图片描述
从输出的 Created symlink… 可以看出,系统已成功为 Nginx 服务创建了开机自启的 “符号链接”(类似 Windows 快捷方式),说明配置生效。

(4)验证安装

浏览器访问http://你的公网IP,若看到 Nginx 默认页面,说明安装成功。
在这里插入图片描述

2、安装 Java(或多版本)

Spring Boot 运行需要 JDK,以安装 OpenJDK 1.8 为例。

(1)安装 OpenJDK 1.8 :

# 安装OpenJDK 1.8 
dnf install java-1.8.0-openjdk-devel -y

(2)检查是否已安装 JDK

# 检查是否已安装 JDK
java -version

在这里插入图片描述
服务器已经装好了 Java 8 版本的 OpenJDK 环境,可以正常运行 Spring Boot(或其他 Java 后端项目)了。

(3)如果部署新项目需要Java17

服务器上同时安装 Java 8 和 Java 17,给不同项目指定对应的 Java 版本(互不影响),具体操作如下:

  • 步骤 1:安装 Java 17(和 Java 8 共存)
    先在服务器上安装 Java 17(以 CentOS/RHEL 为例):
# 安装Java 17
yum install -y java-17-openjdk java-17-openjdk-devel

# 查看已安装的Java版本(会显示1.8和17的目录)
ls /usr/lib/jvm/
# 示例输出:java-1.8.0-openjdk-xxx  java-17-openjdk-xxx

在这里插入图片描述

  • 步骤 2:修改my-project6.service,指定用 Java 17 启动
    编辑服务配置文件,给新项目my-project6单独指定 Java 17 的绝对路径(不影响其他用 Java 8 的项目):
vim /etc/systemd/system/my-project6.service

在[Service]段中,把ExecStart里的/usr/bin/java改成 Java 17 的绝对路径(替换成你实际的 Java 17 目录,比如/usr/lib/jvm/java-17-openjdk-17.0.10.0.7-1.el7.x86_64/bin/java):
xxx是占位符,需替换为服务器上 Java 17 目录的真实名称;

[Service]
# 关键:指定Java 17的绝对路径,其他项目仍用默认的Java 8
ExecStart=/usr/lib/jvm/java-17-openjdk-xxx/bin/java -jar /www/my-project6/backend/main-0.0.1-SNAPSHOT.jar
# (其他配置保持不变)

在这里插入图片描述
从ExecStart路径区分(服务配置里)
①如果你想让项目用Java 17启动:ExecStart里写/usr/lib/jvm/java-17-openjdk-17.0.17.0.10-1.0.2.1.al8.x86_64/bin/java(你现在配置的就是这个,没问题)。
②如果你想让项目用Java 1.8启动:ExecStart里写/usr/lib/jvm/java-1.8.0-openjdk-1.8.0_462.b08-2.0.1.1.al8.x86_64/bin/java。

  • 步骤 3:重新加载配置并重启服务
# 重新加载systemd配置
systemctl daemon-reload

# 重启新项目服务
systemctl restart my-project6

# 查看状态(应该显示active (running))
systemctl status my-project6

操作后:

  • 新项目(my-project6)用 Java 17 启动;
  • 其他项目仍用默认的 Java 8,互不干扰。

3、安装 MySQL(关系型数据库,存储项目数据)

以安装 MySQL 8.0 为例:

(1)失败原因:因GLIBC 版本导致安装 MySQL 8.0失败

MySQL 8.0 社区版依赖 GLIBC 2.34,但Alibaba Cloud Linux 系统默认搭载的是 GLIBC 2.32(这是阿里云操作系统的基础配置,用于保障稳定性)。版本不兼容导致安装失败。

# 添加 MySQL 源
dnf install https://repo.mysql.com/mysql80-community-release-el9-3.noarch.rpm -y
# 安装 MySQL 服务器
dnf install mysql-community-server -y

在这里插入图片描述
在这里插入图片描述

(2)解决方案:通过 Docker 安装 MySQL 8.0(隔离依赖)

如果必须使用 MySQL 8.0,可通过 Docker 容器隔离依赖环境(避免修改系统 GLIBC,更安全)。

步骤如下:

  • 1)安装 Docker:
# 安装 Docker 官方版本
dnf install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 阿里云镜像源(国内提速)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker 引擎
dnf install -y docker-ce docker-ce-cli containerd.io
# 启动并设置 Docker 开机自启
systemctl start docker
systemctl enable docker

# 验证 Docker 是否安装成功
docker --version
systemctl status docker

如果输出 Docker 版本信息且服务状态为 active (running),则说明安装成功。
在这里插入图片描述
会进入 systemctl status 的分页查看模式(类似 less 命令的交互界面)。

  • 2)拉取并运行 MySQL 8.0 容器:
docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=你的密码 mysql:8.0

发现报错:
在这里插入图片描述
显示 Docker 拉取镜像时连接官方仓库超时了,可以通过配置国内镜像加速器来解决。

  • 3)配置国内镜像加速器:

步骤 1:创建 Docker 配置文件
执行命令创建并编辑 Docker 的守护进程配置文件:

cat > /etc/docker/daemon.json << 'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "insecure-registries": [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ]
}
EOF

在这里插入图片描述

步骤 2:重启 Docker 服务
使配置生效:

systemctl daemon-reload
systemctl restart docker

步骤 3:重新拉取 MySQL 镜像
再次执行拉取命令,此时会通过国内镜像源加速下载:

docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

这样配置后,Docker 会优先从国内镜像源拉取镜像,避免因国际网络延迟导致的超时问题。
在这里插入图片描述

  • 4)验证连接MySQL:

注意:服务器目前本地没有安装 MySQL 客户端工具,只有 Docker 容器里的 MySQL 服务。要连接容器里的 MySQL,而不是直接执行客户端运行MySQL的命令:

# 如果是安装的客户端MySQL(错误)
mysql -h localhost -P 3306 -uroot -p

# 通过Docker进入 MySQL 容器的命令行,输入密码(设置的 123456)后即可进入 MySQL 交互界面(正确)
docker exec -it mysql8 mysql -uroot -p

# 退出 MySQL 回到 Bash 终端
exit;

在这里插入图片描述
从执行结果来看,Docker 内的 MySQL 服务是正常的(能成功登录并进入 MySQL 命令行)。

4、安装 Redis(缓存数据库)

(1)安装 Redis

dnf install redis -y

(2)启动并设置开机自启

systemctl start redis
systemctl enable redis

(3)验证安装

执行redis-cli ping,若返回PONG,说明安装成功。
在这里插入图片描述

5、安装 Node.js(未用到)

推荐安装长期支持版(LTS),以保证稳定性:

(1)安装 Node.js18 和 NPM

①云服务器本地不能直接安装nodejs18

系统的默认软件源中没有提供 nodejs:18 这个模块流。

dnf module enable nodejs:18 -y

在这里插入图片描述

②执行命令查看系统中可支持的 Node.js 版本
dnf module list nodejs

当前系统仅支持 nodejs:13 和 nodejs:16-epel 这两个模块流,没有 nodejs:18。

③ 通过 Nodesource 仓库安装 Node.js 18

由于系统默认源缺少对应模块,建议通过第三方仓库(Nodesource)安装:

  • 1)安装依赖工具
# 安装依赖工具
dnf install -y curl gnupg2

在这里插入图片描述
系统中已经安装了 curl 和 gnupg2 这两个软件包,所以执行 dnf install -y curl gnupg2 时,系统会提示 “无操作(Nothing to do)”,最终安装流程完成。

  • 2)添加 Nodesource 仓库
# 添加 Nodesource 仓库
curl -sL https://rpm.nodesource.com/setup_18.x | bash -

在这里插入图片描述
简单来说,这段输出是在提醒你 “Node.js 18.x 版本已过时,但仍可继续安装”,同时完成了安装前的仓库配置,接下来只需执行对应的 dnf install 命令就能完成 Node.js 18.x 的安装。

  • 3)安装 Node.js 18
# 安装 Node.js 18
dnf install -y nodejs

在这里插入图片描述

(2)验证安装

执行以下命令查看版本,确认安装成功:

node -v
npm -v

在这里插入图片描述

6、安装 NVM或者使用 Docker(未用到)

如果需要为不同项目切换不同的 Node.js 版本,可以使用版本管理工具来实现。

NVM(Node Version Manager) 是专门用于管理 Node.js 版本的工具,支持在同一台机器上安装、切换多个 Node 版本。

  • 个人开发推荐 NVM,功能完整且易用。
  • 项目级隔离推荐 Docker(容器化隔离)。

(1)执行命令安装NVM

# 下载并安装 nvm(适用于 Linux/macOS)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

在这里插入图片描述

(2)重新加载终端

# 安装后,重新加载终端配置(或重启终端)
source ~/.bashrc  # 若为 bash,多数 Linux 系统默认是 bash
# 或 source ~/.zshrc  # 若为 zsh

在这里插入图片描述

或关闭并重新打开终端,配置会自动加载。

(3)验证安装

在这里插入图片描述

(4)NVM常用命令

  • 安装指定 Node 版本:
nvm install 18  # 安装 Node 18.x
nvm install 20  # 安装 Node 20.x
  • 切换 Node 版本:
nvm use 18  # 切换到 Node 18.x
nvm use 20  # 切换到 Node 20.x
  • 查看已安装版本:
nvm list

(5)使用 Docker(容器化隔离,未尝试)

如果项目需要完全隔离的环境,可通过 Docker 为每个项目运行不同 Node 版本的容器:

# 运行 Node 18 容器(临时交互环境)
docker run -it node:18 bash

# 运行 Node 20 容器
docker run -it node:20 bash

四、部署项目的前置准备

1、服务器目录规划(规范目录结构)

需要先统一目录结构,避免后续文件混乱,建议在 /www 下创建项目专属目录(以 my-project 为例):

(1)创建项目放置目录

# 1. 创建根目录(若不存在)
mkdir -p /www
chmod -R 755 /www  # 赋予读写执行权限

# 2. 项目子目录:前端、后端、日志分离
mkdir -p /www/my-project/{frontend,backend,logs}
# frontend:存放前端打包后的静态文件
# backend:存放后端 Node.js 源代码
# logs:存放后端日志、Nginx 访问日志(可选)

在这里插入图片描述

(2)查看已建目录

# 查看已建目录
ls -l /www/my-project

在这里插入图片描述

五、部署后端服务(Spring Boot 项目)

后端核心是「启动 Java 服务 + 连接 MySQL/Redis 」,步骤如下:

后端依赖 Java 运行时(JDK) 和 构建工具(Maven/Gradle);
后端启动方式 java -jar(或通过 Systemd 守护进程);

注意:服务器环境如果是Java1.8,打包时不能基于Java17,否则:本地开发用的是 Java 17 打包 JAR 包,但服务器只装了 Java 8,会启动就报错(所以还得安装Java17,参考上面)。

1、在本地开发环境中,用 Maven/Gradle 打包成可执行 JAR 包:

  • Maven 项目:
# 进入后端项目根目录(含 pom.xml)
mvn clean package -DskipTests
# 打包完成后,JAR 包会生成在 target 目录下(如 my-springboot-app-1.0.jar)

在这里插入图片描述

  • Gradle 项目:
# 进入后端项目根目录(含 build.gradle)
gradle clean build -x test
# JAR 包生成在 build/libs 目录下

2、上传 JAR 包到服务器

(1)JAR 包上传到服务器指定目录

打开本地Windows电脑的命令提示符(CMD);
执行以下命令(替换为你本地 JAR 包的实际路径和服务器信息):
将打包好的 JAR 包上传到之前规划的 /www/my-project/backend 目录:

# 本地终端执行(替换为实际 JAR 包路径和服务器信息)
scp /本地路径/target/my-springboot-app-1.0.jar root@服务器IP:/www/my-project/backend/

输入服务器的 root 用户密码,输入后开始传输。
在这里插入图片描述
Spring Boot 后端 JAR 包已经成功上传到服务器,接下来可以按照之前的步骤配置并启动后端服务了。

(2)查看指定目录下是否存在Jar包

# 查看 /www/my-project/backend 目录下的文件
ls -l /www/my-project/backend

在这里插入图片描述

3、初始化 MySQL 数据库

后端启动前需先创建数据库和表结构,把本地数据库sql文件上传至服务器目录并通过docker执行获取表结构与数据:

  • 方式 :本地导出 SQL 文件,上传到服务器后执行:

(1)本地导出 SQL 文件:

在本地 MySQL 客户端(如 Navicat)中,找到项目对应的数据库,执行 “导出 SQL” 操作,得到包含表结构和初始化数据的 .sql 文件。
在这里插入图片描述

(2)上传 SQL 文件到服务器:

打开本地终端(Windows CMD/PowerShell、macOS/Linux 终端),执行:

# 上传本地 SQL 文件到服务器
scp /本地路径/xxx.sql 用户名@服务器IP:/www/my-project/backend/

在这里插入图片描述

(3)在服务器执行 SQL 文件:

因为之前 MySQL 是通过 Docker 容器部署的。

①通过Docker登录MySQL:
docker exec -it mysql8 mysql -uroot -p

输入密码进入mysql后执行show databases; 可以查看到目前只有几个默认的数据库,需要手动新创建所需要的数据库。
在这里插入图片描述

②创建数据库(若不存在):

通过 Docker 执行 MySQL 命令,手动创建数据库:

# 创建数据库(替换为你需要的数据库名,如 test)
CREATE DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 查看新建的数据库
show databases;

# 退出 MySQL 命令行
exit;

在这里插入图片描述

③导入 SQL 文件到数据库

将本地的 SQL 文件上传到服务器后,通过 Docker 执行导入命令:

# 首先确认 /www/my-project/backend/xxx.sql 这个路径在服务器上是否真实存在
ls -l /www/my-project/backend/xxx.sql
#进入 MySQL 容器的交互终端:
docker exec -it mysql8 mysql -uroot -p

#选择数据库:
USE 你的数据库名;

#执行 SQL 文件导入
SOURCE /www/my-project/backend/xxx.sql;

在这里插入图片描述

④解决执行 SQL 文件导入失败

问题的核心原因是 MySQL 容器内部无法访问服务器上的 SQL 文件路径,因为 Docker 容器是一个独立的隔离环境,默认情况下无法直接读取宿主机的文件系统路径。

需要 MySQL 容器能正确访问并导入 SQL 文件,解决 “文件不存在” 的报错。

解决方法:需要将宿主机的 SQL 文件路径挂载到 MySQL 容器内部,或者先将文件复制到容器内部再执行导入。

  • 方法 1:将 SQL 文件复制到 MySQL 容器内部(可行)

先将宿主机的 xxx.sql 文件复制到 MySQL 容器的 /tmp 目录(容器内可写路径):

docker cp /www/my-project/backend/zy.sql mysql8:/tmp/xxx.sql

进入 MySQL 容器的交互终端,导入 SQL 文件:

docker exec -it mysql8 mysql -uroot -p
# 输入密码后,进入 MySQL 命令行
USE xxx;
SOURCE /tmp/xxx.sql;

在这里插入图片描述
脚本正在批量执行插入、更新等操作,且每一步都没有报错,如果数据多的话要等个几分钟。

# 检查数据库表
SHOW TABLES;

在这里插入图片描述

  • 方法 2:通过挂载目录让容器访问宿主机文件(未尝试)

如果需要长期让容器访问宿主机的某个目录,可以在启动 MySQL 容器时挂载目录(需先停止并删除现有容器,再重新启动):

# 停止并删除现有容器
docker stop mysql8
docker rm mysql8

# 重新启动容器并挂载宿主机目录到容器内
docker run --name mysql8 -p 3306:3306 -v /www/my-project/backend:/docker-backend -e MYSQL_ROOT_PASSWORD=你的密码 -d mysql:8.0.44

# 进入容器后导入 SQL 文件
docker exec -it mysql8 mysql -uroot -p
USE xxx;
SOURCE /docker-backend/xxx.sql;

通过以上两种方法,就能让 MySQL 容器正确访问并导入 SQL 文件,解决 “文件不存在” 的报错。

4、针对服务器环境重新配置 application.yml

数据库连接、文件路径、中间件(Redis)这几个和 “本地环境强绑定” 的配置改成服务器环境,项目就能在 ECS 上正常运行。其他如邮件、MyBatis 配置等,若服务器环境和本地一致(如 Redis 本地部署),则可保留。

Spring Boot 通常通过 application.yml 或 application.properties 管理配置,如果需要在服务器上编辑配置文件:如数据库、Redis 等信息:

(1)在后端目录创建配置文件

在 /www/my-project/backend 后端目录下新创建配置 application.yml 文件:

①能一目了然地查看项目所有关键配置,无需在代码中到处找硬编码的参数;
②后续修改配置时(如换数据库、调整 Redis 密码),只需改这一个文件,不用动业务代码,减少误操作风险。

本质是通过 “集中化、标准化、解耦化” 的设计,让 Spring Boot 项目的部署、维护、扩展变得更高效、更安全。

# 进入后端目录,可编辑配置文件(以 application.yml 为例)
cd /www/my-project/backend
# 创建并编辑 application.yml
# 在 vim 编辑器中,你可以通过以下操作撤销回到上一步:按 Esc 键确保处于普通模式,然后按下 u 键,即可撤销上一步的修改操作。
vim application.yml

#cat 命令检查 application.yml 的配置是否正确
cat application.yml  # 核对数据库、Redis、文件路径等配置

(2)配置文件内容示例(根据实际项目调整):

server:
  port: 6868  # 自定义后端服务端口,避免和 Nginx 冲突
  
spring:

# 数据库配置(MySQL):本地的 url 是 127.0.0.1(本地数据库),服务器上要改成ECS 本地的 MySQL 地址(如果 MySQL 装在同一台服务器,保持 127.0.0.1 即可,但需确认数据库名、用户名、密码是否匹配)
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    # 服务器上 MySQL 的密码,务必确认正确
    password: 你的MySQL密码 
    driver-class-name: com.mysql.cj.jdbc.Driver


# Redis 配置:如果 Redis 也装在 ECS 上,host 保持 127.0.0.1 即可;如果是独立 Redis 服务,需改成对应的服务器地址,并确认密码、端口。
  redis:
    host: 127.0.0.1  # 若Redis在ECS本地,保持不变;否则改对应IP
    port: 6379
    password: 你的Redis密码(无则留空)


# 文件上传下载路径设置:本地路径 D://test//upload// 是 Windows 格式,服务器是 Linux,需改成Linux 目录(比如 /www/my-project/upload/),同时要确保该目录存在且有写入权限。    
  file:
	  # 静态资源对外暴露的访问路径
	  staticAccessPath: /jitUpload
	  uploadFolder: /www/my-project/upload/  # Linux 格式的上传目录,需手动创建
    

# 其他配置(如日志、JWT 等)

(3)创建文件上传目录(不需要可跳过)

需要手动在服务器上创建Linux 格式的文件上传下载目录。

mkdir -p /www/my-project/upload/
chmod -R 775 /www/my-project/upload/  # 赋予读写权限

(4)验证Java 服务是否连接到 Docker 中的 MySQL

检查以下两点:

数据库配置的准确性:确认application.yml中url的 IP(127.0.0.1)、端口(3306)、数据库名(zy)、用户名(root)、密码是否与 Docker MySQL 的实际配置完全一致。

网络连通性:宿主机是否成功与 Docker 容器的 3306 端口建立了连接。

①确认 Docker MySQL 的数据库名、用户名、密码(可跳过)
  • 进入 Docker MySQL 容器
# 进入MySQL容器,查看实际配置
docker exec -it mysql8 bash

# 登录MySQL(输入密码后进入命令行)
mysql -u root -p
  • 在 MySQL 命令行中执行以下查询:
# 查看数据库名(确认是否存在名为xxx的数据库)。
show databases;

# 查看用户名和权限(确认root用户的host是否为%或localhost,确保允许远程连接)
select user, host from mysql.user;

# 验证密码(若执行成功,说明密码可正常使用;若失败,说明密码错误)
alter user 'root'@'%' identified by '你的密码';

在这里插入图片描述

②确认application.yml中的URL、端口、数据库名

打开application.yml文件,重点检查以下配置项:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/xxx?characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
    username: root
    password: 123456  # 这里的密码要与Docker MySQL的root密码完全一致

IP 和端口:127.0.0.1:3306 需与 Docker 映射的宿主机 IP 和端口一致(若 Docker 启动时用了-p 3306:3306,则此处正确)。127.0.0.1 是本地回环地址,表示 “当前机器自身”。当你在宿主机上配置 Java 服务连接 MySQL 时,使用 127.0.0.1:3306 即可访问到 Docker 容器映射到宿主机的 3306 端口。

数据库名:xxx 需与 Docker 中实际存在的数据库名一致(通过步骤 1 的show databases;确认)。
用户名 / 密码:root和密码需与 Docker MySQL 的root账号密码完全一致(通过步骤 1 的alter user命令验证)。

③Docker MySQL 的可访问性

再次用telnet 127.0.0.1 3306测试宿主机到 Docker 容器的端口连通性,确保网络链路无拦截。
在这里插入图片描述
“Connected to 127.0.0.1” 表示宿主机成功与 Docker 容器的 3306 端口建立了连接;后续的乱码内容是 MySQL 服务的二进制协议交互信息,属于正常现象,进一步证明端口通信正常。
结合这个结果,现在可以排除 “网络连通性” 问题。

5、启动 Spring Boot 服务(配置守护进程)

(1) java -jar 启动后端服务

# 执行命令进入存放 JAR 包的路径
cd /www/my-project/backend
# 执行 java -jar 启动命令
java -jar xxx-0.0.1-SNAPSHOT.jar

在这里插入图片描述

(2)配置守护进程(避免后端启动在该终端关闭后停止)

在这里插入图片描述
直接用 java -jar 启动会在该终端关闭后停止,需用 Systemd 守护进程 保证服务常驻。

具体配置步骤(以 Spring Boot 服务为例):

①创建 Systemd 服务文件

在 /etc/systemd/system/ 目录下新建服务配置文件,文件名建议与项目名一致(如 my-springboot-app.service):

vim /etc/systemd/system/my-springboot-app.service
②写入服务配置内容

按以下模板修改(替换括号内的项目实际信息):
systemd 对注释位置有严格要求 ——行内注释不允许直接跟在配置项后面(部分系统兼容,但 CentOS 等严格系统会报错,会把注释当成配置的一部分解析,导致语法错误),注释必须单独占一行,或用空格分隔且不包含特殊字符(中文、中文标点)。

[Unit]
Description=My Spring Boot Backend Service
# 服务描述(可自定义)
After=network.target mysql.service redis.service
# 启动顺序:先启动网络、MySQL、Redis
Wants=mysql.service redis.service
# 依赖服务,若MySQL/Redis未启动,会尝试启动(可选增强)

[Service]
User=root
# 运行用户(若用非root用户,替换为实际用户名,如www)
WorkingDirectory=/www/my-project/backend
# 你的JAR包存放目录(已匹配)
# 注意:JAR包路径补全绝对路径,避免依赖WorkingDirectory失效
ExecStart=/usr/bin/java -jar /www/my-project/backend/xxx-0.0.1-SNAPSHOT.jar
# 启动命令(已匹配你的JAR包名)

SuccessExitStatus=143
# 兼容Spring Boot正常退出状态码
Restart=always
# 服务崩溃/异常停止时自动重启
RestartSec=5
# 重启间隔5秒
StandardOutput=append:/www/my-project/backend/app.log
# 输出日志到文件(可选,方便排查)
StandardError=append:/www/my-project/backend/error.log
# 错误日志到文件(可选)

[Install]
WantedBy=multi-user.target
# 多用户模式下生效(默认)

保存退出:按 Esc 后输入 :wq 回车。

③生效配置并启动服务
# 校验配置(输出无任何内容(或 no errors found),说明语法完全正确)
systemd-analyze verify /etc/systemd/system/my-springboot-app.service

# 重新加载Systemd配置,让新服务文件生效
systemctl daemon-reload

# 启动服务
systemctl start my-springboot-app

# 设置开机自启(可选,推荐)
systemctl enable my-springboot-app

# 查看服务状态(确认是否正常运行)
systemctl status my-springboot-app

若输出 active (running),说明配置成功,关闭终端后服务不会停止。
在这里插入图片描述
现在 Spring Boot 应用已经通过 systemd 托管,实现了稳定运行 + 开机自启的效果,即使关闭终端也不会导致后端服务停止了,哦耶,卡布!

④常用服务管理命令

停止服务:systemctl stop my-springboot-app
重启服务(修改配置后用):systemctl restart my-springboot-app
查看服务日志(排查问题用):journalctl -u my-springboot-app -f

6、扩展:多个jar包配置systemd 服务(为每个 JAR 包单独配置服务)

在一个 *.service 系统服务文件中,不建议直接存放多个 JAR 包并同时启动。因为 systemd 服务是为单个进程 / 应用设计的,多个 JAR 包在同一个服务中管理会导致:

  • 启动 / 停止逻辑混乱(一个 JAR 失败会导致整个服务标记为失败);
  • 日志、进程管理难以区分;
  • 资源隔离性差(如内存、端口冲突风险)。

正确做法:为每个 JAR 包单独配置服务。

如果有多个 JAR 包(比如多个微服务),每个 JAR 包都应创建独立的 *.service 文件,示例如下:

场景:有两个 JAR 包 service-a.jarservice-b.jar

(1)为 service-a.jar 配置服务

vim /etc/systemd/system/service-a.service

填入配置:

[Unit]
Description=Service A
After=network.target

[Service]
User=appuser
WorkingDirectory=/opt/services/a/
ExecStart=/usr/bin/java -jar /opt/services/a/service-a.jar
Restart=on-failure

[Install]
WantedBy=multi-user.target

(2)为 service-b.jar 配置服务

vim /etc/systemd/system/service-b.service

填入配置:

[Unit]
Description=Service B
After=network.target

[Service]
User=appuser
WorkingDirectory=/opt/services/b/
ExecStart=/usr/bin/java -jar /opt/services/b/service-b.jar
Restart=on-failure

[Install]
WantedBy=multi-user.target

(3)分别启动和管理

# 加载配置
systemctl daemon-reload

# 启动服务
systemctl start service-a service-b

# 查看状态
systemctl status service-a
systemctl status service-b

# 启用自启
systemctl enable service-a service-b

(4)总结

为每个 JAR 包创建独立的 *.service 文件,便于管理、排查问题和资源隔离。

六、部署前端服务(Vue 项目)

1、本地打包 Vue 项目

本地打包前端项目:

# Vue项目
npm run build  # 生成dist文件夹

2、上传前端打包文件到服务器

本地终端(Windows CMD/PowerShell 或 macOS/Linux 终端)执行 scp 命令,上传 dist 文件夹内所有文件到服务器:

# 本地终端执行(替换为你的本地 dist 路径和服务器信息)
scp -r /本地Vue项目路径/dist/* root@服务器IP:/www/my-project/frontend/

在这里插入图片描述

# 验证上传是否成功
ls -l /www/my-project/frontend

在这里插入图片描述
若能看到 index.html 及 static/js/css 等文件夹,说明上传成功。

3、配置 Nginx(核心步骤)

浏览器访问 http://服务器IP,若出现 Nginx 默认欢迎页(“Welcome to nginx!”),说明启动成功。

注意:vim编辑器里打开了新建的配置文件,想要不编辑、不保存直接退出:
先按 Esc 键(确保退出编辑模式,底部不会显示 “插入” 之类的提示);
输入 :q!(注意是英文冒号开头,q代表退出,!代表强制不保存);
按回车键,就能直接退出 vim,且不会保留这个新建的文件。

(1)备份默认 Nginx 配置(避免误操作)

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

将 Nginx 的主配置文件 nginx.conf 重命名为 nginx.conf.bak,从而实现对原配置文件的备份。

(2)创建新的 Nginx 配置文件

把这一段粘贴:

# 编辑 Nginx 主配置文件
vim /etc/nginx/nginx.conf

将以下内容粘贴到文件中(根据实际情况修改标注的「需替换」部分):

worker_processes auto;  # 自动适配 CPU 核心数
error_log /var/log/nginx/error.log;  # 错误日志路径
pid /run/nginx.pid;     # 进程 PID 文件

events {
    worker_connections 1024;  # 每个工作进程最大连接数
}

http {
    include /etc/nginx/mime.types;  # 识别文件类型
    default_type application/octet-stream;

    # 日志格式配置
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;  # 访问日志路径

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;  # 长连接超时时间
    types_hash_max_size 2048;

    # 配置 Vue 前端静态资源
    server {
        listen 80;  # 前端访问端口(默认 80,浏览器可省略端口)
        server_name 服务器IP;  # 需替换:你的服务器公网 IP 或域名(如无域名直接填 IP)

        # 前端静态文件根目录(对应之前上传的 frontend 目录)
        root /www/my-project/frontend;
        index index.html;  # 默认访问首页

        # 解决 Vue 路由(history 模式)刷新 404 问题(若用 hash 模式可省略)
        location / {
            try_files $uri $uri/ /index.html;
        }
        
		# 新增:处理 /api 开头的后端接口请求(含POST)
    location ^~ /api {
        proxy_pass http://127.0.0.1:6868/backTest;  # 后端服务地址(含context-path)
        proxy_method $request_method;  # 保留原始请求方法(关键,支持POST)
        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;
    }

        # 关键:转发前端请求到后端 Spring Boot 服务(解决跨域)
        # 前端接口请求路径若为 /api/xxx,会自动转发到后端 6868 端口
        location /backTest/ {  # 需替换:后端配置的 context-path(你的后端是 /backTest)
            proxy_pass http://127.0.0.1:6868;  # 需替换:后端服务端口(你的后端是 6868)
            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;
        }

        # 静态资源缓存配置(优化访问速度)
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            expires 30d;  # 缓存 30 天
            add_header Cache-Control "public, max-age=2592000";
        }
    }
}

然后按i进入编辑模式
在这里插入图片描述
修改完成后,按 Esc 退出编辑模式,输入 :wq 保存并退出。
在这里插入图片描述

(3)验证 Nginx 配置是否正确

nginx -t

在这里插入图片描述

若输出 nginx: configuration file /etc/nginx/nginx.conf test is successful,说明配置无误;
若报错:检查配置文件中的语法错误(如括号不匹配、分号缺失等),根据提示修改。

(4)如果想要查看并再次编辑 nginx.conf 文件

# cat 命令可以查看文件的完整内容
cat /etc/nginx/nginx.conf
# 文件内容较长,也可以用 less 命令分页查看(按 q 退出)
less /etc/nginx/nginx.conf

# 编辑 nginx.conf 文件:
# 进入 vim 后,按 i 键进入编辑模式,即可修改文件内容。
#修改完成后,按 Esc 键退出编辑模式,输入 :wq 并回车,保存并退出。
vim /etc/nginx/nginx.conf

# 验证配置语法
nginx -t
# 重启 Nginx
systemctl restart nginx

在这里插入图片描述
这是 vim 编辑器提示 ** 存在交换文件(swap file)** 的场景,原因是之前的编辑会话未正常关闭(比如终端意外断开),导致生成了临时交换文件 .nginx.conf.swp。

选择 (R)ecover 恢复文件,步骤如下:

  • 输入 R 并回车,恢复之前的编辑内容。
  • 恢复后,按 i 进入编辑模式,继续修改 Nginx 配置。
  • 修改完成后,按 Esc 退出编辑模式,输入 :wq 保存并退出。
  • 最后删除交换文件(避免下次提示):输入 y 并回车,确认删除该交换文件即可。
rm /etc/nginx/.nginx.conf.swp

在这里插入图片描述

(5)重启 Nginx 使配置生效

每次修改Nginx配置都需要重启。

systemctl restart nginx

4、验证部署成功

(1)浏览器访问

浏览器访问 http://服务器IP(无需加端口,默认 80 端口):

若能看到 Vue 项目的首页,说明 Nginx 托管成功;
在这里插入图片描述

尝试操作前端功能(如登录、查询数据),若能正常请求后端接口并返回数据,说明前后端对接成功。

(2) 如果Nginx 反向代理未正确转发请求

如果后端服务不响应且验证码不显示。

①修改后端接口的 location 配置

之前配置中,后端接口的 location 是 /backTest/,但前端请求的接口路径是 /api/xxx,导致路径不匹配。需新增一个 location 块,专门处理 /api 开头的请求:

# 新增:处理 /api 开头的后端接口请求(含POST)
    location ^~ /api {
        proxy_pass http://127.0.0.1:6868/backTest;  # 后端服务地址(含context-path)
        proxy_method $request_method;  # 保留原始请求方法(关键,支持POST)
        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;
    }
②验证配置语法并重载 Nginx
# 检查配置语法是否正确
nginx -t

# 重载 Nginx 使配置生效
nginx -s reload

(3)如果Nginx 转发请求,但后端服务(Java)未正常响应

在这里插入图片描述
出现 502 Bad Gateway 错误,说明 Nginx 已尝试转发请求,但后端服务(Java)未正常响应。

①步骤 1:确认 Java 服务是否正常运行并监听端口

执行以下两条命令来检查 Java 服务和端口状态:

# 查看Java进程
ps -ef | grep java
# 查看6868端口是否被监听
netstat -tuln | grep 6868

在这里插入图片描述
这就是导致 Nginx 报 502 Bad Gateway 的根本原因 ——后端 Java 服务未启动,Nginx 无法将请求转发到有效的服务上。

②步骤 2:启动 Java 服务

启动 Java 服务:进入后端项目目录,执行启动命令( java -jar 你的项目.jar )。

七、配置域名与 HTTPS(可选,推荐)

域名配置需完成「域名解析SSL 证书申请Nginx 配置 HTTPSHTTP 跳转」四步,关键是确保域名指向服务器 IP、证书配置正确且反向代理不冲突。

1、本质与核心作用

(1)域名

①本质

是「IP 地址的别名」:服务器的公网 IP(如 4x.xx.xx.xxx)是纯数字组合,难记且易出错,域名(如www.xxx.com)用英文、中文等字符组合,降低访问门槛。

②核心作用

是「映射关联」:通过前面提到的「域名解析」步骤,把域名和服务器 IP 绑定,用户输入域名后,网络会自动找到对应的服务器,加载上面的前后端项目。

(2)HTTPS

①本质

HTTP是明文传输,数据是 “裸奔” 状态,容易被拦截、窃取、篡改,地址栏无小锁,部分浏览器会提示 “不安全”。

HTTPS是 HTTP 的加密安全版,简单说就是 “加密的网站访问协议”,能保护你和服务器之间的数据传输安全。

②核心作用

数据加密:用户访问网站时,输入的密码、表单信息、接口数据等会被加密,避免被黑客拦截窃取。

身份验证:通过 SSL 证书验证网站真实性,确保你访问的是目标服务器(不是钓鱼网站),地址栏会显示小锁图标。

防篡改:传输过程中数据不会被篡改,比如你请求的网页内容、接口返回的数据,能原样到达终端。

2、前置准备

(1)域名购买与备案(基础前提)

推荐阿里云万网腾讯云域名、华为云域名等正规平台,价格透明(.com 域名每年约 55 元,.cn 域名每年约 29 元),后续解析、证书申请更便捷。
在这里插入图片描述
提交后,选择信息模板,如果没有需要先创建模板,
在这里插入图片描述
如果模板状态显示未实名,点击查看,
在这里插入图片描述
然后进行实名认证与邮箱验证。
在这里插入图片描述
提交后等待实名审核。
在这里插入图片描述
在这里插入图片描述
实名认证审核通过。
在这里插入图片描述
成功购买后。
在这里插入图片描述

①备案
  • 【备案】:如果你的域名要解析到阿里云中国内地(大陆)的服务器,并且通过该域名对外提供网站、应用等互联网信息服务,按照我国法规必须进行ICP 备案。备案是向通信管理部门登记网站信息,获得备案号后才能合法运营。

在这里插入图片描述
如果输入购买的域名结果是没有备案,右侧点击开始备案
在这里插入图片描述
具体可以参照个人网站备案快速入门

如果您用于ICP备案的服务器在当前登录的阿里云账号下,直接可以在备案流程中选择云服务器实例。备案时系统会自动生成和关联备案服务码,您无需手动申请备案服务码。(注意服务器购买需要满三个月。)
在这里插入图片描述

账号下可备案的全部服务器实例情况请至可备案实例管理控制台查看。
在这里插入图片描述
备案提交后等待审核。
在这里插入图片描述

②域名解析
  • 【域名解析】:若你有域名(比如yourdomain.com),需要将其指向服务器等资源,可点击进入解析控制台设置域名与服务器 IP 的对应关系,这样用户访问你的域名时才能找到对应的服务。
    在这里插入图片描述
    点击添加记录,
    在这里插入图片描述
    示例:
    在这里插入图片描述
    使用阿里云的网络拨测工具界面,检测域名的网络可用性。
  • DNS 的作用是将域名(如www.baidu.com)翻译成 IP 地址,让设备能找到目标服务器。
  • DNS 为 HTTPS 提供域名解析支持,是 后续 HTTPS 连接建立的前置步骤。

在这里插入图片描述
在这里插入图片描述

HTTP 与 DNS 检测结果不同的原因:

  • DNS 检测关注 “域名→IP 的解析过程”,若之前 DNS 解析未生效(如缓存未更新),会显示解析 IP 为 0;
  • HTTP 检测关注 “基于解析出的 IP,能否成功访问网站的 HTTP 服务”。当 DNS 缓存更新后,解析出 IP(显示 “解析结果
    IP 1 个”),此时 HTTP 检测会基于该 IP 尝试访问网站服务,所以两者结果会因检测维度和时间节点不同而出现差异。

简单来说,DNS 管 “域名转 IP”,HTTP 管 “IP 对应的网站服务是否能访问”,两者检测的环节不同,结果自然可能不一样。

所以这里显示通过HTTP使用公网IP是能够正常访问网站的,但不能通过配置的域名访问。

如果等待 10-30 分钟,等 TTL 缓存过期后再检测,如果还是不行,那就是因为之前的备案还在审核,审核需要1-2天。
备案审核期间,从技术角度,域名解析可正常设置,但实际访问会受限。

③网站搭建
  • 【网站搭建】:如果想利用域名和服务器搭建网站来承接流量、实现业务(比如企业官网、个人博客),可以点击体验网站搭建服务,快速构建网站。
    在这里插入图片描述
    在这里插入图片描述
    万小智是阿里云推出的 AI 建站工具,属于面向中小微企业和个人创业者的 “全栈式 AI 数字员工”。它能通过自然语言交互,帮你完成从网站架构设计、页面布局到内容创作、在线客服配置的全流程搭建,甚至还能自动生成符合品牌调性的配图,10 分钟左右就能完成网站部署上线,非常适合零基础用户快速搭建品牌官网、企业展示站等类型的网站。
④开发票
  • 【开发票】:如果需要发票用于报销或财务记录,可前往费用中心提交发票申请,具体操作可查看发票帮助文档。

(2)备案流程( ICP 备案与公安备案)

注意: ICP 备案(苏 ICP 备 *** 号)是网站合法上线的 “基础通行证”,但根据国家法规要求,仍需进一步完成公安备案
在这里插入图片描述
在这里插入图片描述

①阿里云初审

阿里云初审1-2天很快。
在这里插入图片描述

②工信部短信核验

注意:有效期只有一天!收到短信需点击核验链接尽快核验。
在这里插入图片描述

③管局核验( ICP 备案)

完成上一步的工信部短信核验后大概一个星期管局核验通过。
在这里插入图片描述

④管局核验( 公安备案)

根据《网络安全法》《计算机信息网络国际联网安全保护管理办法》,以及南通公安局、广州卓瞻白玉等权威解读:

  • ICP 备案(工信部主管):解决 “网站能否上线” 的问题,是网站使用国内服务器、实现公网访问的前置条件(你已完成,拿到 “苏 ICP
    备” 编号);
  • 公安备案(公安部网安部门主管):解决 “网站上线后是否安全可控”
    的问题,核心是向属地公安报备网站信息(如运营主体、服务内容、数据收集情况),属于 ICP
    备案后的法定强制要求,逾期未办可能面临警告、网站关停等处罚。

简单说:ICP 备案是 “上线资格”,公安备案是 “安全监管登记”,两者缺一不可。

已完成的 ICP 备案(苏 ICP 备 *** 号)是网站合法上线的 “基础通行证”,但根据国家法规要求,仍需进一步完成公安备案,阿里云会通知提醒你办理这一法定流程。在这里插入图片描述
全国互联网安全管理服务平台

在这里插入图片描述
点击《网站备案指引》下载压缩包,参考网站备案用户手册,按照手册进行公安备案。

(3)公安备案部分流程

①创建主体
②新办网站申请

在这里插入图片描述

  • 域名证书:(以阿里云为例)
    打开阿里云官网(https://www.aliyun.com/),登录你的账号;
    进入「控制台」→ 找到「域名与网站」→ 点击「域名」;
    在域名列表里找到 “hly.ajsl”,点击域名右侧的「管理」;
    进入域名详情页后,找到「域名证书」选项(一般在 “基本信息” 或 “更多操作” 里);
    点击「下载证书」,就能得到 PDF 格式的域名证书(符合平台要求的 png/jpg 格式,可直接截图或转格式)。
    在这里插入图片描述

  • IP:
    在公安备案中,这里需要填写的是公网 IP(即网站服务器对外提供服务的公开 IP 地址),不是私有 IP(如 192.168.x.x 这类内网 IP)。
    如果你用的是阿里云服务器,直接登录阿里云 ECS 控制台 → 找到对应服务器实例 → 在 “基本信息” 里就能看到公网 IP;
    在这里插入图片描述
    在这里插入图片描述

  • 网络接入服务商部分
    接入商所属地区:
    选你服务器所在的地区(比如阿里云服务器在 “浙江省 / 杭州市”,就选 “浙江省 / 杭州市”)。
    接入商名称:
    下拉框选 “阿里云计算有限公司”(因为你的服务器是阿里云的)。
    网站接入方式:
    选 “租赁主机”(阿里云提供的是云服务器租赁服务)。
    在这里插入图片描述

  • 域名注册服务商部分
    域名商所属地区:
    选你域名注册商的地区(比如域名是阿里云买的,就选 “浙江省 / 杭州市”)。
    域名注册商 “阿里云计算有限公司” 的主体注册地址是浙江省杭州市,所以在公安备案里,“域名商所属地区” 必须填 “浙江省 / 杭州市”(这是公安备案要求的企业主体实际地区,和控制台的资源地域筛选无关)。
    在这里插入图片描述
    域名服务商名称:
    下拉框选 “阿里云计算有限公司”(和域名注册平台一致)。

  • 服务类型部分
    是否提供互联网交互服务:
    网站有留言、评论、登录等功能选 “是”;纯静态展示(无交互)选 “否”。

  • 相关的前置许可
    如果你的网站涉及教育、医疗、新闻等特定行业,需要先取得对应主管部门的许可资质(比如做教育网站要办学许可证),才需要勾选;如果你的网站不涉及这些行业,直接选 “否” 即可。

在这里插入图片描述

(4)ICP备案完成为什么域名访问不了?

主域名配置解析:http://域名访问网站
子域名配置解析:http://www.域名访问网站

①域名解析管理页面(主域名配置)——DNS流量分析状态是 “未开通”

这是阿里云的域名解析管理页面,当前显示你的域名hly.asia状态是 “未开通”,说明这个域名还没配置 DNS 服务器(相当于域名还没和阿里云的解析服务绑定),所以之前的解析记录是无效的。
域名要生效,必须先开通 DNS 服务(把域名的 DNS 服务器设置为阿里云的),否则解析记录不会被互联网识别。
在这里插入图片描述
解决步骤:
点击域名右侧的 “前往开通” 按钮,按照提示完成 DNS 服务开通(免费版即可);
开通后,回到 “解析设置” 页面,重新添加 A 记录(指向服务器 IP公网);
等待 DNS 配置生效(通常 10-30 分钟),之后域名就能正常解析到服务器了。
在这里插入图片描述
在这里插入图片描述

②域名解析管理页面(主域名配置)——域名检测

配置主域名解析,注意后续HTTPS申请证书时Certbot 要验证主域名是否指向你的服务器,域名没解析,验证不能通过。在这里插入图片描述
解析设置:跳转页面进行子域名配置
域名检测:开始诊断提示说输入的这个域名(比如主域名)没配置解析记录,但之前配好的是子域名www.域名的解析,所以:
现在www.域名是能正常解析到服务器的;
主域名因为没加解析,所以诊断提示 “未配置”。
不用管这个提示,只要www.域名能正常用就行~
在这里插入图片描述
在这里插入图片描述
添加主域名的 A 记录,步骤如下:
点击该页面的解析设置;
点击「添加记录」按钮,填写:
主机记录:填@(@代表主域名);
记录类型:选A;
记录值:填你的服务器公网 IP;
TTL:默认 10 分钟即可;
点击「确定」保存记录。
在这里插入图片描述

③域名解析管理页面(子域名配置)——域名检测

如果www.域名进行子域名检测发现提示:
在这里插入图片描述

域名www.***还没配置 “解析记录”,所以域名暂时无法指向你的服务器(相当于域名和服务器没 “绑定”,别人访问这个域名会打不开网站)。

  • 核心原因:
    域名解析是把 “域名(比如 www.***)” 和 “服务器 IP” 关联起来的操作,现在你没做这个关联,所以系统检测不到解析记录。

  • 解决方法:
    需要在阿里云域名控制台给www.***添加A 记录解析(把域名指向你的服务器公网 IP)

当前的解析记录是HTTPS 类型,但一般网站首先需要A 记录(将域名指向服务器 IP) 来实现基础访问,而现在只有 HTTPS 的解析,可能会导致域名无法正常绑定服务器~
在这里插入图片描述

步骤是:
点击 “添加记录”,选择记录类型为 “A”;
主机记录填 “www”,记录值填你的服务器公网 IP;
其他默认(TTL 选 10 分钟),保存即可。
添加后等 10-30 分钟,域名就能和服务器绑定,访问域名就能打开网站了。
在这里插入图片描述
在这里插入图片描述

TTL 生效时间:设置的 TTL 是 10 分钟,意味着域名解析的缓存会在 10 分钟后更新;

(5)域名解析后为什么https访问不了?

在这里插入图片描述
出现ERR_QUIC_PROTOCOL_ERROR的原因是你的网站强制用了 HTTPS/QUIC 协议,但服务器或解析配置有问题:
域名解析里只有HTTPS 记录,但服务器没有正确配置 HTTPS(比如没部署 SSL 证书、Nginx/Apache 的 HTTPS 配置错误);

步骤 1:先关闭 HTTPS 解析,测试 HTTP 是否能访问
回到阿里云域名解析页面,把当前的 “HTTPS” 记录暂时禁用(点击 “启用状态” 的绿色开关,变成灰色);
在这里插入图片描述
发现http://www.域名/是可以访问的,所以是服务器没有正确配置 HTTPS。

步骤 2:修复 HTTPS/QUIC 问题(若 HTTP 能访问)
给服务器部署 SSL 证书(阿里云可以免费申请 “Let’s Encrypt” 证书,或购买付费证书);
配置服务器的 Web 服务(比如 Nginx),开启 HTTPS 并绑定证书(确保 443 端口开放);
之后再启用 HTTPS 解析记录,访问https://www.域名即可正常打开。

3、建立 HTTPS 连接

以阿里云服务器 + Nginx 环境为例,部署 SSL 证书(免费 Let’s Encrypt 证书)的步骤如下:

步骤一:准备工作

  • 确保服务器已安装 Nginx(可通过nginx -v验证);
    在这里插入图片描述
  • 确保服务器的 443 端口已开放(开放 443 端口是让网站能通过 HTTPS 正常访问的必要条件);
    当用户用https://访问你的网站时,请求会自动发送到服务器的 443 端口;
    如果 443 端口没开放,服务器就收不到这个请求,网站会显示 “无法访问”“连接超时” 等错误。

点击当前页面中的服务器实例(AlibabaCloudLinux-bbav),进入服务器详情页;
在这里插入图片描述
轻量应用服务器的防火墙规则页面,能看到你的 443 端口已经开放。
在这里插入图片描述

  • 域名已解析到服务器 IP(即 A 记录已生效)。
    即http://www.域名可以访问网站。

步骤二:申请免费 SSL 证书(Let’s Encrypt)

①使用certbot工具快速申请:

直接安装 certbot(阿里云 Linux 自带的源里已经包含 certbot):

yum install certbot python3-certbot-nginx -y

在服务器终端执行这条命令,就能检查 certbot 是否安装成功:

certbot --version

在这里插入图片描述

②申请并自动配置证书(假设域名是test.com):

执行命令:certbot --nginx -d www.test.com -d test.com
按提示输入邮箱(用于证书到期提醒);
同意服务条款(输入A);
选择是否分享邮箱(输入N);
选择是否重定向 HTTP 到 HTTPS(建议选2,自动将 HTTP 请求跳转到 HTTPS)。

在这里插入图片描述
证书申请成功了(证书和密钥已经保存到服务器指定目录),但 ❌ 没法自动安装到 Nginx 里,原因是 Nginx 的配置文件中,没有找到匹配www.test.com/test.com的server_name配置(简单说:Nginx 还没配置域名,Certbot 不知道该把证书装到哪个网站配置里)。

③vim模式操作

查看 /etc/nginx/nginx.conf 配置文件的内容:

cat /etc/nginx/nginx.conf

按回车翻行,按 Ctrl+C 退出。

打开配置文件,回车后会进入 vim 的「普通模式」(只能浏览、翻行,不能编辑),能看到你之前贴的 Nginx 配置内容。按键盘上的 i 键(insert 的缩写),此时终端底部会显示「插入」或「INSERT」,代表进入编辑模式,可以修改文字了。

vim /etc/nginx/nginx.conf

退出编辑 + 保存配置:
先按 Esc 键,退出「编辑模式」,回到「普通模式」(底部的「插入」提示会消失);
输入 :wq(英文冒号开头,w = 保存,q = 退出);
按回车键,完成保存并退出 vim。

补充:如果改错了不想保存
按 Esc → 输入 :q!(! 代表强制退出不保存)→ 回车,就能放弃修改回到终端。

④配置 Nginx 的域名站点

当前 Nginx 配置中添加你的域名(test.com和www.test.com),只需要修改server_name并补充 HTTPS 相关配置即可,步骤如下:

  • 步骤 1:修改server_name(添加你的域名)
    找到当前server块中的server_name行,把服务器 IP 替换成你的域名,同时加上主域名和子域名:
server_name 公网IP test.com www.test.com;  # 保留IP+新增你的域名
  • 步骤 2:补充 HTTPS 配置(启用 SSL + 证书)
    因为你已经申请了 SSL 证书,需要在server块中添加 HTTPS 监听和证书路径:在listen 80;下面新增一行listen 443 ssl;,然后添加证书配置:
server {
    listen 80;
    listen 443 ssl;  # 新增:启用HTTPS端口

    # 证书路径(用你之前申请的证书)
    ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem;

    server_name 公网IP test.com www.test.com;  # 已修改:包含IP+域名
    # ... 其他原有配置(root、index等) ...
}
  • 步骤 3:添加 HTTP 自动跳转到 HTTPS(可选,推荐)
    在server块开头新增一段 “强制跳转” 代码,让用户访问http时自动跳转到https:
server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem;
    
     server_name 公网IP test.com www.test.com; 

    # 新增:HTTP跳HTTPS
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }

    # ... 其他原有配置(root、location等) ...
}
  • 步骤 4:验证配置 + 重启 Nginx
    检查 Nginx 配置语法是否正确:
nginx -t

如果显示nginx: configuration file /etc/nginx/nginx.conf test is successful,说明配置没问题。

重启 Nginx 使配置生效:

systemctl restart nginx

完成后,访问https://test.com或https://www.test.com就能通过域名正常访问你的服务了(http自动转为https)~

⑤证书查看

查看证书文件是否存在(终端验证):

ls /etc/letsencrypt/live/www.test.com/

查看证书有效期(可选):

openssl x509 -in /etc/letsencrypt/live/www.test.com/fullchain.pem -noout -dates

在这里插入图片描述Certbot 已经自动设置了定时任务,会在证书到期前自动续期。

步骤三:证书自动续期(Let’s Encrypt 证书有效期 90 天)

certbot 默认会自动续期,可通过以下命令验证自动续期任务:

systemctl list-timers | grep certbot

8、总结

阿里云 ECS 部署的核心步骤是:初始化服务器 → 安装基础环境 → 部署前后端代码 → 配置 Nginx 反向代理 → 安全加固。若遇到问题,可查看阿里云文档或搜索对应报错(如 Nginx 启动失败、PM2 进程管理等)。

更多推荐