Skip to content

全栈面试:DevOps 与部署

CI/CD 是什么?

CI 是持续集成,强调频繁提交代码后自动构建、测试和检查。

CD 是持续交付或持续部署,强调把通过检查的代码自动发布到环境。

常见流程:

  1. 提交代码
  2. 运行 lint
  3. 运行测试
  4. 构建产物
  5. 部署到测试环境
  6. 人工确认或自动发布生产

Docker 解决什么问题?

Docker 把应用和运行环境打包成镜像,减少“我本地可以运行,服务器不行”的问题。

核心概念:

  • Image 镜像
  • Container 容器
  • Dockerfile
  • Registry 镜像仓库
  • Volume
  • Network

面试时可以补充:Docker 不是虚拟机,它更轻量,但也需要关注镜像体积、安全和配置管理。

Nginx 常见用途有哪些?

常见用途:

  • 静态资源服务
  • 反向代理
  • 负载均衡
  • HTTPS 终止
  • gzip 压缩
  • 路由转发
  • 缓存

前端项目常用 Nginx 托管静态文件,并把 /api 转发到后端服务。

环境变量有什么作用?

环境变量用于区分不同环境配置,例如:

  • API 地址
  • 数据库连接
  • Redis 地址
  • 密钥
  • 日志级别

不要把密钥写死在代码里,也不要提交到 Git 仓库。

常见环境:

  • local
  • dev
  • test
  • staging
  • production

蓝绿部署和灰度发布有什么区别?

蓝绿部署是准备两套环境,一套当前对外服务,一套部署新版本,验证后切流量。

灰度发布是让一小部分用户先使用新版本,观察稳定后逐步扩大范围。

对比:

  • 蓝绿切换快,回滚方便,但资源成本较高。
  • 灰度更稳,可以降低影响范围,但流量控制更复杂。

如何做回滚?

常见回滚方式:

  • 重新部署上一个版本
  • 镜像版本回退
  • 蓝绿环境切回旧版本
  • Feature Flag 关闭新功能
  • 数据库变更预留回滚方案

注意:代码回滚容易,数据结构和数据写入回滚更难,所以数据库迁移要特别谨慎。

日志应该记录什么?

常见字段:

  • timestamp
  • level
  • requestId
  • userId
  • path
  • method
  • status
  • duration
  • error stack

不要记录密码、token、身份证、银行卡等敏感信息。

线上故障怎么排查?

常见步骤:

  1. 确认影响范围。
  2. 查看告警和监控。
  3. 查看最近发布记录。
  4. 查看错误日志和 requestId。
  5. 检查数据库、缓存、队列和第三方服务。
  6. 先止血,再定位根因。
  7. 复盘并补充监控和测试。

面试时可以强调:线上事故先恢复服务,再追求完美定位。

DevOps 面试追问

如何部署前端静态站点?

前端静态站点通常先构建生成 dist,再部署到 Nginx、对象存储、CDN 或静态托管平台。SPA 项目要配置路由回退到 index.html,否则刷新深层路径会 404。

生产环境还要处理缓存策略:带 hash 的静态资源可以长缓存,index.html 不宜强缓存。发布后可以通过健康检查和页面探活确认站点可访问。

如何部署 Node.js 服务?

Node.js 服务部署一般包括安装依赖、构建、配置环境变量、启动进程和接入反向代理。进程管理可以用 PM2、systemd、Docker 或 Kubernetes。

需要关注端口、日志、异常重启、健康检查、优雅关闭和资源限制。线上服务不能依赖本地 .env,生产配置应该由部署平台或密钥管理系统注入。

Dockerfile 如何优化?

Dockerfile 优化重点是减小镜像体积、提高构建缓存命中和降低安全风险。常见做法是使用多阶段构建,只把运行所需文件复制进最终镜像。

还可以选择更小的基础镜像、固定依赖版本、合并层、避免复制无关文件,并用非 root 用户运行服务。面试时可以补充 .dockerignore 很重要。

如何管理生产环境配置?

生产配置应该和代码分离,通过环境变量、配置中心或密钥管理系统注入。不同环境要有清晰边界,例如开发、测试、预发、生产。

敏感配置如数据库密码、API key 不能提交到仓库。配置变更要有审计、灰度和回滚能力,避免一次配置错误影响全量服务。

如何做健康检查?

健康检查通常分为存活检查和就绪检查。存活检查判断进程是否还活着,就绪检查判断服务是否可以接流量,例如数据库、缓存、依赖是否可用。

接口可以设计为 /health/ready,返回状态、版本和关键依赖结果。注意健康检查不能太重,否则检查本身会拖垮服务。

如何做日志收集?

日志收集一般由应用输出结构化日志,再通过采集器收集到日志平台,例如 ELK、Loki 或云日志服务。日志要包含时间、级别、requestId、服务名、接口、耗时和错误信息。

敏感数据要脱敏,日志量要控制采样和保留周期。好的日志应该能支持搜索、聚合、告警和事故复盘。

如何处理发布后接口报错?

先看影响范围和错误率,如果影响用户核心流程,优先回滚或降级。然后根据版本、requestId、错误日志、监控指标和最近变更定位问题。

常见原因包括配置错误、数据库变更不兼容、依赖服务异常、环境变量缺失、接口字段变更。处理顺序是先恢复服务,再补根因修复和回归测试。

如何设计 Git 分支流程?

小团队可以使用 trunk-based development,主分支保持可发布,功能通过短分支和 PR 合入。更传统的团队可以使用 main、develop、feature、release、hotfix 分支。

关键不是分支越多越好,而是保证代码评审、自动化测试、可回滚和发布节奏清晰。紧急修复要能从生产分支拉 hotfix,并及时合回主开发线。

Built with VitePress and GitHub Pages.