• 当我们谈部署时,我们在谈什么?

当我们谈部署时,我们在谈什么?

2025-04-27 11:13:15 栏目:宝塔面板 113 阅读

计算机网络把各地的计算机连接了起来,只要有一台可以上网的终端,比如手机、电脑,就可以访问互联网上任何一台服务器的资源(包括静态资源和动态的服务)。

作为开发者的我们,就是这些资源、服务的提供者,把资源上传到服务器,并把服务跑起来的过程就叫做部署。

代码部分的部署,需要先经过构建,也就是编译打包的过程,把产物传到服务器。

最原始的部署方式就是在本地进行 build,然后把产物通过 FTP 或者 scp(基于 SSH 的远程拷贝文件拷贝) 传到服务器上,如果是后端代码还需要重启下服务。

每个人单独构建上传,这样不好管理,也容易冲突,所以现在都会用专门的平台来做这件事构建和部署,比如 jenkins。

我们代码会提交到 gitlab 等代码库,然后 jenkins 从这些代码库里把代码下载下来进行 build,再把产物上传到服务器上。

流程和直接在本地构建上传差不多,只不过这样方便管理冲突、历史等,还可以跨项目复用一些东西。

构建、部署的过程最开始是通过 shell 来写,但写那个的要求还是很高的,很少人会写(我就不咋会)。后来就支持了可视化的编排,可以被编排的这个构建、部署的流程叫做流水线 pipeline。

比如这是 jenkins 的 pipeline 的界面:

除了构建、部署外,也可以加入一些自动化测试、静态代码检查等任务。

这种自动化了的构建、部署流程就叫做 CI(持续集成)、CD(持续部署)。

我们现在还是通过 scp / FTP 来上传代码做的部署,但是不同代码的运行环境是不同的,比如 Node.js 服务需要安装 node,Java 服务需要安装 JRE 等,只把代码传上去并不一定能跑起来。

那怎么办呢?怎么保证部署的代码运行在正确的环境?

把环境也给管理起来,作为部署信息的一部分不就行了?

现在流行的容器技术就是做这个的,比如 docker,可以把环境信息和服务启动方式放到 dockerfile 里,build 产生一个镜像 image,之后直接部署这个 docker image 就行。

比如我们用 nginx 作为静态服务器的时候,dockerfile 可能是这样的:

FROM nginx:alpine
COPY /nginx/ /etc/nginx/
COPY /dist/ /usr/share/nginx/html/
EXPOSE 80

这样就把运行环境给管理了起来。

所以,现在的构建产物不再是直接上传服务器,而是生成一个 docker image,上传到 docker registry,然后把这个 docker image 部署到服务器。

还有一个问题,现在前端代码、后端代码都部署在了我们的服务器上,共享服务器的网络带宽,其中前端代码是不会变动的、流量却很大,这样使得后端服务的可用带宽变小、支持的并发量下降。

能不能把这部分静态资源的请求分离出去呢?最好能部署到离用户近一点的服务器,这样访问更快。

确实可以,这就是 CDN 做的事情。

网上有专门的 CDN 服务提供商,它们有很多分散在各地的服务器,可以提供静态资源的托管。这些静态资源最终还是从我们的静态资源服务器来拿资源的,所以我们的静态资源服务器叫做源站。但是请求一次之后就会缓存下来,下次就不用再请求源站了,这样就减轻了我们服务器的压力,还能加速用户请求静态资源的速度。

这样就解决了静态资源分去了太多网络带宽的问题,而且还加速了资源的访问速度。

此外,静态资源的部署还要考虑顺序问题,要先部署页面用到的资源,再部署页面,还有,需要在文件名加 hash 来触发缓存更新等,这些都是更细节的问题。

这里说的都是网页的部署方式,对于 APP/小程序它们是有自己的服务器和分发渠道的,我们构建完之后不是部署,而是在它们的平台提交审核,审核通过之后由它们负责部署和分发。

总结

互联网让我们能够用手机、PC 等终端访问任何一台服务器的资源、服务。而提供这些资源、服务就是我们开发者做的事情。把资源上传到服务器上,并把服务跑起来,就叫做部署。

对于代码,我们可以本地构建,然后把构建产物通过 FTP/scp 等方式上传到服务器。

但是这样的方式不好管理,所以我们会有专门的 CI/CD 平台来做这个,比如 jenkins。

jenkins 支持 pipeline 的可视化编排,比写 shell 脚本的方式易用很多,可以在构建过程中加入自动化测试、静态代码检查等步骤。

不同代码运行环境不同,为了把环境也管理起来,我们会使用容器技术,比如 docker。把环境信息写入 dockerfile,然后构建生成 docker image,上传到 registry,之后部署这个 docker image 就行。

