Node.js 部署到云平台

开发完成的应用最终需要部署到服务器上才能被用户访问。云平台提供了便捷的基础设施,让开发者可以快速上线应用。本章将介绍 Node.js 应用部署到主流云平台的方法,包括准备工作、环境配置、进程管理以及安全考虑,帮助你将应用顺利发布到生产环境。

1. 部署前的准备

在部署之前,确保你的 Node.js 应用满足以下基本要求:

  • 端口监听:应用应该监听通过环境变量指定的端口(如 process.env.PORT),因为云平台通常动态分配端口。
  • 依赖管理:确保 package.json 完整,node_modules 不包含在版本控制中,部署时会自动安装。
  • 环境变量:所有敏感配置(数据库密码、API 密钥)都应通过环境变量注入,而不是硬编码。
  • 启动脚本:在 package.json 中定义 start 脚本,例如 "start": "node server.js",云平台会执行此命令。
  • 进程管理:建议使用 PM2 等工具确保应用崩溃后自动重启(尤其是在虚拟机部署时)。

2. 使用环境变量管理配置

在前面的章节中我们已经学习了环境变量的重要性。部署时,你需要将本地 .env 文件中的变量迁移到云平台的环境变量配置中。不同平台设置方式不同,但原理一致。

// 示例:从环境变量读取端口
const port = process.env.PORT || 3000;
app.listen(port);

3. 进程管理:PM2

如果你将应用部署到虚拟机(如 AWS EC2、阿里云 ECS),建议使用 PM2 管理进程。PM2 可以保持应用永久运行,并提供负载均衡和监控。安装 PM2:

npm install -g pm2

启动应用:

pm2 start server.js --name my-app

设置开机自启:

pm2 startup
pm2 save

4. 部署到 Heroku(PaaS 平台)

Heroku 是一个流行的 PaaS 平台,支持 Node.js 一键部署。步骤如下:

  1. 注册 Heroku 账号并安装 Heroku CLI。
  2. 在项目根目录创建 Procfile 文件(无扩展名),内容为:web: npm start
  3. 确保 package.json 中指定了 Node 版本(可选):"engines": { "node": "16.x" }
  4. 初始化 Git 仓库并提交代码:git init; git add .; git commit -m "init"
  5. 创建 Heroku 应用:heroku create your-app-name
  6. 设置环境变量:heroku config:set JWT_SECRET=your-secret DB_URL=mongodb://...
  7. 推送代码部署:git push heroku main
  8. 访问 https://your-app-name.herokuapp.com 查看应用。

Heroku 会自动检测 Node.js 应用,运行 npm installnpm start

5. 部署到 Linux 服务器(如 AWS EC2、阿里云 ECS)

这种方式给你更多的控制权,适合复杂的应用。以下是基本步骤:

5.1 连接服务器

使用 SSH 登录到服务器:

ssh user@your-server-ip

5.2 安装 Node.js 和 npm

推荐使用 NVM 安装:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
nvm install 18
nvm use 18

5.3 上传代码

可以使用 git clonescp 将代码传到服务器。例如:

git clone your-repo-url
cd your-repo

5.4 安装依赖

npm install

5.5 配置环境变量

创建 .env 文件或直接在系统环境变量中设置。例如:

echo "DB_URL=mongodb://..." >> .env

5.6 使用 PM2 启动应用

pm2 start server.js --name my-app
pm2 save
pm2 startup

5.7 配置反向代理(Nginx)

为了让外界通过域名访问,并处理 SSL,通常使用 Nginx 反向代理。安装 Nginx:

sudo apt update && sudo apt install nginx

创建 Nginx 配置文件(/etc/nginx/sites-available/my-app):

server {
    listen 80;
    server_name 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;
    }
}

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

6. 使用 Docker 容器化部署

Docker 可以打包应用及其环境,确保在不同平台运行一致。首先编写 Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

然后构建镜像并运行容器:

docker build -t my-app .
docker run -p 3000:3000 -e DB_URL=mongodb://... --name my-app -d my-app

可以使用 Docker Compose 管理多容器应用(如应用 + 数据库)。之后可以将镜像推送到容器注册中心(如 Docker Hub),并在云主机上拉取运行,或使用容器托管服务(如 AWS ECS、阿里云容器服务)。

7. 持续集成与持续部署 (CI/CD)

自动化部署可以提高效率,减少人为错误。GitHub Actions 是一个常用工具。以下是一个将应用部署到阿里云 ECS 的示例工作流:

# .github/workflows/deploy.yml
name: Deploy to Server
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Deploy via SSH
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /path/to/app
            git pull origin main
            npm install
            pm2 reload my-app

将服务器的 SSH 私钥和主机信息保存在 GitHub Secrets 中,即可实现代码推送后自动部署。

8. 安全注意事项

  • 使用非 root 用户运行应用:避免使用 root 权限启动 Node.js 进程。
  • 防火墙配置:只开放必要端口(如 80、443、22),数据库端口(如 27017)不要暴露公网。
  • 环境变量安全:不要在代码中明文存储密钥,使用云平台的密钥管理服务或环境变量。
  • 定期更新依赖:使用 npm audit 检查漏洞。
  • 启用 HTTPS:使用 Let's Encrypt 获取免费 SSL 证书,并通过 Nginx 配置。
  • 限制上传文件大小:防止 DoS 攻击。

9. 监控与日志

部署后需要监控应用状态。PM2 自带监控命令 pm2 monit,也可以集成第三方服务如 Sentry、Logtail 等。日志管理也很重要,可以使用 PM2 日志模块或集中式日志系统(如 ELK)。

小结

本章介绍了将 Node.js 应用部署到云平台的多种方式,从 Heroku 的简单部署到 Linux 服务器的手动配置,再到 Docker 容器化和 CI/CD 自动化。选择哪种方式取决于你的应用复杂性、团队规模和运维能力。遵循安全最佳实践,结合监控和日志,可以让你的应用在生产环境中稳定运行。下一章我们将讨论性能优化策略。