温馨提示×

centos nodejs如何实现自动化运维

小樊
32
2025-12-11 12:46:31
栏目: 编程语言

在 CentOS 上落地 Node.js 自动化运维,建议从部署交付进程与自启日志与监控告警安全加固四个维度构建闭环,既满足日常快速迭代,又兼顾生产稳定性与可观测性。

一 整体架构与工具选型

  • 代码交付:优先使用Git 推送触发的轻量 CI/CD(服务器侧 Git Hooks 或 GitHub Webhooks),也可用 GitHub Actions/GitLab CI 做云端构建与远程部署。
  • 运行托管:用 PM2systemd 守护进程,前者上手快、生态完善,后者系统原生、可控性强。
  • 反向代理与发布:用 Nginx 做反向代理与健康检查,配合时间戳版本目录 + 软链 current 实现零停机发布与快速回滚。
  • 日志与监控:应用内用 Winston/Bunyan 做结构化日志;系统/进程用 PM2 日志与监控;业务与性能用 Prometheus + Grafana 可视化与告警。

二 自动化部署流水线

  • 方案A 服务器侧 Git Hooks(轻量、无外部依赖)
    1. 创建裸仓库与发布目录
      • mkdir -p /var/repo/myapp.git && cd $_
      • git init --bare
      • mkdir -p /var/www/myapp/releases
    2. 配置 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” 防止并发部署
    3. 客户端推送触发
      • git remote add prod root@server:/var/repo/myapp.git
      • git push prod main
  • 方案B GitHub Webhooks(Node.js 服务监听)
    1. 在仓库 Webhooks 设置 Payload URL(如 https://your-domain.com/autodeploy)与 Secret
    2. 服务器用 Node.js 接收并校验签名后执行部署脚本(github-webhook-handler + child_process 执行 shell)。
    3. 建议前置 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 管理并按项目锁定版本。

0