Skip to main content

部署与运维(DevOps)

全栈工程师往往要负责服务上线,面试也会问 Docker、Nginx、CI/CD。

Docker

面试题:Docker 解决了什么问题?镜像和容器的区别?

  • 解决「在我机器上能跑」的环境一致性问题,把应用 + 依赖 + 运行环境打包。
  • 镜像(Image):只读模板(类比类);容器(Container):镜像运行起来的实例(类比对象)。镜像分层存储,可复用缓存。

Node 应用的 Dockerfile(多阶段构建,减小体积):

# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 运行阶段:只拷贝产物和生产依赖,镜像更小
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/main.js"]

要点:

  • .dockerignore 排除 node_modules.git
  • 先拷 package.jsonnpm ci利用层缓存:代码变更不会导致依赖重装。
  • alpine 基础镜像、多阶段构建减小体积。
  • docker-compose 编排多容器(app + mysql + redis);生产大规模用 K8s。

Nginx

面试题:Nginx 在架构里起什么作用?

  • 反向代理:转发请求到后端 Node 服务,隐藏真实服务器。
  • 负载均衡:把流量分发到多个 Node 实例(upstream,支持轮询/加权/ip_hash)。
  • 静态资源服务:直接托管前端打包产物,比 Node 高效。
  • HTTPS 卸载、Gzip 压缩、限流、缓存
upstream node_app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}

server {
listen 80;
server_name example.com;

location / {
root /var/www/dist; # 前端静态资源
try_files $uri $uri/ /index.html; # SPA history 路由兜底
}

location /api/ {
proxy_pass http://node_app; # 转发到 Node
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

进程管理:PM2

pm2 start app.js -i max   # cluster 模式,按 CPU 核数起多进程
pm2 reload app # 0 秒停机滚动重启(平滑重启)
pm2 logs / pm2 monit # 日志与监控
  • 崩溃自动重启、负载均衡(cluster)、日志管理、开机自启。

CI/CD

面试题:CI/CD 是什么?

  • CI 持续集成:代码提交后自动跑 lint、测试、构建,尽早发现问题。
  • CD 持续部署/交付:构建通过后自动部署到测试/生产环境。

典型流程(GitHub Actions / GitLab CI):push → 安装依赖 → lint + 单测 → 构建 Docker 镜像 → 推送镜像仓库 → 部署(更新容器/K8s)。

优雅退出(重要)

面试题:服务更新/重启时如何不中断正在处理的请求?

监听退出信号,停止接收新请求,等存量请求处理完再退出(配合 PM2/K8s 滚动更新实现零停机)。

const server = app.listen(3000);

process.on("SIGTERM", () => {
console.log("收到 SIGTERM,开始优雅退出");
server.close(() => {
// 关闭数据库连接池、Redis 等
console.log("已关闭,进程退出");
process.exit(0);
});
// 兜底:超时强制退出
setTimeout(() => process.exit(1), 10000);
});

日志与监控

  • 结构化日志pino(性能高)、winston。分级(info/warn/error)、输出 JSON 便于采集。
  • 日志采集:ELK(Elasticsearch + Logstash + Kibana)/ Loki。
  • 错误监控:Sentry 捕获异常并告警。
  • 健康检查:暴露 /health 接口供 LB / K8s 探活(liveness / readiness probe)。