静态资源和动态资源共享服务器的网络带宽,为了减轻服务器压力、也为了加速静态资源的访问,我们会使用 CDN 来对静态资源做加速,把我们的静态服务器作为源站。第一个静态资源的请求会请求源站并缓存下来,之后的请求就不再需要请求源站,这样就减轻了源站的压力。此外,静态资源的部署还要考虑顺序、缓存更新等问题。

对于网页来说是这样,APP/小程序等不需要我们负责部署,只要在它们的平台提交审核,然后由它们负责部署和分发。

当我们在谈部署的时候,主要就是在谈这些。

本文地址:https://www.yitenyun.com/160.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL Web 应用 异步数据库 数据同步 ACK 双主架构 循环复制 TIME_WAIT 运维 负载均衡 服务器 管理口 HexHub Docker JumpServer SSL 堡垒机 跳板机 HTTPS 服务器性能 JumpServer安装 堡垒机安装 Linux安装JumpServer SQL 查询 生命周期 Deepseek 宝塔面板 Linux宝塔 锁机制 esxi esxi6 root密码不对 无法登录 web无法登录 行业 趋势 序列 核心机制 Windows Windows server net3.5 .NET 安装出错 HTTPS加密 开源 PostgreSQL 存储引擎 Windows宝塔 Mysql重置密码 宝塔面板打不开 宝塔面板无法访问 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 机器学习 Redis Undo Log 机制 Spring 动态查询 响应模型 Oracle 处理机制 InnoDB 数据库锁 优化 万能公式 连接控制 group by 索引 Serverless 无服务器 语言 监控 无法访问宝塔面板 异步化 ES 协同 技术 工具 openHalo scp Linux的scp怎么用 scp上传 scp下载 scp命令 Postgres OTel Iceberg 缓存方案 缓存架构 缓存穿透 国产数据库 高可用 分页查询 数据 主库 SVM Embedding Linux 安全 Netstat Linux 服务器 端口 存储 SQLite-Web SQLite 数据库管理工具 GreatSQL 连接数 加密 场景 云原生 R edis 线程 防火墙 黑客 启动故障 Recursive R2DBC 向量数据库 大模型 日志文件 MIXED 3 OB 单机版 共享锁 SQLark ​Redis 推荐模型 Canal AI 助手 RocketMQ 长轮询 配置 自定义序列化 PG DBA 不宕机 信息化 智能运维 业务 传统数据库 向量化 向量库 Milvus Python Ftp 同城 双活 Web 接口 开发 聚簇 非聚簇 线上 库存 预扣 修改DNS Centos7如何修改DNS IT运维 Hash 字段 电商 系统 filelock 分库 分表 Rsync 架构 磁盘架构 MySQL 9.3 数据类型 缓存 redo log 重做日志 MongoDB MCP 开放协议 mini-redis INCR指令 数据结构 数据分类 sftp 服务器 参数 • 索引 • 数据库 ZODB Doris SeaTunnel 语句 流量 PostGIS 分布式架构 分布式锁​ 窗口 函数 频繁 Codis MVCC Go 数据库迁移 虚拟服务器 虚拟机 内存 工具链 人工智能 推荐系统 EasyExcel MySQL8 数据备份 失效 prometheus Alert 主从复制 代理 Redisson 锁芯 MGR 分布式集群 分页 StarRocks 数据仓库 千万级 大表 聚簇索引 非聚簇索引 高效统计 今天这篇文章就跟大家 网络架构 网络配置 数据集成工具 发件箱模式 引擎 性能 网络故障 播客 崖山 新版本 Entity 事务 Java INSERT COMPACT 核心架构 订阅机制 容器 QPS 高并发 RDB AOF SSH Redka Web B+Tree ID 字段 Weaviate 关系数据库 速度 服务器中毒 Caffeine CP 数据脱敏 加密算法 数据页 Redis 8.0 DBMS 管理系统 分布式 集中式 OAuth2 Token 自动重启 容器化 Valkey Valkey8.0 SpringAI 微软 SQL Server AI功能 模型 读写 LRU 原子性 排行榜 排序 池化技术 连接池 数据字典 兼容性 JOIN 意向锁 记录锁 事务隔离 Testcloud 云端自动化 单点故障 业务场景 UUID ID dbt 数据转换工具 分页方案 排版 部署 1 优化器 日志 悲观锁 乐观锁 ReadView Pottery InfluxDB 事务同步 网络 sqlmock UUIDv7 主键 AIOPS 分布式锁 Zookeeper 对象 仪表盘 双引擎 RAG HelixDB 产业链 Order 编程 单线程 字典 Ansible Pump 线程安全 LLM IT 拦截器 动态代理 恢复数据 Crash 代码 国产 用户 快照读 当前读 视图 订单 List 类型 慢SQL优化 count(*) count(主键) 行数 RR 互联网 表空间 解锁 调优 Next-Key 神经系统 矢量存储 数据库类型 AI代理 CAS 多线程 查询规划 GitHub Git 算法 技巧 并发控制 恢复机制 闪回