在 CentOS 上用 Node.js 落地自动化运维
一 基础环境与安全加固
- 安装 Node.js 与包管理
- 推荐用 nvm 管理版本:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash && source ~/.bashrc && nvm install --lts && npm i -g pm2 yarn
- 或采用 NodeSource 仓库安装(示例为 Node.js 16):curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - && sudo yum install -y nodejs npm
- 防火墙放行
- CentOS 使用 firewalld:sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload
- 安全基线
- 禁用 root SSH 登录,使用普通用户 + sudo;开启 SSH 密钥 登录;仅开放必要端口(如 22/80/443/3000)
二 进程管理与自恢复
- 使用 PM2 托管 Node.js 进程
- 启动与守护:pm2 start app.js --name “my-api”;pm2 list;pm2 logs;pm2 monit
- 零停机与自恢复:pm2 reload all;pm2 startup(生成开机自启命令,按提示执行);pm2 save
- 生产优化:pm2 start app.js -i max(集群模式);pm2 start app.js --max-memory-restart 512M
- 日志轮转:pm2 install pm2-logrotate;pm2 set pm2-logrotate:max_size 10M;pm2 set pm2-logrotate:retain 7
三 自动化部署方案
- 方案 A Git Hooks 轻量自动部署(服务器侧)
- 创建裸仓库:git init --bare /var/repo/myapp.git
- 编写钩子 /var/repo/myapp.git/hooks/post-receive(示例)
- #!/usr/bin/env bash
set -e
WORK_TREE=/var/www/myapp/releases/$(date +%Y%m%d%H%M%S)
mkdir -p “$WORK_TREE”
git --git-dir=/var/repo/myapp.git --work-tree=“$WORK_TREE” checkout -f
ln -sfn “$WORK_TREE” /var/www/myapp/current
chown -R myapp:myapp /var/www/myapp
重启服务(见下一节 systemd)
systemctl --user restart myapp || sudo systemctl restart myapp
echo “$(date): deployed $WORK_TREE” >> /var/log/myapp-deploy.log
- 客户端推送触发:git remote add prod root@server:/var/repo/myapp.git && git push prod main
- 方案 B GitHub Webhooks(Node.js 服务监听)
- 服务端监听脚本 deploy.js(使用 github-webhook-handler)
- const http = require(‘http’); const createHandler = require(‘github-webhook-handler’);
const handler = createHandler({ path: ‘/autodeploy’, secret: ‘YOUR_SECRET’ });
http.createServer((req,res)=>handler(req,res,()=>res.end(‘404’))).listen(7777);
handler.on(‘push’, (e)=>{ /* 执行 git pull / npm install / 重启服务 */ });
- GitHub 仓库 Webhooks 配置:Payload URL(http://your-domain/autodeploy)、Content type(application/json)、Secret(与代码一致)
- 方案 C 远程 CI/CD(GitHub Actions 示例)
- 使用 ssh-action 执行远程命令:git pull、yarn/npm install --production、pm2 reload all
- 适合多机、多环境、审批与回滚流程
四 反向代理与发布编排
- Nginx 反向代理与健康检查
- /etc/nginx/conf.d/myapp.conf
- server { listen 80; server_name _;
location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ‘upgrade’; }
location /healthz { access_log off; return 200 “OK”; } }
- 语法检查与生效:nginx -t && systemctl reload nginx
- systemd 托管 Node 服务(/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=myapp; Environment=NODE_ENV=production
- [Install] WantedBy=multi-user.target
- 启用:systemctl daemon-reload && systemctl enable --now myapp;查看日志:journalctl -u myapp -f
五 监控告警与可观测性
- 进程与应用监控
- PM2 内置监控:pm2 monit;日志集中:pm2 logs;结合 pm2-logrotate 控制日志体积与保留
- 指标与告警:接入 PM2 Keymetrics 或自建 Prometheus + Grafana(Node Exporter + 应用指标暴露)
- 系统层诊断
- 动态追踪与排障:strace -p -v -s 2048;性能分析可用 perf/systemtap/eBPF 等工具
- 告警落地
- 结合日志关键字、HTTP 健康检查失败、进程异常退出、内存阈值等触发 企业微信/钉钉/Slack 告警(通过脚本或 webhook 推送)