部署与运维(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.json再npm 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)。