可以,多个 Node.js 项目完全可以在同一台阿里云服务器上部署。这是生产环境中非常常见的做法,关键在于做好端口隔离、进程管理、资源分配和运维监控。
以下是几种主流且推荐的部署方案:
✅ 推荐方案对比
| 方案 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
| PM2 + Nginx 反向X_X | 多项目、需高可用、易维护 | 进程守护、日志分离、自动重启、支持集群模式;Nginx 按域名/路径路由 | 需配置 app.js 或 ecosystem.config.js 区分项目;Nginx 配置正确避免冲突 |
| Docker + Docker Compose | 环境一致性要求高、微服务架构 | 容器隔离、依赖独立、一键部署、便于扩展 | 需掌握 Docker 基础;网络/卷权限需合理配置 |
| Systemd + 独立进程 | 简单单项目或少量项目 | 原生 Linux 管理、轻量 | 手动处理日志轮转、进程重启较繁琐 |
🔧 以 PM2 + Nginx 为例(最常用)
1. 安装 PM2
npm install -g pm2
pm2 startup # 生成 systemd 启动命令并执行
2. 每个项目单独配置(示例:ecosystem.config.js)
module.exports = {
apps: [
{
name: 'project-a',
script: './server.js',
instances: 2,
env: { NODE_ENV: 'production' },
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/home/user/logs/project-a-error.log',
out_file: '/home/user/logs/project-a-out.log'
},
{
name: 'project-b',
script: './index.js',
instances: 1,
env: { NODE_ENV: 'production' }
}
]
};
💡 每个项目可独立设置端口(如
3000,3001)、实例数、环境变量等。
3. 启动所有项目
pm2 start ecosystem.config.js
pm2 save # 保存当前状态,开机自启
pm2 list # 查看运行状态
4. Nginx 反向X_X配置(/etc/nginx/conf.d/multi-node.conf)
# project-a.example.com → localhost:3000
server {
listen 80;
server_name project-a.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
}
}
# api.project-b.example.com → localhost:3001
server {
listen 80;
server_name api.project-b.example.com;
location / {
proxy_pass http://localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
✅ 优势:统一 80/443 端口对外,内部项目互不干扰;支持 HTTPS(配合 Let’s Encrypt)。
⚠️ 关键注意事项
-
端口冲突
确保每个 Node 进程监听不同端口(可通过环境变量动态设置PORT=3000等)。 -
资源限制
- 使用
ulimit限制文件句柄数(避免EMFILE错误) - 在
/etc/security/limits.conf中调整:* soft nofile 65535 * hard nofile 65535 - 监控 CPU/内存:
htop、pm2 monit、Prometheus+Grafana
- 使用
-
安全加固
- 禁止 root 登录 SSH,改用密钥认证
- 仅开放必要端口(如 80/443),其他通过防火墙(
ufw或云盾安全组)限制 - 定期更新系统 & Node.js 版本(建议 LTS)
-
日志与备份
- PM2 自带日志管理,但建议配合
logrotate轮转大日志 - 数据库/静态文件单独备份策略
- PM2 自带日志管理,但建议配合
🌐 进阶建议
- 若项目间有共享依赖(如 Redis、MySQL),可使用 Docker Compose 编排服务层;
- 对于复杂架构,考虑 Kubernetes(ACK 托管版)实现自动化扩缩容;
- 使用阿里云 弹性伸缩(ESS) + 负载均衡(SLB) 提升可用性。
需要我为你生成一个完整的部署脚本模板(含 Nginx + PM2 + SSL 自动申请)吗?
CLOUD云枢