将 Node.js 项目部署到云服务器(如阿里云 ECS、腾讯云 CVM、AWS EC2 等)的完整流程通常包含以下关键步骤。以下以 Linux 服务器(Ubuntu/Debian) 为例,采用 PM2 作为进程管理器(生产环境推荐方案),并涵盖从基础准备到持续优化的全流程:
✅ 一、前期准备
-
购买并配置云服务器
- 选择操作系统(推荐 Ubuntu 20.04+ 或 CentOS 7+)
- 开放必要端口(默认 SSH 22,Web 服务 80/443,Node 调试端口等)
- 配置安全组/防火墙规则(仅开放所需端口)
-
本地项目准备
- 确保
package.json中start脚本正确(如"start": "node app.js"或"start": "pm2 start server.js") - 检查环境变量(
.env文件应通过环境变量注入,不要硬编码敏感信息) - 测试本地运行:
npm install && npm start
- 确保
✅ 二、上传代码到服务器
方法 A:Git 拉取(推荐)
# 在服务器上初始化仓库或克隆已有项目
git clone <your-repo-url> /var/www/my-node-app
cd /var/www/my-node-app
git checkout main # 或对应分支
方法 B:SCP/SFTP 上传
# 本地执行
scp -r ./dist/* user@your-server-ip:/var/www/my-node-app/
# 或打包后传输
tar czf project.tar.gz . && scp project.tar.gz user@server:/tmp/
ssh user@server 'cd /var/www && tar xzf /tmp/project.tar.gz'
💡 建议:使用
.gitignore排除node_modules、logs、.env等,避免重复上传。
✅ 三、安装依赖与运行时环境
-
安装 Node.js & npm
# 推荐用 nvm 管理版本(避免系统冲突) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc nvm install --lts nvm use --lts node -v && npm -v -
安装 PM2(进程管理器)
sudo npm install -g pm2 -
安装项目依赖
cd /var/www/my-node-app npm ci # 优先使用 package-lock.json,保证一致性 # 或 npm install --production -
配置环境变量
- 创建
.env文件(不提交到 Git)或使用系统级环境变量 - 示例:
nano /var/www/my-node-app/.envNODE_ENV=production PORT=3000 DB_HOST=localhost DB_USER=root DB_PASS=your_secure_password JWT_SECRET=your_jwt_secret_key - 启动时由 PM2 自动加载(需配置
ecosystem.config.js,见下文)
- 创建
✅ 四、配置并启动应用(PM2)
-
创建 PM2 配置文件(推荐方式)
// ecosystem.config.js module.exports = { apps: [{ name: 'my-node-app', script: './app.js', instances: 2, // 多实例负载均衡(可选) exec_mode: 'cluster',// 或 'fork' env: { NODE_ENV: 'production', PORT: 3000 }, env_production: { NODE_ENV: 'production', DB_HOST: process.env.DB_HOST, // ...其他 prod 变量 } }] }; -
启动应用
pm2 start ecosystem.config.js pm2 save # 保存配置,开机自启 pm2 startup # 生成 systemd 命令并执行(根据提示操作) -
查看状态
pm2 list pm2 logs my-node-app pm2 monit # 实时监控资源
✅ 五、反向X_X与 HTTPS(Nginx + Let’s Encrypt)
⚠️ 直接暴露 Node 端口不安全,必须通过 Nginx 做反向X_X
-
安装 Nginx
sudo apt update && sudo apt install nginx certbot python3-certbot-nginx -y -
配置 Nginx 站点
# /etc/nginx/sites-available/my-node-app server { listen 80; server_name your-domain.com www.your-domain.com; location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } # WebSocket 支持(如需) location /ws { proxy_pass http://localhost:3000/ws; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; } } -
启用并测试配置
sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx -
申请免费 SSL 证书
sudo certbot --nginx -d your-domain.com -d www.your-domain.com # 按提示输入邮箱,自动配置重定向和证书更新 -
验证访问
- 浏览器访问
https://your-domain.com - 检查日志:
sudo tail -f /var/log/nginx/access.log
- 浏览器访问
✅ 六、监控与运维优化
| 工具 | 用途 |
|---|---|
| PM2 | 进程管理、日志、重启、扩容 |
| Nginx | 反向X_X、静态文件缓存、限流 |
| Supervisor/Systemd | 替代 PM2 的系统级守护(可选) |
| Prometheus + Grafana | 指标采集与可视化监控 |
| ELK / Loki | 集中式日志管理 |
| Uptime Kuma / Pingdom | 外部可用性监控 |
✅ 定期维护建议:
- 设置自动更新证书:
certbot renew --dry-run(实际每月自动运行) - 配置日志轮转:
logrotate处理 Nginx/PM2 日志 - 备份数据库与重要数据(配合 cron 定时任务)
🔁 七、CI/CD 自动化(进阶)
结合 GitHub Actions / GitLab CI 实现自动部署:
# .github/workflows/deploy.yml
name: Deploy to Server
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_IP }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/my-node-app
git pull origin main
npm ci --production
pm2 restart my-node-app
📌 注意事项
- ❗ 永远不要在代码中明文存储密码/API Key
- ❗ 生产环境禁用
NODE_ENV=development - ❗ 限制服务器资源(CPU/内存),防止 DDoS 攻击
- ✅ 使用 Docker 可进一步提升可移植性与隔离性(适合复杂场景)
需要我提供:
- 完整的
ecosystem.config.js模板? - Dockerfile + docker-compose.yml 部署方案?
- 特定云厂商(阿里云/腾讯云/AWS)的专属配置指南?
欢迎告诉我你的具体需求,我可以进一步定制! 🚀
云服务器