Node.js在CentOS上的最佳实践
小樊
34
2025-11-30 02:32:42
Node.js 在 CentOS 上的最佳实践
一 安装与版本管理
- 选择版本策略:生产环境优先使用Node.js LTS,兼顾稳定性与长期安全维护;开发/测试可灵活使用最新版本。
- 使用 NodeSource 仓库安装(示例为 16.x,可按需替换为 18.x/20.x):
sudo yum update -y
sudo yum install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_16.x | sudo -E bash -
sudo yum install -y nodejs
node -v && npm -v
- 使用 NVM 管理多版本(便于按项目切换):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
source ~/.bashrc
nvm install --lts
nvm use --lts
- 国内镜像加速(可选):npm config set registry https://registry.npmmirror.com(原淘宝源)。
二 进程管理与部署
- 使用 PM2 进行守护、集群与开机自启:
npm install pm2 -g
pm2 start app.js -i max --name my-app # -i max 按 CPU 核数启动工作进程
pm2 startup systemd -u # 生成 systemd 服务并开机自启
pm2 save
pm2 logs my-app
- 多实例与反向代理:多实例提升吞吐;在 Nginx 层做负载均衡与静态资源服务,降低 Node.js 进程压力。
- 健康检查与优雅停机:为进程配置就绪探针(如 /health),处理 SIGTERM 完成在途请求后再退出。
三 反向代理与安全加固
- Nginx 反向代理示例(HTTP/HTTPS 与 HTTP/2):
server {
listen 80; server_name example.com;
location / { proxy_pass http://127.0.0.1:3000; include proxy_params; }
}
server {
listen 443 ssl http2; server_name example.com;
ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem;
location / { proxy_pass http://127.0.0.1:3000; include proxy_params; }
}
- 关键安全要点:
- 仅开放必要端口(如 80/443),使用 firewalld/iptables 限制来源;
- 启用 TLS 1.2+,禁用弱加密套件;
- 设置安全响应头(如 X-Frame-Options、X-XSS-Protection、Strict-Transport-Security);
- 以非 root用户运行 Node.js(PM2 可配置用户);
- 对管理接口与敏感路由增加鉴权与限流。
四 性能与运行时优化
- 代码与运行时:
- 优先使用异步 I/O 与 Streams,避免阻塞事件循环;
- 优化数据库访问:合理索引、连接池、减少全表扫描;
- 合理使用内存缓存(如 node-cache)降低热点数据访问延迟;
- 启动参数示例:node --max-old-space-size=4096 app.js(按内存与业务调优);
- 充分利用多核:PM2 cluster 或 Node.js cluster 模块。
- 系统与网络:
- 保持系统与依赖及时更新;
- 适度优化内核网络参数(如 net.core.somaxconn、tcp_tw_reuse 等),并充分压测验证;
- 静态资源交由 Nginx 缓存与压缩,启用 HTTP/2;
- 使用 CDN 分发静态资源,减少源站压力。
五 监控 日志与故障排查
- 日志:统一接入 结构化日志(如 JSON),集中到文件或日志系统;PM2 日志轮转与保留策略要配置合理。
- 监控与告警:
- 基础资源监控(CPU、内存、磁盘 I/O、网络);
- 应用性能监控(如 Prometheus + Grafana 暴露指标,或 New Relic/AppDynamics 等 APM);
- 设置关键指标阈值与告警(如 5xx 比例、P95/P99 延迟、内存 OOM)。
- 诊断与剖析:
- 使用 node --inspect + Chrome DevTools 进行 CPU/内存分析;
- 使用 –prof 生成 V8 性能日志并结合 tick-processor 分析热点;
- 结合 clinic.js 等工具定位异步/数据库/内存瓶颈。