在 CentOS 上落地 Node.js 自动化运维,建议从部署交付、进程与自启、日志与监控告警、安全加固四个维度构建闭环,既满足日常快速迭代,又兼顾生产稳定性与可观测性。
一 整体架构与工具选型
- 代码交付:优先使用Git 推送触发的轻量 CI/CD(服务器侧 Git Hooks 或 GitHub Webhooks),也可用 GitHub Actions/GitLab CI 做云端构建与远程部署。
- 运行托管:用 PM2 或 systemd 守护进程,前者上手快、生态完善,后者系统原生、可控性强。
- 反向代理与发布:用 Nginx 做反向代理与健康检查,配合时间戳版本目录 + 软链 current 实现零停机发布与快速回滚。
- 日志与监控:应用内用 Winston/Bunyan 做结构化日志;系统/进程用 PM2 日志与监控;业务与性能用 Prometheus + Grafana 可视化与告警。
二 自动化部署流水线
- 方案A 服务器侧 Git Hooks(轻量、无外部依赖)
- 创建裸仓库与发布目录
- mkdir -p /var/repo/myapp.git && cd $_
- git init --bare
- mkdir -p /var/www/myapp/releases
- 配置 post-receive 钩子(带并发锁与版本清理)
- 文件路径:/var/repo/myapp.git/hooks/post-receive
- 示例要点:
- GIT_WORK_TREE=/var/www/myapp/releases/v$(date +%Y%m%d%H%M%S) git --git-dir=/var/repo/myapp.git checkout -f
- ln -sfn $GIT_WORK_TREE /var/www/myapp/current
- 历史保留最近 3 个版本:find /var/www/myapp/releases -maxdepth 1 -type d -mtime +3 -exec rm -rf {} ;
- 重启服务:systemctl restart myapp
- 记录日志:echo “$(date): Deployed” >> /var/log/myapp-deploy.log
- 并发控制:在钩子开头加 flock -n /tmp/myapp-deploy.lock -c “exec $0” 防止并发部署
- 客户端推送触发
- git remote add prod root@server:/var/repo/myapp.git
- git push prod main
- 方案B GitHub Webhooks(Node.js 服务监听)
- 在仓库 Webhooks 设置 Payload URL(如 https://your-domain.com/autodeploy)与 Secret。
- 服务器用 Node.js 接收并校验签名后执行部署脚本(github-webhook-handler + child_process 执行 shell)。
- 建议前置 Nginx 反向代理到 80/443,便于证书管理与防火墙策略统一。
三 进程托管与自启动
- PM2 方式(推荐上手)
- 安装与启动:npm i -g pm2;pm2 start app.js --name myapp --watch --max-memory-restart 200M
- 开机自启:pm2 startup → 按提示执行生成的命令;pm2 save 持久化进程列表
- 常用:pm2 list、pm2 logs myapp、pm2 monit、pm2 restart/stop/delete myapp
- systemd 方式(系统原生)
- 服务文件:/etc/systemd/system/myapp.service
- [Unit] Description=MyApp Node.js Service;After=network.target
- [Service] ExecStart=/usr/bin/node /var/www/myapp/current/app.js;WorkingDirectory=/var/www/myapp/current;Restart=always;User=nodejs;Environment=NODE_ENV=production
- [Install] WantedBy=multi-user.target
- 启用:systemctl daemon-reload;systemctl enable --now myapp
- 日志:journalctl -u myapp -f
- 发布配合
- 采用 /var/www/myapp/releases/v{timestamp} + /var/www/myapp/current 软链;部署完成后再重启服务,实现原子切换与快速回滚。
四 日志与监控告警
- 应用日志
- 结构化日志:使用 Winston/Bunyan 输出 JSON 到文件与控制台,便于检索与聚合。
- 示例(Winston):
- const winston = require(‘winston’);
- const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ })
]
});
- 指标与可视化
- 使用 prom-client 暴露 /metrics,采集请求时延、活跃请求、内存/事件循环等指标;Prometheus 抓取,Grafana 配置面板与阈值告警。
- 进程与系统监控
- PM2 自带日志轮转与监控命令(pm2 logs/monit),配合 pm2-logrotate 做按大小/保留天数切割。
- 系统层面用 top/htop、vmstat、iostat、free、df 排查资源瓶颈;必要时引入 New Relic/Datadog 做 APM 与全链路观测。
五 安全与运维规范
- 最小权限与系统加固
- 创建专用运行用户(如 nodejs),服务以该用户运行;SSH 禁用 root 登录与密码认证,改用 SSH 密钥;按需开启 firewalld 放行 22/80/443。
- 证书与域名
- 使用 Let’s Encrypt 为域名签发免费 HTTPS 证书,配置自动续期(certbot renew --dry-run 验证)。
- 发布与回滚
- 采用时间戳版本目录 + 软链策略;保留最近 N 个版本;部署脚本记录变更日志与回滚步骤;必要时灰度/蓝绿切换。
- 依赖与构建一致性
- 生产环境优先使用 npm ci --production 保证依赖一致性;Node 版本建议用 nvm 管理并按项目锁定版本。